diff --git a/.github/dependabot.yml b/.github/dependabot.yml
index dabf854a128..3bd44b0188f 100644
--- a/.github/dependabot.yml
+++ b/.github/dependabot.yml
@@ -39,7 +39,6 @@ updates:
commit-message:
prefix: "chore"
include: "scope"
-
- package-ecosystem: "pub"
directory: "/packages/scanner/mlkit/"
diff --git a/.github/labeler.yml b/.github/labeler.yml
index dd70a37ee65..4fca91ccd05 100644
--- a/.github/labeler.yml
+++ b/.github/labeler.yml
@@ -15,7 +15,11 @@ Assets cache:
- changed-files:
- any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_manager.dart'
- any-glob-to-any-file: 'packages/smooth_app/lib/pages/offline_tasks_page.dart'
-
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_crop.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_image.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_upload.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_add_price.dart'
+
📚 Documentation:
- changed-files:
- any-glob-to-any-file: 'README.md'
@@ -59,7 +63,6 @@ Web:
- any-glob-to-any-file: 'packages/smooth_app/test/widget_test.dart'
- any-glob-to-any-file: 'packages/smooth_app/test/basic_test.dart'
- any-glob-to-any-file: 'packages/scanner/shared/test/shared_test.dart'
- - any-glob-to-any-file: 'packages/smooth_app/test/cache/cache_test.dart'
- any-glob-to-any-file: 'packages/smooth_app/integration_test/app_test.dart'
- any-glob-to-any-file: 'packages/data_importer/test/data_importer_test.dart'
- any-glob-to-any-file: 'packages/scanner/mlkit/test/scanner_mlkit_test.dart'
@@ -226,6 +229,9 @@ Generic lib:
🖼️ Photos - Cropping:
- changed-files:
- any-glob-to-any-file: 'packages/smooth_app/lib/pages/image_crop_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/crop_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_crop.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/product_image_crop_button.dart'
User lists:
- changed-files:
@@ -234,13 +240,49 @@ User lists:
Product scan carousel:
- changed-files:
- - any-glob-to-any-file: 'packages/smooth_app/lib/widgets/smooth_product_carousel.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/scan/carousel/scan_carousel.dart'
✏️ Editing - 📦 Packaging input:
- changed-files:
- any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/edit_new_packagings.dart'
- any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/ocr_packaging_helper.dart'
+OCR page:
+- changed-files:
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_main_action.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/edit_ocr/edit_ocr_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/edit_ocr/ocr_ingredients_helper.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/edit_ocr/ocr_packaging_helper.dart'
+
✏️ Editing - Basic info input:
- changed-files:
- any-glob-to-any-file: 'packages/smooth_app/lib/pages/product/add_basic_details_page.dart'
+
+Prices:
+- changed-files:
+ - any-glob-to-any-file: 'packages/smooth_app/lib/background/background_task_add_price.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/data_models/location_list_supplier.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/database/dao_osm_location.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/locations/location_map_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/locations/search_location_preloaded_item.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/get_prices_model.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_amount_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_amount_field.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_button.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_count_widget.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_currency_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_currency_selector.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_data_widget.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_date_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_location_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_model.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_product_widget.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/prices_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/price_proof_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/prices_card.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/prices/product_price_add_page.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/onboarding/currency_selector.dart'
+ - any-glob-to-any-file: 'packages/smooth_app/lib/pages/onboarding/currency_selector_helper.dart'
+
+
+
diff --git a/.github/workflows/auto-assign-pr.yml b/.github/workflows/auto-assign-pr.yml
index 762822923e9..a41dafbdb97 100644
--- a/.github/workflows/auto-assign-pr.yml
+++ b/.github/workflows/auto-assign-pr.yml
@@ -16,5 +16,5 @@ jobs:
assign-author:
runs-on: ubuntu-latest
steps:
- - uses: toshimaru/auto-author-assign@v2.1.0
+ - uses: toshimaru/auto-author-assign@v2.1.1
diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml
index 0756430efb3..8718d5b05ea 100644
--- a/.github/workflows/crowdin.yml
+++ b/.github/workflows/crowdin.yml
@@ -13,7 +13,7 @@ jobs:
uses: actions/checkout@v4
- name: crowdin action
- uses: crowdin/github-action@v1.20.2
+ uses: crowdin/github-action@v2.0.0
continue-on-error: true
with:
# Upload sources to Crowdin
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3b478ea3793..77f83067321 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,80 @@
# Changelog
+## [4.15.0](https://github.com/openfoodfacts/smooth-app/compare/v4.14.0...v4.15.0) (2024-06-28)
+
+
+### Features
+
+* 5 new icons: chicken / fish / milk / soda happy / soda unhappy ([#5268](https://github.com/openfoodfacts/smooth-app/issues/5268)) ([74cf6c6](https://github.com/openfoodfacts/smooth-app/commit/74cf6c6a2349c5eaa3a599a4556e10aadf39a505))
+* 5079 - new deeplink to the Country Eco-Score ([#5152](https://github.com/openfoodfacts/smooth-app/issues/5152)) ([2ee3cd8](https://github.com/openfoodfacts/smooth-app/commit/2ee3cd840551bc9cc90668b75315cb7cf9b11c67))
+* 5095 - matomo anonymous visitor id now starts with a persistent letter ([#5107](https://github.com/openfoodfacts/smooth-app/issues/5107)) ([f1d0992](https://github.com/openfoodfacts/smooth-app/commit/f1d09923cc0c1c24d6248c4bbc2e34f1eb7469fc))
+* 5099 - new dev mode item to refresh all the products from the server ([#5100](https://github.com/openfoodfacts/smooth-app/issues/5100)) ([c6077dc](https://github.com/openfoodfacts/smooth-app/commit/c6077dce33609e06cd69993cb949d258766d8da5))
+* 5128 - visible dates on raw image grid items ([#5144](https://github.com/openfoodfacts/smooth-app/issues/5144)) ([1922d39](https://github.com/openfoodfacts/smooth-app/commit/1922d39f073c813dde606f9254ca4453279eb56c))
+* 5191 - knowledge panel image card now clickable ([#5220](https://github.com/openfoodfacts/smooth-app/issues/5220)) ([db20b51](https://github.com/openfoodfacts/smooth-app/commit/db20b51cb6dc968a87af2d48956a53fbbdc9536e))
+* 5195 - location search, as a preliminary step ([#5274](https://github.com/openfoodfacts/smooth-app/issues/5274)) ([5a95ca6](https://github.com/openfoodfacts/smooth-app/commit/5a95ca688a99f2e1bb9ac0c7a4718b50227ab2bb))
+* 5195 - new "add one product price" page with background task ([#5292](https://github.com/openfoodfacts/smooth-app/issues/5292)) ([db223b5](https://github.com/openfoodfacts/smooth-app/commit/db223b5db58039d24b6cade67b1ad4a79f8c57bd))
+* 5197 - first product price page ([#5271](https://github.com/openfoodfacts/smooth-app/issues/5271)) ([004ec9c](https://github.com/openfoodfacts/smooth-app/commit/004ec9c411027c9890917d563d970db4d6e1eb5b))
+* 5198 - added a local "latest prices" page ([#5351](https://github.com/openfoodfacts/smooth-app/issues/5351)) ([39c9c43](https://github.com/openfoodfacts/smooth-app/commit/39c9c434b9ebc5a2aef2a85309eb9b8a5ca30a76))
+* 5200 - currency selector ([#5236](https://github.com/openfoodfacts/smooth-app/issues/5236)) ([e3f01ce](https://github.com/openfoodfacts/smooth-app/commit/e3f01ce061b1df91bcdefdc995f4f70c754051a6))
+* 5201 - change currency with country when relevant ([#5238](https://github.com/openfoodfacts/smooth-app/issues/5238)) ([5f7966c](https://github.com/openfoodfacts/smooth-app/commit/5f7966c7f880611d5114876ada463f189cd473b0))
+* 5203 - "add receipt" and "add price tags", even offline or not found ([#5392](https://github.com/openfoodfacts/smooth-app/issues/5392)) ([b9f83c4](https://github.com/openfoodfacts/smooth-app/commit/b9f83c414073e5a0c42b86f3226d6e2ee3c50bad))
+* 5204 - multi-product price addition ([#5375](https://github.com/openfoodfacts/smooth-app/issues/5375)) ([b300955](https://github.com/openfoodfacts/smooth-app/commit/b3009557eca4aba1f184aac1abd56250e36c5067))
+* 5204 - preliminary step for multi-product price addition ([#5367](https://github.com/openfoodfacts/smooth-app/issues/5367)) ([7bf53e8](https://github.com/openfoodfacts/smooth-app/commit/7bf53e894dba429dc9e7ba8d0f2dca4176fd6181))
+* 5205 - added 4 links to prices app ([#5329](https://github.com/openfoodfacts/smooth-app/issues/5329)) ([27259c0](https://github.com/openfoodfacts/smooth-app/commit/27259c0b3c271e30fd299d114ac5ff389f78263f))
+* 5205 - added a "My prices" item linking to the web app ([#5317](https://github.com/openfoodfacts/smooth-app/issues/5317)) ([722c2f4](https://github.com/openfoodfacts/smooth-app/commit/722c2f498d6dbc8190ee9c50def38e9ffc3799c6))
+* 5205 - new "my prices" page ([#5347](https://github.com/openfoodfacts/smooth-app/issues/5347)) ([13072eb](https://github.com/openfoodfacts/smooth-app/commit/13072eb0864d79a5e9775ef42de6fe618816edc0))
+* 5207 - new "My proofs" and "Proof" pages ([#5389](https://github.com/openfoodfacts/smooth-app/issues/5389)) ([4fbf020](https://github.com/openfoodfacts/smooth-app/commit/4fbf0203acb366f6d797b20a4b22f3a2c3a89523))
+* 5301 - added an erasing tool for proofs ([#5341](https://github.com/openfoodfacts/smooth-app/issues/5341)) ([036bda1](https://github.com/openfoodfacts/smooth-app/commit/036bda1fec0371b690b8e4488a5626439bc3c24c))
+* 5301 - price proofs can be cropped and will be displayed ([#5305](https://github.com/openfoodfacts/smooth-app/issues/5305)) ([529fe8f](https://github.com/openfoodfacts/smooth-app/commit/529fe8f5e1e18e9b52782e66e6dd8072f2fed11b))
+* 5318 - added a "price privacy warning" dialog ([#5343](https://github.com/openfoodfacts/smooth-app/issues/5343)) ([e94d61f](https://github.com/openfoodfacts/smooth-app/commit/e94d61fa11ef9e210147f91034431296180a87b7))
+* 5323 - generic way to display product images, with timestamp ([#5333](https://github.com/openfoodfacts/smooth-app/issues/5333)) ([c26528c](https://github.com/openfoodfacts/smooth-app/commit/c26528c9b9a9243800180ade71ac4f5b9b79db6e))
+* 5352 - now opening the related product price page from count button ([#5353](https://github.com/openfoodfacts/smooth-app/issues/5353)) ([536eae4](https://github.com/openfoodfacts/smooth-app/commit/536eae48b1d780e9d77d08c101dec271f32300fd))
+* A feedback form for the prices page ([#5442](https://github.com/openfoodfacts/smooth-app/issues/5442)) ([b110334](https://github.com/openfoodfacts/smooth-app/commit/b110334c3d577683969270baddae6e6d9ad9046b))
+* Add NutriScore V2 into cache + semantics ([#5264](https://github.com/openfoodfacts/smooth-app/issues/5264)) ([d2d8d0a](https://github.com/openfoodfacts/smooth-app/commit/d2d8d0a6df41da1551f9728808b5da8194ef1c08))
+* added deeplinking for the sign up page [#4169](https://github.com/openfoodfacts/smooth-app/issues/4169) ([#5332](https://github.com/openfoodfacts/smooth-app/issues/5332)) ([2e44edb](https://github.com/openfoodfacts/smooth-app/commit/2e44edb5669eedfb8331d6b7fd06a8dacc2172be))
+* Better error message for search screen ([#5298](https://github.com/openfoodfacts/smooth-app/issues/5298)) ([4b6ed1e](https://github.com/openfoodfacts/smooth-app/commit/4b6ed1e8b66e64d0af7a49f7f3ae13afab35c28a))
+* Crop page: increase paddings ([#5279](https://github.com/openfoodfacts/smooth-app/issues/5279)) ([ebb90b1](https://github.com/openfoodfacts/smooth-app/commit/ebb90b171a87657b7ab6ac5f8aefca74211908ea))
+* currency symbols ([#5311](https://github.com/openfoodfacts/smooth-app/issues/5311)) ([4db1d6c](https://github.com/openfoodfacts/smooth-app/commit/4db1d6c25cbb4b2f4b2b24c201987d4eb9066536))
+* Custom domain + environment support for the TagLine ([#5364](https://github.com/openfoodfacts/smooth-app/issues/5364)) ([08071d2](https://github.com/openfoodfacts/smooth-app/commit/08071d273b048753b1a1c1d9ada51d224c60873c))
+* Extract ingredients/packaging: loading / loaded / extracting states ([#5384](https://github.com/openfoodfacts/smooth-app/issues/5384)) ([65ce9c4](https://github.com/openfoodfacts/smooth-app/commit/65ce9c45ce40ab6f2caa7dfadc57be4092174e37))
+* Guide for Nutri-Score V2 ([#5273](https://github.com/openfoodfacts/smooth-app/issues/5273)) ([dbd23f5](https://github.com/openfoodfacts/smooth-app/commit/dbd23f50f8b3a00974ffd37bf3ce491b41aad9b1))
+* Improve photo gallery accessibility + internationalization ([#5366](https://github.com/openfoodfacts/smooth-app/issues/5366)) ([64d38f1](https://github.com/openfoodfacts/smooth-app/commit/64d38f17dafb715499857fc4611bb3f25cdbb524))
+* Inject all colors from palette in an extension ([#5267](https://github.com/openfoodfacts/smooth-app/issues/5267)) ([f9797bc](https://github.com/openfoodfacts/smooth-app/commit/f9797bc8325f9300954cf0cbfb9f7d6aed8c4cac))
+* Knowledge Panel details page accessibility improvements ([#5290](https://github.com/openfoodfacts/smooth-app/issues/5290)) ([44e4774](https://github.com/openfoodfacts/smooth-app/commit/44e47749367d74b7b9cf19a795a848f6e9471b88))
+* OCR: Better explain why the photo is still loading ([#5426](https://github.com/openfoodfacts/smooth-app/issues/5426)) ([ad9c06e](https://github.com/openfoodfacts/smooth-app/commit/ad9c06eaf8d69989afde97181ef5ac1c885161f5))
+* prices - barcode reader for additional products ([#5381](https://github.com/openfoodfacts/smooth-app/issues/5381)) ([35a4ab0](https://github.com/openfoodfacts/smooth-app/commit/35a4ab03c027406af6946ed024f7d53c3e86d322))
+* prices - top contributors now within the app ([#5383](https://github.com/openfoodfacts/smooth-app/issues/5383)) ([7809854](https://github.com/openfoodfacts/smooth-app/commit/780985462a773ca63fd7db8ed101541347fd3441))
+* Snap scrolling for guides ([#5283](https://github.com/openfoodfacts/smooth-app/issues/5283)) ([8338e90](https://github.com/openfoodfacts/smooth-app/commit/8338e90aac218441e168c376db3fd105b50e8324))
+* Spellchecker for OCR screens ([#5409](https://github.com/openfoodfacts/smooth-app/issues/5409)) ([f6ec9df](https://github.com/openfoodfacts/smooth-app/commit/f6ec9dfee59f2a622ee109eea90f1b504dfddf3d))
+* Tagline V3 ([#5350](https://github.com/openfoodfacts/smooth-app/issues/5350)) ([41abf73](https://github.com/openfoodfacts/smooth-app/commit/41abf730fe09139ee68ce765eff00a72f47d9999))
+
+
+### Bug Fixes
+
+* `ThemeProvider` properly resync the theme ([#5363](https://github.com/openfoodfacts/smooth-app/issues/5363)) ([b5b308c](https://github.com/openfoodfacts/smooth-app/commit/b5b308c99d8d73ac7218efd82c839a00348454b5))
+* 2 bugfixes for the tagline (empty content + image in error) ([#5421](https://github.com/openfoodfacts/smooth-app/issues/5421)) ([4deb0b4](https://github.com/openfoodfacts/smooth-app/commit/4deb0b42a47db7dee4cb8025a20ad3e6c29fed03))
+* 4957 - SVG icons are now correctly refreshed when their URL change ([#5133](https://github.com/openfoodfacts/smooth-app/issues/5133)) ([6ac205c](https://github.com/openfoodfacts/smooth-app/commit/6ac205cc4b8adb8c49a1cbb5a4c31a20edfbe983))
+* 5102 - fixed the path of the database to backup ([#5103](https://github.com/openfoodfacts/smooth-app/issues/5103)) ([cd563f5](https://github.com/openfoodfacts/smooth-app/commit/cd563f5d12627f86d253d6d6737a6d9b83342147))
+* 5104 - fixed the position of the "Failed lookup" string ([#5105](https://github.com/openfoodfacts/smooth-app/issues/5105)) ([98de444](https://github.com/openfoodfacts/smooth-app/commit/98de4446344d825aa9aae5ee397c65b4ec16da44))
+* 5121 - more relevant choice of nutrients to display (edit page) ([#5150](https://github.com/openfoodfacts/smooth-app/issues/5150)) ([3217dfe](https://github.com/openfoodfacts/smooth-app/commit/3217dfe63e6cd51cc98b599c327694a936ab81ed))
+* 5145 - bold style for unknown ingredients in KP ([#5149](https://github.com/openfoodfacts/smooth-app/issues/5149)) ([0e3eee2](https://github.com/openfoodfacts/smooth-app/commit/0e3eee2c3ed2aa6482a3287005f5fa58a7223576))
+* 5217 - no check on cookie as it's always null ([#5222](https://github.com/openfoodfacts/smooth-app/issues/5222)) ([d744fab](https://github.com/openfoodfacts/smooth-app/commit/d744fab3344fed5e86caf9be47c01429d18356d9))
+* 5221 - downgrade to previous connectivity_plus package version ([#5223](https://github.com/openfoodfacts/smooth-app/issues/5223)) ([2594b38](https://github.com/openfoodfacts/smooth-app/commit/2594b38fec4b2fa470b6cd0e80acaaa7cfe4729d))
+* 5247 - now "unselect"ing for the correct language ([#5266](https://github.com/openfoodfacts/smooth-app/issues/5266)) ([8758b0e](https://github.com/openfoodfacts/smooth-app/commit/8758b0e818922d7adc1579deac37fb0b41cd86c0))
+* 5288 - added svg files to cache ([#5299](https://github.com/openfoodfacts/smooth-app/issues/5299)) ([dcd70ea](https://github.com/openfoodfacts/smooth-app/commit/dcd70eacc417f48daa3870fae6dceb5e78408a11))
+* 5330 - updated link to the skill pool ([#5334](https://github.com/openfoodfacts/smooth-app/issues/5334)) ([1ce24e8](https://github.com/openfoodfacts/smooth-app/commit/1ce24e8f2d31dbf96b77c2a0530dfcaf09e8a20d))
+* 5345 ([#5346](https://github.com/openfoodfacts/smooth-app/issues/5346)) ([2dd4575](https://github.com/openfoodfacts/smooth-app/commit/2dd4575b96baa33fb659bc4fd56478906445740f))
+* 5371 - less ambiguous currency symbol ([#5376](https://github.com/openfoodfacts/smooth-app/issues/5376)) ([18505dd](https://github.com/openfoodfacts/smooth-app/commit/18505ddc0e09ec7bf6f048dd7b0f1eb7a33a04db))
+* adjusting onTap call ([#5113](https://github.com/openfoodfacts/smooth-app/issues/5113)) ([f57c0c0](https://github.com/openfoodfacts/smooth-app/commit/f57c0c00c72f341595d036a7f94bc9c1d8951520))
+* Fix issues with themes ([#5410](https://github.com/openfoodfacts/smooth-app/issues/5410)) ([6026fbc](https://github.com/openfoodfacts/smooth-app/commit/6026fbc91bdad67d84cdffd8c8cbefa1b15914aa))
+* Fix performances on the photos gallery ([#5447](https://github.com/openfoodfacts/smooth-app/issues/5447)) ([1c4b959](https://github.com/openfoodfacts/smooth-app/commit/1c4b95954eda5150fbdb846afa94be8f65ca1d1e))
+* Guide: Rewrite newline character from translations ([#5365](https://github.com/openfoodfacts/smooth-app/issues/5365)) ([f5973da](https://github.com/openfoodfacts/smooth-app/commit/f5973da76964a31a498e1e546f8566948b3b44fa))
+* Prices feedback form missing SafeArea-like ([#5448](https://github.com/openfoodfacts/smooth-app/issues/5448)) ([08a8df1](https://github.com/openfoodfacts/smooth-app/commit/08a8df14f464a6abbe5ec92b99bd84ab6d310687))
+* RankingFloatingActionButton partially off-screen for some translations ([#5117](https://github.com/openfoodfacts/smooth-app/issues/5117)) ([9075fdc](https://github.com/openfoodfacts/smooth-app/commit/9075fdc3430fbb37351f8e42992feaca36e62927))
+* Support for photos in a different language than the default one (green buttons) ([#5278](https://github.com/openfoodfacts/smooth-app/issues/5278)) ([ffe90e7](https://github.com/openfoodfacts/smooth-app/commit/ffe90e76528d1dcb3731ddd87ec4d6871c18a7d1))
+* Update dependabot.yml ([49998ec](https://github.com/openfoodfacts/smooth-app/commit/49998eca6a20663604eff5d6592c4681f2468ad4))
+* Update tagline_provider.dart ([e4cb2f2](https://github.com/openfoodfacts/smooth-app/commit/e4cb2f26a10cf7a8b269c03bfadb82ccaef40b4e))
+
## [4.14.0](https://github.com/openfoodfacts/smooth-app/compare/v4.13.0...v4.14.0) (2024-03-02)
diff --git a/README.md b/README.md
index 1e8c7155538..d8a99c424d2 100644
--- a/README.md
+++ b/README.md
@@ -35,8 +35,9 @@
## Current Release
-- Latest commit deployed to Apple App Store: Released on Nov 29th as Build 835
-- Latest commit deployed to PlayStore: 792 from Nov 6th 11AM
+- Latest commit deployed to Apple App Store: Released on Feb 26 2024 as Version 4.13.1
+- Latest commit deployed to PlayStore: 1379 Released on Feb 24 2024 9:42 PM
+- Latest commit deployed to F-Droid: 9 March 2024 as Version 4.14.0 (1280)
## Presentation
@@ -87,7 +88,7 @@
- Make sure you have installed flutter and all the requirements
- [Official flutter installation guide](https://docs.flutter.dev/get-started/install)
-- Currently, the app uses the latest stable version of Flutter (3.19.x).
+- Currently, the app uses the following version of Flutter (3.22.x).
We have predefined run configurations for Android Studio and Visual Studio Code
diff --git a/flutter-version.txt b/flutter-version.txt
index 0bc8e967b83..dbc9520ba41 100644
--- a/flutter-version.txt
+++ b/flutter-version.txt
@@ -1 +1 @@
-3.19.5
\ No newline at end of file
+3.22.2
\ No newline at end of file
diff --git a/packages/app_store/apple_app_store/pubspec.yaml b/packages/app_store/apple_app_store/pubspec.yaml
index c3317039f29..0a6b0494448 100644
--- a/packages/app_store/apple_app_store/pubspec.yaml
+++ b/packages/app_store/apple_app_store/pubspec.yaml
@@ -4,13 +4,13 @@ version: 0.0.1
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
- in_app_review: 2.0.4
+ in_app_review: 2.0.9
app_store_shared:
path: ../shared
@@ -18,6 +18,6 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
- flutter_lints: 2.0.2
+ flutter_lints: 2.0.3
openfoodfacts_flutter_lints:
git: https://github.com/openfoodfacts/openfoodfacts_flutter_lints.git
\ No newline at end of file
diff --git a/packages/app_store/google_play/pubspec.yaml b/packages/app_store/google_play/pubspec.yaml
index e906b0e2f76..54161b2443e 100644
--- a/packages/app_store/google_play/pubspec.yaml
+++ b/packages/app_store/google_play/pubspec.yaml
@@ -4,13 +4,13 @@ version: 0.0.1
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
sdk: flutter
- in_app_review: 2.0.4
+ in_app_review: 2.0.9
app_store_shared:
path: ../shared
@@ -18,7 +18,7 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
- flutter_lints: 2.0.2
+ flutter_lints: 2.0.3
openfoodfacts_flutter_lints:
git: https://github.com/openfoodfacts/openfoodfacts_flutter_lints.git
diff --git a/packages/app_store/shared/pubspec.yaml b/packages/app_store/shared/pubspec.yaml
index ea7e215339c..86fec92bc7f 100644
--- a/packages/app_store/shared/pubspec.yaml
+++ b/packages/app_store/shared/pubspec.yaml
@@ -4,7 +4,7 @@ version: 1.0.0
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
@@ -13,7 +13,7 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
- flutter_lints: 2.0.2
+ flutter_lints: 2.0.3
openfoodfacts_flutter_lints:
git: https://github.com/openfoodfacts/openfoodfacts_flutter_lints.git
diff --git a/packages/app_store/uri_store/pubspec.yaml b/packages/app_store/uri_store/pubspec.yaml
index 7ed3f6a6611..1e661bdb92a 100644
--- a/packages/app_store/uri_store/pubspec.yaml
+++ b/packages/app_store/uri_store/pubspec.yaml
@@ -4,7 +4,7 @@ version: 0.0.1
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
@@ -18,6 +18,6 @@ dependencies:
dev_dependencies:
flutter_test:
sdk: flutter
- flutter_lints: 2.0.2
+ flutter_lints: 2.0.3
openfoodfacts_flutter_lints:
git: https://github.com/openfoodfacts/openfoodfacts_flutter_lints.git
\ No newline at end of file
diff --git a/packages/scanner/ml_kit/pubspec.yaml b/packages/scanner/ml_kit/pubspec.yaml
index 5b69d47d97a..4dca15bc983 100644
--- a/packages/scanner/ml_kit/pubspec.yaml
+++ b/packages/scanner/ml_kit/pubspec.yaml
@@ -4,7 +4,7 @@ version: 1.0.0
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
@@ -13,7 +13,7 @@ dependencies:
visibility_detector: 0.4.0+2
async: 2.11.0
- mobile_scanner: 3.5.2
+ mobile_scanner: 4.0.1
scanner_shared:
path: ../shared
diff --git a/packages/scanner/shared/lib/src/scanner_visor.dart b/packages/scanner/shared/lib/src/scanner_visor.dart
index 3eb78bf710f..15ebb165c89 100644
--- a/packages/scanner/shared/lib/src/scanner_visor.dart
+++ b/packages/scanner/shared/lib/src/scanner_visor.dart
@@ -160,23 +160,27 @@ class VisorButton extends StatelessWidget {
@override
Widget build(BuildContext context) {
- return Material(
- type: MaterialType.transparency,
- child: InkWell(
- onTap: onTap,
- borderRadius: const BorderRadius.all(
- Radius.circular(
- SmoothBarcodeScannerVisor.CORNER_PADDING,
+ return Semantics(
+ label: tooltip,
+ excludeSemantics: true,
+ child: Material(
+ type: MaterialType.transparency,
+ child: InkWell(
+ onTap: onTap,
+ borderRadius: const BorderRadius.all(
+ Radius.circular(
+ SmoothBarcodeScannerVisor.CORNER_PADDING,
+ ),
),
- ),
- child: Tooltip(
- message: tooltip,
- enableFeedback: true,
- child: Padding(
- padding: const EdgeInsets.all(12.0),
- child: IconTheme(
- data: const IconThemeData(color: Colors.white),
- child: child,
+ child: Tooltip(
+ message: tooltip,
+ enableFeedback: true,
+ child: Padding(
+ padding: const EdgeInsets.all(12.0),
+ child: IconTheme(
+ data: const IconThemeData(color: Colors.white),
+ child: child,
+ ),
),
),
),
diff --git a/packages/scanner/shared/pubspec.yaml b/packages/scanner/shared/pubspec.yaml
index 7730dc8abaf..7fa9a28d1f0 100644
--- a/packages/scanner/shared/pubspec.yaml
+++ b/packages/scanner/shared/pubspec.yaml
@@ -4,7 +4,7 @@ version: 1.0.0
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
diff --git a/packages/scanner/zxing/pubspec.yaml b/packages/scanner/zxing/pubspec.yaml
index 76b0988cd50..0e32939a7b4 100644
--- a/packages/scanner/zxing/pubspec.yaml
+++ b/packages/scanner/zxing/pubspec.yaml
@@ -4,7 +4,7 @@ version: 1.0.0
publish_to: "none"
environment:
- sdk: '>=3.3.0 <4.0.0'
+ sdk: '>=3.4.0 <4.0.0'
dependencies:
flutter:
diff --git a/packages/smooth_app/android/Gemfile.lock b/packages/smooth_app/android/Gemfile.lock
index f1f735f4275..c2fcdce8648 100644
--- a/packages/smooth_app/android/Gemfile.lock
+++ b/packages/smooth_app/android/Gemfile.lock
@@ -16,17 +16,17 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.907.0)
- aws-sdk-core (3.191.6)
+ aws-partitions (1.945.0)
+ aws-sdk-core (3.197.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.78.0)
- aws-sdk-core (~> 3, >= 3.191.0)
+ aws-sdk-kms (1.85.0)
+ aws-sdk-core (~> 3, >= 3.197.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.146.1)
- aws-sdk-core (~> 3, >= 3.191.0)
+ aws-sdk-s3 (1.152.3)
+ aws-sdk-core (~> 3, >= 3.197.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
@@ -74,7 +74,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.3.1)
- fastlane (2.220.0)
+ fastlane (2.221.1)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -155,31 +155,32 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
- http-cookie (1.0.5)
+ http-cookie (1.0.6)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
json (2.7.2)
- jwt (2.8.1)
+ jwt (2.8.2)
base64
- mini_magick (4.12.0)
+ mini_magick (4.13.1)
mini_mime (1.1.5)
multi_json (1.15.0)
- multipart-post (2.4.0)
+ multipart-post (2.4.1)
nanaimo (0.3.0)
naturally (2.2.1)
nkf (0.2.0)
- optparse (0.4.0)
+ optparse (0.5.0)
os (1.1.4)
plist (3.7.1)
- public_suffix (5.0.5)
- rake (13.2.0)
+ public_suffix (5.1.1)
+ rake (13.2.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.2.6)
+ rexml (3.2.9)
+ strscan
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@@ -192,6 +193,7 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
+ strscan (3.1.0)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
diff --git a/packages/smooth_app/assets/animations/nutriscore.riv b/packages/smooth_app/assets/animations/nutriscore.riv
index 8ac9e8b4caf..4dec97e4360 100644
Binary files a/packages/smooth_app/assets/animations/nutriscore.riv and b/packages/smooth_app/assets/animations/nutriscore.riv differ
diff --git a/packages/smooth_app/assets/animations/off.riv b/packages/smooth_app/assets/animations/off.riv
index de111e2ade5..f3d36c7ff93 100644
Binary files a/packages/smooth_app/assets/animations/off.riv and b/packages/smooth_app/assets/animations/off.riv differ
diff --git a/packages/smooth_app/assets/app/logo_text_black.svg b/packages/smooth_app/assets/app/logo_text_black.svg
new file mode 100644
index 00000000000..00d802eefe4
--- /dev/null
+++ b/packages/smooth_app/assets/app/logo_text_black.svg
@@ -0,0 +1,45 @@
+
+
+ Logo OFF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/app/logo_text_white.svg b/packages/smooth_app/assets/app/logo_text_white.svg
new file mode 100644
index 00000000000..098faa7b514
--- /dev/null
+++ b/packages/smooth_app/assets/app/logo_text_white.svg
@@ -0,0 +1,45 @@
+
+
+ Logo OFF
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/info.svg b/packages/smooth_app/assets/cache/info.svg
new file mode 100644
index 00000000000..25cf1804ee4
--- /dev/null
+++ b/packages/smooth_app/assets/cache/info.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-de.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-de.svg
new file mode 100644
index 00000000000..dd477c13d49
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-a-new-de.svg
@@ -0,0 +1,152 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-en.svg
new file mode 100644
index 00000000000..7ff414602af
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-a-new-en.svg
@@ -0,0 +1,154 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-formula-en.svg
deleted file mode 100644
index 6516f55c498..00000000000
--- a/packages/smooth_app/assets/cache/nutriscore-a-new-formula-en.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-fr.svg
new file mode 100644
index 00000000000..98eadef0fd0
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-a-new-fr.svg
@@ -0,0 +1,150 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-lb.svg
new file mode 100644
index 00000000000..eccf6122864
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-a-new-lb.svg
@@ -0,0 +1,151 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-a-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-a-new-nl.svg
new file mode 100644
index 00000000000..2f42b5a3c33
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-a-new-nl.svg
@@ -0,0 +1,158 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-de.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-de.svg
new file mode 100644
index 00000000000..526c9fd6563
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-b-new-de.svg
@@ -0,0 +1,87 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-en.svg
new file mode 100644
index 00000000000..0b814f08a42
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-b-new-en.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-formula-en.svg
deleted file mode 100644
index f973754dc27..00000000000
--- a/packages/smooth_app/assets/cache/nutriscore-b-new-formula-en.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-fr.svg
new file mode 100644
index 00000000000..b69eecab2e6
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-b-new-fr.svg
@@ -0,0 +1,85 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-lb.svg
new file mode 100644
index 00000000000..400cb6cd1ea
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-b-new-lb.svg
@@ -0,0 +1,86 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-b-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-b-new-nl.svg
new file mode 100644
index 00000000000..da157bbb357
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-b-new-nl.svg
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-de.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-de.svg
new file mode 100644
index 00000000000..4c754b3b352
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-c-new-de.svg
@@ -0,0 +1,223 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-en.svg
new file mode 100644
index 00000000000..ccdfce3d122
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-c-new-en.svg
@@ -0,0 +1,225 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-formula-en.svg
deleted file mode 100644
index 7e208163e3f..00000000000
--- a/packages/smooth_app/assets/cache/nutriscore-c-new-formula-en.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-fr.svg
new file mode 100644
index 00000000000..71587caf799
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-c-new-fr.svg
@@ -0,0 +1,221 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-lb.svg
new file mode 100644
index 00000000000..bbb3191232e
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-c-new-lb.svg
@@ -0,0 +1,222 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-c-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-c-new-nl.svg
new file mode 100644
index 00000000000..66e0cbd75e0
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-c-new-nl.svg
@@ -0,0 +1,229 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-de.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-de.svg
new file mode 100644
index 00000000000..875a6a7a69f
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-d-new-de.svg
@@ -0,0 +1,91 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-en.svg
new file mode 100644
index 00000000000..1ee2a792e94
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-d-new-en.svg
@@ -0,0 +1,93 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-formula-en.svg
deleted file mode 100644
index 8a0ff49d8cd..00000000000
--- a/packages/smooth_app/assets/cache/nutriscore-d-new-formula-en.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-fr.svg
new file mode 100644
index 00000000000..cbf15b2395d
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-d-new-fr.svg
@@ -0,0 +1,89 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-lb.svg
new file mode 100644
index 00000000000..9ecc130b830
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-d-new-lb.svg
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-d-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-d-new-nl.svg
new file mode 100644
index 00000000000..649654c3cba
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-d-new-nl.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-de.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-de.svg
new file mode 100644
index 00000000000..6d9bbce4d97
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-e-new-de.svg
@@ -0,0 +1,289 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-en.svg
new file mode 100644
index 00000000000..7eecf5f2a66
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-e-new-en.svg
@@ -0,0 +1,291 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-formula-en.svg
deleted file mode 100644
index f6c74eda004..00000000000
--- a/packages/smooth_app/assets/cache/nutriscore-e-new-formula-en.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-fr.svg
new file mode 100644
index 00000000000..6d0dcc74a00
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-e-new-fr.svg
@@ -0,0 +1,287 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-lb.svg
new file mode 100644
index 00000000000..481d624a659
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-e-new-lb.svg
@@ -0,0 +1,288 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-e-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-e-new-nl.svg
new file mode 100644
index 00000000000..cfffd912cb9
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-e-new-nl.svg
@@ -0,0 +1,295 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-de.svg
similarity index 100%
rename from packages/smooth_app/assets/cache/nutriscore-not-applicable-new-formula-en.svg
rename to packages/smooth_app/assets/cache/nutriscore-not-applicable-new-de.svg
diff --git a/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-en.svg
new file mode 100644
index 00000000000..bcb99574253
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-en.svg
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-fr.svg
new file mode 100644
index 00000000000..bcb99574253
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-fr.svg
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-lb.svg
new file mode 100644
index 00000000000..bcb99574253
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-lb.svg
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-nl.svg
new file mode 100644
index 00000000000..bcb99574253
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-not-applicable-new-nl.svg
@@ -0,0 +1,317 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-unknown-new-formula-en.svg b/packages/smooth_app/assets/cache/nutriscore-unknown-new-de.svg
similarity index 100%
rename from packages/smooth_app/assets/cache/nutriscore-unknown-new-formula-en.svg
rename to packages/smooth_app/assets/cache/nutriscore-unknown-new-de.svg
diff --git a/packages/smooth_app/assets/cache/nutriscore-unknown-new-en.svg b/packages/smooth_app/assets/cache/nutriscore-unknown-new-en.svg
new file mode 100644
index 00000000000..407614599c9
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-unknown-new-en.svg
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-unknown-new-fr.svg b/packages/smooth_app/assets/cache/nutriscore-unknown-new-fr.svg
new file mode 100644
index 00000000000..407614599c9
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-unknown-new-fr.svg
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-unknown-new-lb.svg b/packages/smooth_app/assets/cache/nutriscore-unknown-new-lb.svg
new file mode 100644
index 00000000000..407614599c9
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-unknown-new-lb.svg
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/nutriscore-unknown-new-nl.svg b/packages/smooth_app/assets/cache/nutriscore-unknown-new-nl.svg
new file mode 100644
index 00000000000..407614599c9
--- /dev/null
+++ b/packages/smooth_app/assets/cache/nutriscore-unknown-new-nl.svg
@@ -0,0 +1,318 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/off-logo-icon-light.svg b/packages/smooth_app/assets/cache/off-logo-icon-light.svg
new file mode 100644
index 00000000000..f32149e7d50
--- /dev/null
+++ b/packages/smooth_app/assets/cache/off-logo-icon-light.svg
@@ -0,0 +1,97 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/packages/smooth_app/assets/cache/points-negative-0-20.svg b/packages/smooth_app/assets/cache/points-negative-0-20.svg
new file mode 100644
index 00000000000..f58faf6c0cf
--- /dev/null
+++ b/packages/smooth_app/assets/cache/points-negative-0-20.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/points-negative-15-15.svg b/packages/smooth_app/assets/cache/points-negative-15-15.svg
new file mode 100644
index 00000000000..8f42909676b
--- /dev/null
+++ b/packages/smooth_app/assets/cache/points-negative-15-15.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/points-negative-3-10.svg b/packages/smooth_app/assets/cache/points-negative-3-10.svg
new file mode 100644
index 00000000000..1fcccef28c2
--- /dev/null
+++ b/packages/smooth_app/assets/cache/points-negative-3-10.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/points-negative-5-10.svg b/packages/smooth_app/assets/cache/points-negative-5-10.svg
new file mode 100644
index 00000000000..256d050ea77
--- /dev/null
+++ b/packages/smooth_app/assets/cache/points-negative-5-10.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/points-positive-0-5.svg b/packages/smooth_app/assets/cache/points-positive-0-5.svg
new file mode 100644
index 00000000000..770a16f3a0f
--- /dev/null
+++ b/packages/smooth_app/assets/cache/points-positive-0-5.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/cache/signalconso.png b/packages/smooth_app/assets/cache/signalconso.png
new file mode 100644
index 00000000000..8c9cc70bf6b
Binary files /dev/null and b/packages/smooth_app/assets/cache/signalconso.png differ
diff --git a/packages/smooth_app/assets/fonts/SmoothIcons.ttf b/packages/smooth_app/assets/fonts/SmoothIcons.ttf
index 7aabb31d856..7765d978af5 100644
Binary files a/packages/smooth_app/assets/fonts/SmoothIcons.ttf and b/packages/smooth_app/assets/fonts/SmoothIcons.ttf differ
diff --git a/packages/smooth_app/assets/fonts/icons/chicken.svg b/packages/smooth_app/assets/fonts/icons/chicken.svg
new file mode 100644
index 00000000000..6e901f76b04
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/chicken.svg
@@ -0,0 +1,7 @@
+
+
+ Chicken
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/config.json b/packages/smooth_app/assets/fonts/icons/config.json
index 4c33fa29e62..e8c66e0f517 100644
--- a/packages/smooth_app/assets/fonts/icons/config.json
+++ b/packages/smooth_app/assets/fonts/icons/config.json
@@ -739,6 +739,132 @@
"search": [
"qrcode_corners"
]
+ },
+ {
+ "uid": "dfaf7621276027ab1c05f0d86bf8c486",
+ "css": "chicken",
+ "code": 59392,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M641.7 0C604.9 0 575 29.8 575 66.7 575 95.2 593 119.3 618.2 128.9 648.2 90.9 694.7 66.7 745.7 66.7 783.7 66.7 818.6 79.9 846.4 101.8 857 93.7 863.9 81 863.9 66.7 863.9 42.1 844 22.2 819.5 22.2 809 22.2 799.5 26 791.9 32.1 783 13.2 763.9 0 741.7 0 721.7 0 704.3 10.7 694.5 26.5 682.4 10.5 663.3 0 641.7 0ZM745.7 111.1C687.2 111.1 636.9 154.8 628.7 212.6L602.4 396.5C587.1 503.5 473.3 575.8 375 577.7L375 533.3C375 484.3 335.1 444.4 286.1 444.4 259.6 444.4 235.7 456.1 219.4 474.6L219.4 466.7C219.4 417.6 179.6 377.8 130.6 377.8 81.5 377.8 41.7 417.6 41.7 466.7L41.7 588.9C41.7 831 206.2 1000 441.7 1000 530.2 1000 610.6 975.3 677 932.2 717.3 887.2 731.1 826.5 713.3 767.7 697.3 714.8 658.7 674.9 615.1 666.2 603 663.8 595.2 652.1 597.7 640.1 600 628.1 611.8 620.2 623.8 622.7 684.2 634.7 734.8 685.4 755.8 754.9 766.4 789.8 767.7 825.2 761.3 858.9 825.6 785.3 863.9 687.9 863.9 577.8L863.9 377.8 941.9 299.8C948.9 292.8 952.8 283.3 952.8 273.5 952.8 256.4 941.2 241.5 924.6 237.4L863.9 222.2 863.5 225.4C861.4 162.1 809.5 111.1 745.7 111.1ZM741.7 222.2C760.1 222.2 775 237.2 775 255.6 775 274 760.1 288.9 741.7 288.9 723.3 288.9 708.3 274 708.3 255.6 708.3 237.2 723.3 222.2 741.7 222.2Z",
+ "width": 1000
+ },
+ "search": [
+ "chicken"
+ ]
+ },
+ {
+ "uid": "47c85b2e17036ec1c3d43e80af34f97a",
+ "css": "fish",
+ "code": 59458,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M997.4 508.4C994.6 500.1 928.8 314.9 709.9 256 694.6 189.9 641.1 138 571.6 126.3L388.8 95.9C372.7 93.2 356.4 99 345.5 111.1 334.6 123.2 330.7 140.1 335.1 155.8L371.1 283.2C322.6 304.6 276.4 332.8 238.4 364 201.5 330 143.7 285.7 47.6 285.7 21.3 285.7 0 307.1 0 333.3L0 714.3C0 740.6 21.3 761.9 47.6 761.9 136.8 761.9 197.4 715.9 236 683 274 716 338.9 761.8 428.6 788.2L428.6 857.1C428.6 871.1 434.7 884.4 445.3 893.4 454 900.8 465 904.8 476.2 904.8 478.7 904.8 481.3 904.6 483.9 904.1 499.5 901.6 628.4 878.3 686.3 796.2 912.6 743.6 993.1 550.1 996.5 541.6 1000.8 531 1001.1 519.2 997.4 508.4ZM690.5 428.6C730 428.6 761.9 460.5 761.9 500 761.9 539.5 730 571.4 690.5 571.4 651 571.4 619 539.5 619 500 619 460.5 651 428.6 690.5 428.6Z",
+ "width": 1000
+ },
+ "search": [
+ "fish"
+ ]
+ },
+ {
+ "uid": "3a5aae672b133ef2885423db0fb2605f",
+ "css": "milk",
+ "code": 59459,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M283.5 0C263.3 0 247 16.4 247 36.6L247 76.7 139.1 292.3C129.8 310.9 125 331.5 125 352.3L125 914.6C125 961.3 163.7 1000 210.4 1000L771.3 1000C818 1000 856.7 961.3 856.7 914.6L856.7 352.3C856.7 331.4 851.8 310.9 842.6 292.3 842.6 292.3 842.6 292.3 842.6 292.3L734.8 76.7 734.8 36.6C734.8 16.4 718.4 0 698.2 0L283.5 0ZM306.1 122L639 122 553.8 292.3C553.7 292.4 553.7 292.6 553.6 292.7L220.8 292.7 306.1 122ZM698.2 167.2L777.1 325C781.3 333.5 783.5 342.8 783.5 352.3L783.5 914.6C783.5 921.8 778.5 926.8 771.3 926.8L612.8 926.8 612.8 352.3C612.8 342.8 615 333.4 619.2 325L698.2 167.2ZM198.2 365.9L539.6 365.9 539.6 926.8 210.4 926.8C203.2 926.8 198.2 921.8 198.2 914.6L198.2 365.9ZM283.5 512.2C263.3 512.2 247 528.6 247 548.8 247 569 263.3 585.4 283.5 585.4 303.7 585.4 320.1 569 320.1 548.8 320.1 528.6 303.7 512.2 283.5 512.2L283.5 512.2ZM454.3 512.2C434.1 512.2 417.7 528.6 417.7 548.8 417.7 569 434.1 585.4 454.3 585.4 474.5 585.4 490.9 569 490.9 548.8 490.9 528.6 474.5 512.2 454.3 512.2ZM277.8 637C262.7 637.3 249.4 646.9 244.3 661.1 239.2 675.3 243.3 691.2 254.6 701.1 318.2 759.9 415.6 759.9 479.1 701.1 490.4 691 494.2 675 488.9 660.9 483.5 646.8 470.1 637.4 455 637.3 445.5 637.2 436.3 640.8 429.4 647.4 391.9 682.1 341.8 682.1 304.3 647.4 297.2 640.5 287.7 636.7 277.8 637Z",
+ "width": 1000
+ },
+ "search": [
+ "milk"
+ ]
+ },
+ {
+ "uid": "4a214d7548a54cfb7faae3dfa88e0146",
+ "css": "soda_happy",
+ "code": 59460,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M528.5 0L484.5 175.1 260.7 175.1C189.4 175.1 131.4 232.6 130.4 303.7L865.5 303.7C864.5 232.6 806.5 175.1 735.2 175.1L574.1 175.1 596.4 87 759.5 87 759.5 0 528.5 0ZM183.8 390.6L308.2 998.9 687.8 998.9 810.2 390.6 183.8 390.6ZM367.5 564.5C391.5 564.5 411 584 411 608 411 632 391.5 651.5 367.5 651.5 343.5 651.5 324 632 324 608 324 584 343.5 564.5 367.5 564.5ZM628.4 564.5C652.4 564.5 671.9 584 671.9 608 671.9 632 652.4 651.5 628.4 651.5 604.4 651.5 584.9 632 584.9 608 584.9 584 604.4 564.5 628.4 564.5ZM411 738.5L584.9 738.5C584.9 786.5 546 825.4 498 825.4 449.9 825.4 411 786.5 411 738.5Z",
+ "width": 1000
+ },
+ "search": [
+ "soda_happy"
+ ]
+ },
+ {
+ "uid": "204c319d1c414acb05ad3da52db53baa",
+ "css": "soda_unhappy",
+ "code": 59461,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M528.5 0L484.5 175.1 260.7 175.1C189.4 175.1 131.4 232.6 130.4 303.7L865.5 303.7C864.5 232.6 806.5 175.1 735.2 175.1L574.1 175.1 596.4 87 759.5 87 759.5 0 528.5 0ZM183.8 390.6L308.2 998.9 687.8 998.9 810.2 390.6 183.8 390.6ZM367.5 564.5C391.5 564.5 411 584 411 608 411 632 391.5 651.5 367.5 651.5 343.5 651.5 324 632 324 608 324 584 343.5 564.5 367.5 564.5ZM628.4 564.5C652.4 564.5 671.9 584 671.9 608 671.9 632 652.4 651.5 628.4 651.5 604.4 651.5 584.9 632 584.9 608 584.9 584 604.4 564.5 628.4 564.5ZM584.9 825.4L411 825.4C411 777.4 449.9 738.5 498 738.5 546 738.5 584.9 777.4 584.9 825.4Z",
+ "width": 1000
+ },
+ "search": [
+ "soda_unhappy"
+ ]
+ },
+ {
+ "uid": "7b10fc8ffcf02249a781b45e77849de4",
+ "css": "salt",
+ "code": 59449,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M729.4 402.6L669.6 318.1 669.6 272.7C684.1 267.5 694.6 253.8 694.6 237.5L694.6 162.5C694.6 72.9 621.7 0 532.1 0L457.1 0C367.5 0 294.6 72.9 294.6 162.5L294.6 237.5C294.6 253.8 305 267.5 319.6 272.7L319.6 317.2 279.9 368.2C176.5 501.4 119.6 667.5 119.6 836L119.6 862.5C119.6 938.3 181.3 1000 257.1 1000L732.1 1000C807.9 1000 869.6 938.3 869.6 862.5L869.6 843.2C869.6 684.5 821.1 532.1 729.4 402.6ZM557.1 50C577.8 50 594.6 66.8 594.6 87.5 594.6 108.2 577.8 125 557.1 125 536.4 125 519.6 108.2 519.6 87.5 519.6 66.8 536.4 50 557.1 50ZM432.1 50C452.8 50 469.6 66.8 469.6 87.5 469.6 108.2 452.8 125 432.1 125 411.4 125 394.6 108.2 394.6 87.5 394.6 66.8 411.4 50 432.1 50ZM514.9 850L470.5 850C432.9 850 400.2 830.4 387.3 811.1 377.8 796.7 381.6 777.3 396 767.8 410.2 758.3 429.4 762 439.1 776 441.9 779.2 454.2 787.5 470.6 787.5L514.9 787.5C531.3 787.5 544.6 774.9 544.6 759.4 544.6 743.9 531.3 731.3 514.9 731.3L480.5 731.3C429.7 731.3 388.3 690.6 388.3 640.6 388.3 590.6 429.7 550 480.5 550L513.3 550C563.6 550 587.3 585.6 589.8 589.7 599 604.3 594.5 623.6 579.9 632.8 565.3 641.9 546 637.5 536.9 622.8 536.5 622.4 529 612.5 513.4 612.5L480.5 612.5C464.2 612.5 450.8 625.1 450.8 640.6 450.8 656.1 464.1 668.8 480.5 668.8L514.9 668.8C565.7 668.8 607.1 709.4 607.1 759.4 607.1 809.4 565.7 850 514.9 850ZM350.2 400L386.7 353.1C391.8 346.5 394.6 338.4 394.6 330.1L394.6 275 594.6 275 594.6 330.1C594.6 337.8 597 345.4 601.4 351.7L635.6 400 350.2 400Z",
+ "width": 1000
+ },
+ "search": [
+ "salt"
+ ]
+ },
+ {
+ "uid": "6259d414372fbf5c12b19bf9ba7fd748",
+ "css": "magic_wand",
+ "code": 59395,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M648.1 0C637.1 0 626.1 5.5 619.9 16.5L569.2 105.9 470.3 78.4C445.9 71.7 423.5 94.1 430.3 118.4L457.8 217.4 368.3 268C346.4 280.5 346.4 312.1 368.3 324.5L457.8 375.1 458 375.4 588.1 245.2C618.8 214.5 668.5 214.5 699.2 245.2 729.9 275.8 729.9 325.6 699.2 356.3L569.1 486.5 569.3 486.7 619.9 576.1C632.3 598.1 664 598.1 676.4 576.1L727 486.7 826 514.1C850.4 520.8 872.7 498.5 866 474.2L838.5 375.1 927.9 324.6C949.9 312.1 949.9 280.5 927.9 268L838.5 217.4 866 118.4C872.8 94.1 850.4 71.7 826 78.4L727.1 105.9 676.4 16.5C670.2 5.5 659.2 0 648.1 0ZM457.9 375.4L41.5 791.8C10.9 822.5 10.9 872.3 41.5 902.9 72.2 933.6 122 933.6 152.6 902.9L569 486.5 457.9 375.4ZM610.5 666.2C590.1 666.5 573.8 683.3 574.1 703.7L574.1 740.7 537 740.7C523.7 740.6 511.3 747.6 504.5 759.1 497.8 770.6 497.8 784.9 504.5 796.4 511.3 808 523.7 815 537 814.8L574.1 814.8 574.1 851.9C573.9 865.2 580.9 877.6 592.4 884.4 604 891.1 618.2 891.1 629.8 884.4 641.3 877.6 648.3 865.2 648.1 851.9L648.1 814.8 685.2 814.8C698.5 815 711 808 717.7 796.4 724.4 784.9 724.4 770.6 717.7 759.1 711 747.6 698.5 740.6 685.2 740.7L648.1 740.7 648.1 703.7C648.3 693.7 644.4 684.1 637.3 677 630.2 669.9 620.5 666 610.5 666.2ZM869.8 777.3C849.4 777.6 833.1 794.4 833.3 814.8L833.3 851.9 796.3 851.9C782.9 851.7 770.5 858.7 763.8 870.2 757 881.8 757 896 763.8 907.6 770.5 919.1 782.9 926.1 796.3 925.9L833.3 925.9 833.3 963C833.1 976.3 840.2 988.7 851.7 995.5 863.2 1002.2 877.5 1002.2 889 995.5 900.6 988.7 907.6 976.3 907.4 963L907.4 925.9 944.4 925.9C957.8 926.1 970.2 919.1 977 907.6 983.7 896 983.7 881.8 977 870.2 970.2 858.7 957.8 851.7 944.4 851.9L907.4 851.9 907.4 814.8C907.5 804.8 903.6 795.2 896.5 788.1 889.4 781 879.8 777.1 869.8 777.3Z",
+ "width": 1000
+ },
+ "search": [
+ "magic_wand"
+ ]
+ },
+ {
+ "uid": "1c7d8102eb8ad70f78736c9f8c1feda8",
+ "css": "lab",
+ "code": 59402,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M277.8 0L277.8 111.1 333.3 111.1 333.3 388.9 24 820.7C9.2 839.6 0 863.1 0 888.9 0 950.3 49.7 1000 111.1 1000L888.9 1000C950.3 1000 1000 950.3 1000 888.9 1000 863.1 990.8 839.6 976 820.7L666.7 388.9 666.7 111.1 722.2 111.1 722.2 0 277.8 0ZM444.4 111.1L555.6 111.1 555.6 333.3 444.4 333.3 444.4 111.1ZM430.2 444.4L569.8 444.4 885.7 885.4 887.4 887 888.9 888.9 111.4 889.3 112.8 887.4 114.3 885.4 430.2 444.4ZM555.6 555.6C524.9 555.6 500 580.4 500 611.1 500 641.8 524.9 666.7 555.6 666.7 586.2 666.7 611.1 641.8 611.1 611.1 611.1 580.4 586.2 555.6 555.6 555.6ZM416.7 666.7C370.6 666.7 333.3 704 333.3 750 333.3 796 370.6 833.3 416.7 833.3 462.7 833.3 500 796 500 750 500 704 462.7 666.7 416.7 666.7Z",
+ "width": 1000
+ },
+ "search": [
+ "lab"
+ ]
+ },
+ {
+ "uid": "60645a65573e29e618b87e437ea2f75a",
+ "css": "sparkles",
+ "code": 59409,
+ "src": "custom_icons",
+ "selected": true,
+ "svg": {
+ "path": "M986 530L762 458 690 234C688 226 680 220 670 220 660 220 654 226 650 234L578 458 354 530C346 532 340 540 340 550 340 560 346 566 354 570L578 642 650 866C652 874 660 880 670 880 680 880 686 874 690 866L762 642 986 570C994 568 1000 560 1000 550 1000 540 994 534 986 530ZM34 278L190 330 242 486C244 494 252 500 260 500 268 500 276 494 278 486L330 330 486 278C494 276 500 268 500 260 500 252 494 244 486 242L330 190 278 34C276 26 268 20 260 20 252 20 244 26 242 34L190 190 34 242C26 244 20 252 20 260 20 268 26 276 34 278ZM346 780L236 744 200 634C196 626 188 620 180 620 172 620 164 626 162 634L126 744 14 780C6 784 0 792 0 800 0 808 6 816 14 818L124 854 160 964C164 974 172 980 180 980 188 980 196 974 198 966L234 856 344 820C352 818 358 810 358 802 358 794 354 784 346 780Z",
+ "width": 1000
+ },
+ "search": [
+ "sparkles"
+ ]
}
]
}
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/fish.svg b/packages/smooth_app/assets/fonts/icons/fish.svg
new file mode 100644
index 00000000000..8a4d4ce0d0b
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/fish.svg
@@ -0,0 +1,7 @@
+
+
+ Fish
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/icons.sketch b/packages/smooth_app/assets/fonts/icons/icons.sketch
index fecc0788b9b..d87c126cdb2 100644
Binary files a/packages/smooth_app/assets/fonts/icons/icons.sketch and b/packages/smooth_app/assets/fonts/icons/icons.sketch differ
diff --git a/packages/smooth_app/assets/fonts/icons/lab.svg b/packages/smooth_app/assets/fonts/icons/lab.svg
new file mode 100644
index 00000000000..7f5e0d65912
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/lab.svg
@@ -0,0 +1,7 @@
+
+
+ Laboratoy
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/magic_wand.svg b/packages/smooth_app/assets/fonts/icons/magic_wand.svg
new file mode 100644
index 00000000000..c89cd3fb94d
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/magic_wand.svg
@@ -0,0 +1,7 @@
+
+
+ Magic Wand
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/milk.svg b/packages/smooth_app/assets/fonts/icons/milk.svg
new file mode 100644
index 00000000000..1b7009773d9
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/milk.svg
@@ -0,0 +1,7 @@
+
+
+ Milk
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/salt.svg b/packages/smooth_app/assets/fonts/icons/salt.svg
new file mode 100644
index 00000000000..68dc808cef9
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/salt.svg
@@ -0,0 +1,9 @@
+
+
+ Salt
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/soda_happy.svg b/packages/smooth_app/assets/fonts/icons/soda_happy.svg
new file mode 100644
index 00000000000..58b7c93abee
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/soda_happy.svg
@@ -0,0 +1,9 @@
+
+
+ Soda happy
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/soda_unhappy.svg b/packages/smooth_app/assets/fonts/icons/soda_unhappy.svg
new file mode 100644
index 00000000000..f54b6efde56
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/soda_unhappy.svg
@@ -0,0 +1,7 @@
+
+
+ Soda unhappy
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/fonts/icons/sparkles.svg b/packages/smooth_app/assets/fonts/icons/sparkles.svg
new file mode 100644
index 00000000000..6725e7d5cea
--- /dev/null
+++ b/packages/smooth_app/assets/fonts/icons/sparkles.svg
@@ -0,0 +1,7 @@
+
+
+ Sparkles
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/onboarding/birthday-cake.svg b/packages/smooth_app/assets/onboarding/birthday-cake.svg
deleted file mode 100644
index a26a2c391ec..00000000000
--- a/packages/smooth_app/assets/onboarding/birthday-cake.svg
+++ /dev/null
@@ -1,32 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/smooth_app/assets/onboarding/cloud.svg b/packages/smooth_app/assets/onboarding/cloud.svg
new file mode 100644
index 00000000000..8127531dc4e
--- /dev/null
+++ b/packages/smooth_app/assets/onboarding/cloud.svg
@@ -0,0 +1,11 @@
+
+
+ Vector
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/smooth_app/assets/onboarding/reinvention.svg b/packages/smooth_app/assets/onboarding/reinvention.svg
deleted file mode 100644
index 641f75117ca..00000000000
--- a/packages/smooth_app/assets/onboarding/reinvention.svg
+++ /dev/null
@@ -1,36 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/smooth_app/assets/onboarding/sample_product_data.json b/packages/smooth_app/assets/onboarding/sample_product_data.json
index dfb0ce69e00..8da40ee7319 100644
--- a/packages/smooth_app/assets/onboarding/sample_product_data.json
+++ b/packages/smooth_app/assets/onboarding/sample_product_data.json
@@ -9,11 +9,11 @@
"description" : "",
"description_short" : "Very good nutritional quality",
"grade" : "a",
- "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/nutriscore-a.svg",
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/nutriscore-a-new-en.svg",
"id" : "nutriscore",
- "match" : 85.0714285714286,
+ "match" : 81,
"name" : "Nutri-Score",
- "panel_id" : "nutriscore",
+ "panel_id" : "nutriscore_2023",
"status" : "known",
"title" : "Nutri-Score A"
},
@@ -336,8 +336,6 @@
"Aliments d'origine végétale",
"Aliments à base de fruits et de légumes",
"Plats préparés",
- "Alternatives à la viande",
- "Substituts de viande",
"Soupes",
"Soupes de légumes"
],
@@ -567,7 +565,6 @@
"ecoscore_material_score" : 81,
"ecoscore_shape_ratio" : 1,
"material" : "en:glass",
- "number_of_units" : 1,
"recycling" : "en:recycle",
"shape" : "en:bottle"
},
@@ -575,7 +572,6 @@
"ecoscore_material_score" : 76,
"ecoscore_shape_ratio" : 0.1,
"material" : "en:steel",
- "number_of_units" : 1,
"recycling" : "en:recycle",
"shape" : "en:bottle-cap"
}
@@ -779,8 +775,6 @@
"ecoscore_grade" : "a",
"ecoscore_score" : 115,
"environment_impact_level_tags" : [],
- "image_ingredients_url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.400.jpg",
- "image_nutrition_url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.400.jpg",
"ingredients_analysis_tags" : [
"en:palm-oil-free",
"en:vegan",
@@ -1183,7 +1177,7 @@
{
"values" : [
{
- "text" : "1 Bottle"
+ "text" : "Bottle"
},
{
"text" : "Glass"
@@ -1201,7 +1195,7 @@
{
"values" : [
{
- "text" : "1 Bottle cap"
+ "text" : "Bottle cap"
},
{
"text" : "Steel"
@@ -1283,7 +1277,7 @@
"title_element" : {
"grade" : "a",
"icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/ecoscore-a.svg",
- "subtitle" : "Product: A good product for you - Open Food Facts - 100 g",
+ "subtitle" : "Product: A good product for you - Open Food Facts - 200 g",
"title" : "Impact for this product: A (Score: 115/100)",
"type" : "grade"
},
@@ -1373,37 +1367,9 @@
{
"element_type" : "panel_group",
"panel_group_element" : {
- "image" : {
- "alt" : "A good product for you - Nutrition facts",
- "id" : "nutrition_en",
- "lc" : "en",
- "sizes" : {
- "100" : {
- "height" : 100,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.100.jpg",
- "width" : 75
- },
- "200" : {
- "height" : 200,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.200.jpg",
- "width" : 150
- },
- "400" : {
- "height" : 400,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.400.jpg",
- "width" : 300
- },
- "full" : {
- "height" : 4032,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.full.jpg",
- "width" : 3024
- }
- },
- "type" : "nutrition"
- },
"panel_group_id" : "nutrition",
"panel_ids" : [
- "nutriscore",
+ "nutriscore_2023",
"nutrient_levels"
],
"title" : "Nutrition",
@@ -1422,34 +1388,6 @@
{
"element_type" : "panel_group",
"panel_group_element" : {
- "image" : {
- "alt" : "A good product for you - Ingredients",
- "id" : "ingredients_en",
- "lc" : "en",
- "sizes" : {
- "100" : {
- "height" : 100,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.100.jpg",
- "width" : 56
- },
- "200" : {
- "height" : 200,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.200.jpg",
- "width" : 113
- },
- "400" : {
- "height" : 400,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.400.jpg",
- "width" : 225
- },
- "full" : {
- "height" : 4624,
- "url" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.full.jpg",
- "width" : 2604
- }
- },
- "type" : "ingredients"
- },
"panel_group_id" : "ingredients",
"panel_ids" : [
"ingredients"
@@ -1492,7 +1430,7 @@
{
"element_type" : "text",
"text_element" : {
- "html" : "\n If the information does not match the information on the packaging, please complete or correct it.\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n "
+ "html" : "\n If the information does not match the information on the packaging, you can complete or correct it. Thank you!\n Open Food Facts is a collaborative database, and every contribution is useful for all.\n "
}
},
{
@@ -1900,19 +1838,211 @@
"health"
]
},
- "nutriscore" : {
+ "nutriscore_2023" : {
+ "elements" : [
+ {
+ "element_type" : "panel",
+ "panel_element" : {
+ "panel_id" : "nutriscore_description"
+ }
+ },
+ {
+ "element_type" : "panel_group",
+ "panel_group_element" : {
+ "evaluation" : "bad",
+ "icon_color_from_evaluation" : true,
+ "icon_size" : "small",
+ "icon_url" : "https://static.openfoodfacts.org/images/icons/dist/circle-minus.svg",
+ "panel_ids" : [
+ "nutriscore_component_energy",
+ "nutriscore_component_sugars",
+ "nutriscore_component_saturated_fat",
+ "nutriscore_component_salt"
+ ],
+ "title" : "Negative points: 1/55"
+ }
+ },
+ {
+ "element_type" : "panel_group",
+ "panel_group_element" : {
+ "evaluation" : "good",
+ "icon_color_from_evaluation" : true,
+ "icon_size" : "small",
+ "icon_url" : "https://static.openfoodfacts.org/images/icons/dist/circle-plus.svg",
+ "panel_ids" : [
+ "nutriscore_component_proteins",
+ "nutriscore_component_fiber",
+ "nutriscore_component_fruits_vegetables_legumes"
+ ],
+ "title" : "Positive points: 2/17"
+ }
+ },
+ {
+ "element_type" : "panel",
+ "panel_element" : {
+ "panel_id" : "nutriscore_details"
+ }
+ }
+ ],
+ "level" : "info",
+ "title_element" : {
+ "grade" : "a",
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/nutriscore-a-new-en.svg",
+ "subtitle" : "Very good nutritional quality",
+ "title" : "Nutri-Score A",
+ "type" : "grade"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_energy" : {
"elements" : [
{
"element_type" : "text",
"text_element" : {
- "html" : "Warning: the amount of fruits, vegetables and nuts is not specified on the label, it was estimated from the list of ingredients: 65\n ",
- "type" : "warning"
+ "html" : "\n
\n \n Energy intakes above energy requirements are associated with increased risks of weight gain, overweight, obesity, and consequently risk of diet-related chronic diseases.\n
\n "
}
- },
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-negative-0-10.svg",
+ "subtitle" : "0/10 points (120kJ)",
+ "title" : "Calories"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_fiber" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n Consuming foods rich in fiber (especially whole grain foods) reduces the risks of aerodigestive cancers, cardiovascular diseases, obesity and diabetes.\n \n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-positive-0-5.svg",
+ "subtitle" : "0/5 points (3g)",
+ "title" : "Fiber"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_fruits_vegetables_legumes" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n Consuming foods rich in fruits, vegetables and legumes reduces the risks of aerodigestive cancers, cardiovascular diseases, obesity and diabetes.\n \n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-positive-2-5.svg",
+ "subtitle" : "2/5 points (65%)",
+ "title" : "Fruits, vegetables and legumes"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_proteins" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n Foods that are rich in proteins are usually rich in calcium or iron which are essential minerals with numerous health benefits.\n \n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-positive-0-7.svg",
+ "subtitle" : "0/7 points (1g)",
+ "title" : "Proteins"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_salt" : {
+ "elements" : [
{
"element_type" : "text",
"text_element" : {
- "html" : "\n\nThis product is not considered a beverage for the calculation of the Nutri-Score.
\n\n\n\n\n\n \n Positive points: 5 \n
\n\n \n \n \n Proteins:\n0 / 5\n(value: 1, \n rounded value: 1)\n \n \n \n Fiber:\n3 / 5\n(value: 3, \n rounded value: 3)\n \n \n \n Fruits, vegetables, nuts, and colza/walnut/olive oils:\n2 / 5\n(value: 65, \n rounded value: 65)\n \n \n \n\n\n\n \n Negative points: 1 \n
\n\n \n \n \n Energy:\n0 / 10\n(value: 120, \n rounded value: 120)\n \n \n \n Sugars:\n0 / 10\n(value: 0.5, \n rounded value: 0.5)\n \n \n \n Saturated fat:\n0 / 10\n(value: 0.2, \n rounded value: 0.2)\n \n \n \n Sodium:\n1 / 10\n(value: 160, \n rounded value: 160)\n \n \n \n\n\n\nThe points for proteins are counted because the negative points are less than 11.
\n\n\n Nutritional score: \n (1 - 5)\n
\nNutri-Score:
\n\n"
+ "html" : "\n\n \n A high consumption of salt (or sodium) can cause raised blood pressure, which can increase the risk of heart disease and stroke.\n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-negative-1-20.svg",
+ "subtitle" : "1/20 points (0.4g)",
+ "title" : "Salt"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_saturated_fat" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n \n A high consumption of fat, especially saturated fats, can raise cholesterol, which increases the risk of heart diseases.\n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-negative-0-10.svg",
+ "subtitle" : "0/10 points (0.2g)",
+ "title" : "Saturated fat"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_component_sugars" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n \n A high consumption of sugar can cause weight gain and tooth decay. It also augments the risk of type 2 diabetes and cardio-vascular diseases.\n
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "size" : "small",
+ "title_element" : {
+ "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/points-negative-0-15.svg",
+ "subtitle" : "0/15 points (0.5g)",
+ "title" : "Sugar"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_description" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "The Nutri-Score is a logo on the overall nutritional quality of products.
\n\nThe score from A to E is calculated based on nutrients and foods to favor (proteins, fiber, fruits, vegetables and legumes ...) and nutrients to limit (calories, saturated fat, sugars, salt).\nThe score is calculated from the data of the nutrition facts table and the composition data (fruits, vegetables and legumes).\n
\n\n ",
+ "type" : "info"
}
},
{
@@ -1924,10 +2054,37 @@
],
"level" : "info",
"title_element" : {
- "grade" : "a",
- "icon_url" : "https://static.openfoodfacts.org/images/attributes/dist/nutriscore-a.svg",
- "title" : "Very good nutritional quality",
- "type" : "grade"
+ "icon_size" : "small",
+ "icon_url" : "https://static.openfoodfacts.org/images/icons/dist/info.svg",
+ "title" : "What is the Nutri-Score?",
+ "type" : "info"
+ },
+ "topics" : [
+ "health"
+ ]
+ },
+ "nutriscore_details" : {
+ "elements" : [
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "Warning: the amount of fruits, vegetables and nuts is not specified on the label, it was estimated from the list of ingredients: 65\n ",
+ "type" : "warning"
+ }
+ },
+ {
+ "element_type" : "text",
+ "text_element" : {
+ "html" : "\n\n This product is not considered a beverage for the calculation of the Nutri-Score.
\n\n\n\n\n\nPoints for proteins are counted because the negative points are less than 11.
\n\n\n Nutritional score: -1 \n (1 - 2)\n
\nNutri-Score: A
\n "
+ }
+ }
+ ],
+ "level" : "info",
+ "title_element" : {
+ "icon_size" : "small",
+ "icon_url" : "https://static.openfoodfacts.org/images/icons/dist/info.svg",
+ "title" : "Details of the calculation of the Nutri-Score",
+ "type" : "info"
},
"topics" : [
"health"
@@ -1944,13 +2101,6 @@
"text" : "Nutrition facts",
"type" : "text"
},
- {
- "column_group_id" : "product",
- "shown_by_default" : true,
- "text" : "As sold for 100 g / 100 ml",
- "text_for_small_screens" : "100g",
- "type" : "text"
- },
{
"column_group_id" : "comparisons",
"shown_by_default" : true,
@@ -1967,9 +2117,6 @@
"style" : "max-width:15rem",
"text" : "Energy"
},
- {
- "text" : "120 kj (252 kcal)"
- },
{
"evaluation" : "good",
"text" : "-54%"
@@ -1983,12 +2130,9 @@
"style" : "max-width:15rem",
"text" : "Fat"
},
- {
- "text" : "0.5 g"
- },
{
"evaluation" : "good",
- "text" : "-69%"
+ "text" : "-68%"
}
]
},
@@ -1999,12 +2143,9 @@
"style" : "max-width:15rem",
"text" : "Saturated fat"
},
- {
- "text" : "0.2 g"
- },
{
"evaluation" : "good",
- "text" : "-45%"
+ "text" : "-42%"
}
]
},
@@ -2015,12 +2156,9 @@
"style" : "max-width:15rem",
"text" : "Salt"
},
- {
- "text" : "0.4 g"
- },
{
"evaluation" : "good",
- "text" : "-41%"
+ "text" : "-40%"
}
]
},
@@ -2031,9 +2169,6 @@
"style" : "max-width:15rem",
"text" : "Carbohydrates"
},
- {
- "text" : "4 g"
- },
{
"text" : "-63%"
}
@@ -2046,12 +2181,9 @@
"style" : "max-width:15rem",
"text" : "Fiber"
},
- {
- "text" : "3 g"
- },
{
"evaluation" : "good",
- "text" : "+94%"
+ "text" : "+96%"
}
]
},
@@ -2062,12 +2194,9 @@
"style" : "max-width:15rem",
"text" : "Sugars"
},
- {
- "text" : "0.5 g"
- },
{
"evaluation" : "good",
- "text" : "-82%"
+ "text" : "-83%"
}
]
},
@@ -2078,9 +2207,6 @@
"style" : "max-width:15rem",
"text" : "Proteins"
},
- {
- "text" : "1 g"
- },
{
"evaluation" : "bad",
"text" : "-56%"
@@ -2094,9 +2220,6 @@
"style" : "max-width:15rem",
"text" : "Fruits‚ vegetables‚ nuts and rapeseed‚ walnut and olive oils (estimate from ingredients list analysis)"
},
- {
- "text" : "65 %"
- },
{
"text" : ""
}
@@ -2182,7 +2305,7 @@
"element_type" : "text",
"text_element" : {
"evaluation" : "good",
- "html" : "\n \n \n 1 x \n \n Bottle\n \n \n \n (Glass)\n \n \n \n \n \n 1 x \n \n Bottle cap\n \n \n \n (Steel)\n \n \n \n \n ",
+ "html" : "\n \n \n \n \n Bottle\n \n \n \n (Glass)\n \n \n \n \n \n \n \n Bottle cap\n \n \n \n (Steel)\n \n \n \n \n ",
"icon_alt" : "Recycle",
"icon_color_from_evaluation" : true,
"icon_url" : "https://static.openfoodfacts.org/images/icons/dist/recycle-variant.svg",
@@ -2358,22 +2481,14 @@
}
},
"labels_tags" : [
- "en:fair-trade",
"en:organic",
- "en:vegetarian",
"en:eu-organic",
- "en:vegan",
- "en:green-dot",
- "en:nutriscore"
+ "en:fair-trade"
],
"labels_tags_fr" : [
- "Commerce équitable",
"Bio",
- "Végétarien",
"Bio européen",
- "Végétalien",
- "Point Vert",
- "Nutriscore"
+ "Commerce équitable"
],
"lang" : "en",
"nutrient_levels" : {
@@ -2388,13 +2503,8 @@
"carbohydrates_unit" : "g",
"carbohydrates_value" : 4,
"carbon-footprint-from-known-ingredients_100g" : 18,
- "carbon-footprint-from-known-ingredients_product" : 18,
+ "carbon-footprint-from-known-ingredients_product" : 36,
"energy" : 120,
- "energy-kcal" : 252,
- "energy-kcal_100g" : 252,
- "energy-kcal_unit" : "kcal",
- "energy-kcal_value" : 252,
- "energy-kcal_value_computed" : 30.5,
"energy-kj" : 120,
"energy-kj_100g" : 120,
"energy-kj_unit" : "kJ",
@@ -2443,44 +2553,8 @@
},
"nutrition_grade_fr" : "a",
"product_name" : "A good product for you",
- "product_quantity" : "100",
- "quantity" : "100 g",
- "selected_images" : {
- "ingredients" : {
- "display" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.400.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_es.113.400.jpg",
- "fr" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_fr.123.400.jpg",
- "it" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_it.140.400.jpg"
- },
- "small" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.200.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_es.113.200.jpg",
- "fr" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_fr.123.200.jpg",
- "it" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_it.140.200.jpg"
- },
- "thumb" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_en.120.100.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_es.113.100.jpg",
- "fr" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_fr.123.100.jpg",
- "it" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/ingredients_it.140.100.jpg"
- }
- },
- "nutrition" : {
- "display" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.400.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_es.115.400.jpg"
- },
- "small" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.200.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_es.115.200.jpg"
- },
- "thumb" : {
- "en" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_en.109.100.jpg",
- "es" : "https://images.openfoodfacts.org/images/products/093/270/067/481501/nutrition_es.115.100.jpg"
- }
- }
- },
+ "product_quantity" : "200",
+ "quantity" : "200 g",
"states_tags" : [
"en:to-be-completed",
"en:nutrition-facts-completed",
@@ -2494,12 +2568,7 @@
"en:packaging-to-be-completed",
"en:quantity-completed",
"en:product-name-completed",
- "en:photos-to-be-validated",
- "en:packaging-photo-to-be-selected",
- "en:nutrition-photo-selected",
- "en:ingredients-photo-selected",
- "en:front-photo-to-be-selected",
- "en:photos-uploaded"
+ "en:photos-to-be-uploaded"
]
},
"status" : 1,
diff --git a/packages/smooth_app/assets/onboarding/scan.svg b/packages/smooth_app/assets/onboarding/scan.svg
deleted file mode 100644
index 0baf01438d4..00000000000
--- a/packages/smooth_app/assets/onboarding/scan.svg
+++ /dev/null
@@ -1,74 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/packages/smooth_app/ios/Gemfile.lock b/packages/smooth_app/ios/Gemfile.lock
index d039a2eb59a..6c82f499c3b 100644
--- a/packages/smooth_app/ios/Gemfile.lock
+++ b/packages/smooth_app/ios/Gemfile.lock
@@ -16,17 +16,17 @@ GEM
artifactory (3.0.17)
atomos (0.1.3)
aws-eventstream (1.3.0)
- aws-partitions (1.907.0)
- aws-sdk-core (3.191.6)
+ aws-partitions (1.945.0)
+ aws-sdk-core (3.197.1)
aws-eventstream (~> 1, >= 1.3.0)
aws-partitions (~> 1, >= 1.651.0)
aws-sigv4 (~> 1.8)
jmespath (~> 1, >= 1.6.1)
- aws-sdk-kms (1.78.0)
- aws-sdk-core (~> 3, >= 3.191.0)
+ aws-sdk-kms (1.85.0)
+ aws-sdk-core (~> 3, >= 3.197.0)
aws-sigv4 (~> 1.1)
- aws-sdk-s3 (1.146.1)
- aws-sdk-core (~> 3, >= 3.191.0)
+ aws-sdk-s3 (1.152.3)
+ aws-sdk-core (~> 3, >= 3.197.0)
aws-sdk-kms (~> 1)
aws-sigv4 (~> 1.8)
aws-sigv4 (1.8.0)
@@ -75,7 +75,7 @@ GEM
faraday_middleware (1.2.0)
faraday (~> 1.0)
fastimage (2.3.1)
- fastlane (2.220.0)
+ fastlane (2.221.1)
CFPropertyList (>= 2.3, < 4.0.0)
addressable (>= 2.8, < 3.0.0)
artifactory (~> 3.0)
@@ -156,31 +156,32 @@ GEM
os (>= 0.9, < 2.0)
signet (>= 0.16, < 2.a)
highline (2.0.3)
- http-cookie (1.0.5)
+ http-cookie (1.0.6)
domain_name (~> 0.5)
httpclient (2.8.3)
jmespath (1.6.2)
json (2.7.2)
- jwt (2.8.1)
+ jwt (2.8.2)
base64
- mini_magick (4.12.0)
+ mini_magick (4.13.1)
mini_mime (1.1.5)
multi_json (1.15.0)
- multipart-post (2.4.0)
+ multipart-post (2.4.1)
nanaimo (0.3.0)
naturally (2.2.1)
nkf (0.2.0)
- optparse (0.4.0)
+ optparse (0.5.0)
os (1.1.4)
plist (3.7.1)
- public_suffix (5.0.5)
- rake (13.2.0)
+ public_suffix (5.1.1)
+ rake (13.2.1)
representable (3.2.0)
declarative (< 0.1.0)
trailblazer-option (>= 0.1.1, < 0.2.0)
uber (< 0.2.0)
retriable (3.1.2)
- rexml (3.2.6)
+ rexml (3.2.9)
+ strscan
rouge (2.0.7)
ruby2_keywords (0.0.5)
rubyzip (2.3.2)
@@ -193,6 +194,7 @@ GEM
simctl (1.6.10)
CFPropertyList
naturally
+ strscan (3.1.0)
terminal-notifier (2.0.0)
terminal-table (3.0.2)
unicode-display_width (>= 1.1.1, < 3)
diff --git a/packages/smooth_app/ios/Podfile.lock b/packages/smooth_app/ios/Podfile.lock
index 9043c25aa38..04989447e33 100644
--- a/packages/smooth_app/ios/Podfile.lock
+++ b/packages/smooth_app/ios/Podfile.lock
@@ -11,7 +11,7 @@ PODS:
- device_info_plus (0.0.1):
- Flutter
- Flutter (1.0.0)
- - flutter_custom_tabs (0.0.1):
+ - flutter_custom_tabs_ios (2.0.0):
- Flutter
- flutter_email_sender (0.0.1):
- Flutter
@@ -26,12 +26,9 @@ PODS:
- Flutter
- flutter_secure_storage (6.0.0):
- Flutter
- - FMDB (2.7.5):
- - FMDB/standard (= 2.7.5)
- - FMDB/standard (2.7.5)
- - GoogleDataTransport (9.2.5):
+ - GoogleDataTransport (9.4.1):
- GoogleUtilities/Environment (~> 7.7)
- - nanopb (< 2.30910.0, >= 2.30908.0)
+ - nanopb (< 2.30911.0, >= 2.30908.0)
- PromisesObjC (< 3.0, >= 1.2)
- GoogleMLKit/BarcodeScanning (4.0.0):
- GoogleMLKit/MLKitCore
@@ -50,12 +47,16 @@ PODS:
- GoogleToolboxForMac/Defines (= 2.3.2)
- "GoogleToolboxForMac/NSString+URLArguments (= 2.3.2)"
- "GoogleToolboxForMac/NSString+URLArguments (2.3.2)"
- - GoogleUtilities/Environment (7.12.0):
+ - GoogleUtilities/Environment (7.13.3):
+ - GoogleUtilities/Privacy
- PromisesObjC (< 3.0, >= 1.2)
- - GoogleUtilities/Logger (7.12.0):
+ - GoogleUtilities/Logger (7.13.3):
- GoogleUtilities/Environment
- - GoogleUtilities/UserDefaults (7.12.0):
+ - GoogleUtilities/Privacy
+ - GoogleUtilities/Privacy (7.13.3)
+ - GoogleUtilities/UserDefaults (7.13.3):
- GoogleUtilities/Logger
+ - GoogleUtilities/Privacy
- GoogleUtilitiesComponents (1.1.0):
- GoogleUtilities/Logger
- GTMSessionFetcher/Core (2.3.0)
@@ -100,44 +101,42 @@ PODS:
- GTMSessionFetcher/Core (< 3.0, >= 1.1)
- MLImage (= 1.0.0-beta4)
- MLKitCommon (~> 9.0)
- - mobile_scanner (3.5.2):
+ - mobile_scanner (3.5.6):
- Flutter
- GoogleMLKit/BarcodeScanning (~> 4.0.0)
- MTBBarcodeScanner (5.0.11)
- - nanopb (2.30909.1):
- - nanopb/decode (= 2.30909.1)
- - nanopb/encode (= 2.30909.1)
- - nanopb/decode (2.30909.1)
- - nanopb/encode (2.30909.1)
+ - nanopb (2.30910.0):
+ - nanopb/decode (= 2.30910.0)
+ - nanopb/encode (= 2.30910.0)
+ - nanopb/decode (2.30910.0)
+ - nanopb/encode (2.30910.0)
- package_info_plus (0.4.5):
- Flutter
- path_provider_foundation (0.0.1):
- Flutter
- FlutterMacOS
- - permission_handler_apple (9.1.1):
+ - permission_handler_apple (9.3.0):
- Flutter
- - PromisesObjC (2.3.1)
+ - PromisesObjC (2.4.0)
- qr_code_scanner (0.2.0):
- Flutter
- MTBBarcodeScanner
- - ReachabilitySwift (5.0.0)
+ - ReachabilitySwift (5.2.2)
- rive_common (0.0.1):
- Flutter
- - SDWebImage (5.18.5):
- - SDWebImage/Core (= 5.18.5)
- - SDWebImage/Core (5.18.5)
- - SDWebImageWebPCoder (0.14.2):
+ - SDWebImage (5.19.2):
+ - SDWebImage/Core (= 5.19.2)
+ - SDWebImage/Core (5.19.2)
+ - SDWebImageWebPCoder (0.14.6):
- libwebp (~> 1.0)
- SDWebImage/Core (~> 5.17)
- - sensors_plus (0.0.1):
- - Flutter
- - Sentry/HybridSDK (8.15.2):
- - SentryPrivate (= 8.15.2)
+ - Sentry/HybridSDK (8.21.0):
+ - SentryPrivate (= 8.21.0)
- sentry_flutter (0.0.1):
- Flutter
- FlutterMacOS
- - Sentry/HybridSDK (= 8.15.2)
- - SentryPrivate (8.15.2)
+ - Sentry/HybridSDK (= 8.21.0)
+ - SentryPrivate (8.21.0)
- share_plus (0.0.1):
- Flutter
- shared_preferences_foundation (0.0.1):
@@ -145,7 +144,7 @@ PODS:
- FlutterMacOS
- sqflite (0.0.3):
- Flutter
- - FMDB (>= 2.7.5)
+ - FlutterMacOS
- url_launcher_ios (0.0.1):
- Flutter
- webview_flutter_wkwebview (0.0.1):
@@ -158,7 +157,7 @@ DEPENDENCIES:
- connectivity_plus (from `.symlinks/plugins/connectivity_plus/ios`)
- device_info_plus (from `.symlinks/plugins/device_info_plus/ios`)
- Flutter (from `Flutter`)
- - flutter_custom_tabs (from `.symlinks/plugins/flutter_custom_tabs/ios`)
+ - flutter_custom_tabs_ios (from `.symlinks/plugins/flutter_custom_tabs_ios/ios`)
- flutter_email_sender (from `.symlinks/plugins/flutter_email_sender/ios`)
- flutter_icmp_ping (from `.symlinks/plugins/flutter_icmp_ping/ios`)
- flutter_image_compress_common (from `.symlinks/plugins/flutter_image_compress_common/ios`)
@@ -174,17 +173,15 @@ DEPENDENCIES:
- permission_handler_apple (from `.symlinks/plugins/permission_handler_apple/ios`)
- qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`)
- rive_common (from `.symlinks/plugins/rive_common/ios`)
- - sensors_plus (from `.symlinks/plugins/sensors_plus/ios`)
- sentry_flutter (from `.symlinks/plugins/sentry_flutter/ios`)
- share_plus (from `.symlinks/plugins/share_plus/ios`)
- shared_preferences_foundation (from `.symlinks/plugins/shared_preferences_foundation/darwin`)
- - sqflite (from `.symlinks/plugins/sqflite/ios`)
+ - sqflite (from `.symlinks/plugins/sqflite/darwin`)
- url_launcher_ios (from `.symlinks/plugins/url_launcher_ios/ios`)
- webview_flutter_wkwebview (from `.symlinks/plugins/webview_flutter_wkwebview/ios`)
SPEC REPOS:
trunk:
- - FMDB
- GoogleDataTransport
- GoogleMLKit
- GoogleToolboxForMac
@@ -219,8 +216,8 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/device_info_plus/ios"
Flutter:
:path: Flutter
- flutter_custom_tabs:
- :path: ".symlinks/plugins/flutter_custom_tabs/ios"
+ flutter_custom_tabs_ios:
+ :path: ".symlinks/plugins/flutter_custom_tabs_ios/ios"
flutter_email_sender:
:path: ".symlinks/plugins/flutter_email_sender/ios"
flutter_icmp_ping:
@@ -251,8 +248,6 @@ EXTERNAL SOURCES:
:path: ".symlinks/plugins/qr_code_scanner/ios"
rive_common:
:path: ".symlinks/plugins/rive_common/ios"
- sensors_plus:
- :path: ".symlinks/plugins/sensors_plus/ios"
sentry_flutter:
:path: ".symlinks/plugins/sentry_flutter/ios"
share_plus:
@@ -260,7 +255,7 @@ EXTERNAL SOURCES:
shared_preferences_foundation:
:path: ".symlinks/plugins/shared_preferences_foundation/darwin"
sqflite:
- :path: ".symlinks/plugins/sqflite/ios"
+ :path: ".symlinks/plugins/sqflite/darwin"
url_launcher_ios:
:path: ".symlinks/plugins/url_launcher_ios/ios"
webview_flutter_wkwebview:
@@ -269,25 +264,24 @@ EXTERNAL SOURCES:
SPEC CHECKSUMS:
app_settings: 017320c6a680cdc94c799949d95b84cb69389ebc
audioplayers_darwin: 877d9a4d06331c5c374595e46e16453ac7eafa40
- camera_avfoundation: 8b8d780bcfb6a4a02b0fbe2b4bd17b5b71946e68
+ camera_avfoundation: 759172d1a77ae7be0de08fc104cfb79738b8a59e
connectivity_plus: bf0076dd84a130856aa636df1c71ccaff908fa1d
device_info_plus: c6fb39579d0f423935b0c9ce7ee2f44b71b9fce6
Flutter: e0871f40cf51350855a761d2e70bf5af5b9b5de7
- flutter_custom_tabs: 7a10a08686955cb748e5d26e0ae586d30689bf89
- flutter_email_sender: 02d7443217d8c41483223627972bfdc09f74276b
+ flutter_custom_tabs_ios: a651b18786388923b62de8c0537607de87c2eccf
+ flutter_email_sender: 10a22605f92809a11ef52b2f412db806c6082d40
flutter_icmp_ping: 2b159955eee0c487c766ad83fec224ae35e7c935
flutter_image_compress_common: ec1d45c362c9d30a3f6a0426c297f47c52007e3e
- flutter_native_splash: 52501b97d1c0a5f898d687f1646226c1f93c56ef
- flutter_secure_storage: 23fc622d89d073675f2eaa109381aefbcf5a49be
- FMDB: 2ce00b547f966261cd18927a3ddb07cb6f3db82a
- GoogleDataTransport: 54dee9d48d14580407f8f5fbf2f496e92437a2f2
+ flutter_native_splash: edf599c81f74d093a4daf8e17bd7a018854bc778
+ flutter_secure_storage: d33dac7ae2ea08509be337e775f6b59f1ff45f12
+ GoogleDataTransport: 6c09b596d841063d76d4288cc2d2f42cc36e1e2a
GoogleMLKit: 2bd0dc6253c4d4f227aad460f69215a504b2980e
GoogleToolboxForMac: 8bef7c7c5cf7291c687cf5354f39f9db6399ad34
- GoogleUtilities: 0759d1a57ebb953965c2dfe0ba4c82e95ccc2e34
+ GoogleUtilities: ea963c370a38a8069cc5f7ba4ca849a60b6d7d15
GoogleUtilitiesComponents: 679b2c881db3b615a2777504623df6122dd20afe
GTMSessionFetcher: 3a63d75eecd6aa32c2fc79f578064e1214dfdec2
- image_picker_ios: 99dfe1854b4fa34d0364e74a78448a0151025425
- in_app_review: 4a97249f7a2f539a0f294c2d9196b7fe35e49541
+ image_picker_ios: c560581cceedb403a6ff17f2f816d7fea1421fc1
+ in_app_review: 318597b3a06c22bb46dc454d56828c85f444f99d
integration_test: 13825b8a9334a850581300559b8839134b124670
iso_countries: eb09d40f388e4c65e291e0bb36a701dfe7de6c74
libwebp: 1786c9f4ff8a279e4dac1e8f385004d5fc253009
@@ -296,28 +290,27 @@ SPEC CHECKSUMS:
MLKitBarcodeScanning: 04e264482c5f3810cb89ebc134ef6b61e67db505
MLKitCommon: c1b791c3e667091918d91bda4bba69a91011e390
MLKitVision: 8baa5f46ee3352614169b85250574fde38c36f49
- mobile_scanner: 5090a13b7a35fc1c25b0d97e18e84f271a6eb605
+ mobile_scanner: 38dcd8a49d7d485f632b7de65e4900010187aef2
MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb
- nanopb: d4d75c12cd1316f4a64e3c6963f879ecd4b5e0d5
+ nanopb: 438bc412db1928dac798aa6fd75726007be04262
package_info_plus: 115f4ad11e0698c8c1c5d8a689390df880f47e85
- path_provider_foundation: 3784922295ac71e43754bd15e0653ccfd36a147c
- permission_handler_apple: e76247795d700c14ea09e3a2d8855d41ee80a2e6
- PromisesObjC: c50d2056b5253dadbd6c2bea79b0674bd5a52fa4
+ path_provider_foundation: 2b6b4c569c0fb62ec74538f866245ac84301af46
+ permission_handler_apple: 9878588469a2b0d0fc1e048d9f43605f92e6cec2
+ PromisesObjC: f5707f49cb48b9636751c5b2e7d227e43fba9f47
qr_code_scanner: bb67d64904c3b9658ada8c402e8b4d406d5d796e
- ReachabilitySwift: 985039c6f7b23a1da463388634119492ff86c825
- rive_common: 3a4c254c6e4db7e4b9e05daeb3d1f47ae4f7bf76
- SDWebImage: 7ac2b7ddc5e8484c79aa90fc4e30b149d6a2c88f
- SDWebImageWebPCoder: 633b813fca24f1de5e076bcd7f720c038b23892b
- sensors_plus: 4ee32bc7d61a055f27f88d3215ad6b6fb96a2b8e
- Sentry: 6f5742b4c47c17c9adcf265f6f328cf4a0ed1923
- sentry_flutter: 2c309a1d4b45e59d02cfa15795705687f1e2081b
- SentryPrivate: b2f7996f37781080f04a946eb4e377ff63c64195
+ ReachabilitySwift: 2128f3a8c9107e1ad33574c6e58e8285d460b149
+ rive_common: cbbac3192af00d7341f19dae2f26298e9e37d99e
+ SDWebImage: dfe95b2466a9823cf9f0c6d01217c06550d7b29a
+ SDWebImageWebPCoder: e38c0a70396191361d60c092933e22c20d5b1380
+ Sentry: ebc12276bd17613a114ab359074096b6b3725203
+ sentry_flutter: dff1df05dc39c83d04f9330b36360fc374574c5e
+ SentryPrivate: d651efb234cf385ec9a1cdd3eff94b5e78a0e0fe
share_plus: c3fef564749587fc939ef86ffb283ceac0baf9f5
- shared_preferences_foundation: b4c3b4cddf1c21f02770737f147a3f5da9d39695
- sqflite: 31f7eba61e3074736dff8807a9b41581e4f7f15a
- url_launcher_ios: bbd758c6e7f9fd7b5b1d4cde34d2b95fcce5e812
- webview_flutter_wkwebview: b7e70ef1ddded7e69c796c7390ee74180182971f
+ shared_preferences_foundation: fcdcbc04712aee1108ac7fda236f363274528f78
+ sqflite: 673a0e54cc04b7d6dba8d24fb8095b31c3a99eec
+ url_launcher_ios: 5334b05cef931de560670eeae103fd3e431ac3fe
+ webview_flutter_wkwebview: be0f0d33777f1bfd0c9fdcb594786704dbf65f36
PODFILE CHECKSUM: a2ded99d2ba03f677e98efb8fb92d57b3a65b96f
-COCOAPODS: 1.14.3
+COCOAPODS: 1.15.2
diff --git a/packages/smooth_app/ios/Runner.xcodeproj/project.pbxproj b/packages/smooth_app/ios/Runner.xcodeproj/project.pbxproj
index 6352802e1ff..2d833e8484c 100644
--- a/packages/smooth_app/ios/Runner.xcodeproj/project.pbxproj
+++ b/packages/smooth_app/ios/Runner.xcodeproj/project.pbxproj
@@ -266,6 +266,7 @@
9705A1C41CF9048500538489 /* Embed Frameworks */,
3B06AD1E1E4923F5004D2608 /* Thin Binary */,
63B6828CA84AAF83AA1EFDEA /* [CP] Embed Pods Frameworks */,
+ 7B7420C49BA891584B8660ED /* [CP] Copy Pods Resources */,
);
buildRules = (
);
@@ -282,7 +283,7 @@
97C146E61CF9000F007C117D /* Project object */ = {
isa = PBXProject;
attributes = {
- LastUpgradeCheck = 1430;
+ LastUpgradeCheck = 1510;
ORGANIZATIONNAME = "";
TargetAttributes = {
97C146ED1CF9000F007C117D = {
@@ -483,6 +484,23 @@
shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-frameworks.sh\"\n";
showEnvVarsInLog = 0;
};
+ 7B7420C49BA891584B8660ED /* [CP] Copy Pods Resources */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-input-files.xcfilelist",
+ );
+ name = "[CP] Copy Pods Resources";
+ outputFileListPaths = (
+ "${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources-${CONFIGURATION}-output-files.xcfilelist",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Runner/Pods-Runner-resources.sh\"\n";
+ showEnvVarsInLog = 0;
+ };
9740EEB61CF901F6004384FC /* Run Script */ = {
isa = PBXShellScriptBuildPhase;
alwaysOutOfDate = 1;
@@ -603,11 +621,9 @@
3B866D912A81BF8800CEE82C /* yi */,
3B866D922A81BF8800CEE82C /* xh */,
3B866D932A81BF8900CEE82C /* wo */,
- 3B866D942A81BF8900CEE82C /* vls */,
3B866D952A81BF8A00CEE82C /* cy */,
3B866D962A81BF8A00CEE82C /* wa */,
3B866D972A81BF8B00CEE82C /* vi */,
- 3B866D982A81BF8C00CEE82C /* vec */,
3B866D992A81BF8C00CEE82C /* ve */,
3B866D9B2A81BF8D00CEE82C /* uz */,
3B866D9C2A81BF8E00CEE82C /* ug */,
diff --git a/packages/smooth_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme b/packages/smooth_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
index a6b826db27d..5e31d3d342f 100644
--- a/packages/smooth_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
+++ b/packages/smooth_app/ios/Runner.xcodeproj/xcshareddata/xcschemes/Runner.xcscheme
@@ -1,6 +1,6 @@
ProductQuery.uriProductHelper;
+
+ /// Returns true if tasks with the same stamp would overwrite each-other.
+ bool isDeduplicable() => true;
}
diff --git a/packages/smooth_app/lib/background/background_task_add_price.dart b/packages/smooth_app/lib/background/background_task_add_price.dart
new file mode 100644
index 00000000000..bff36bc9f2c
--- /dev/null
+++ b/packages/smooth_app/lib/background/background_task_add_price.dart
@@ -0,0 +1,416 @@
+import 'dart:async';
+
+import 'package:crop_image/crop_image.dart';
+import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+import 'package:http_parser/http_parser.dart';
+import 'package:openfoodfacts/openfoodfacts.dart';
+import 'package:provider/provider.dart';
+import 'package:smooth_app/background/background_task.dart';
+import 'package:smooth_app/background/background_task_image.dart';
+import 'package:smooth_app/background/background_task_upload.dart';
+import 'package:smooth_app/background/operation_type.dart';
+import 'package:smooth_app/database/local_database.dart';
+import 'package:smooth_app/pages/crop_parameters.dart';
+import 'package:smooth_app/pages/prices/eraser_model.dart';
+import 'package:smooth_app/pages/prices/eraser_painter.dart';
+
+// TODO(monsieurtanuki): use transient file, in order to have instant access to proof image?
+/// Background task about adding a product price.
+class BackgroundTaskAddPrice extends BackgroundTask {
+ BackgroundTaskAddPrice._({
+ required super.processName,
+ required super.uniqueId,
+ required super.stamp,
+ // single
+ required this.fullPath,
+ required this.rotationDegrees,
+ required this.cropX1,
+ required this.cropY1,
+ required this.cropX2,
+ required this.cropY2,
+ required this.proofType,
+ required this.date,
+ required this.currency,
+ required this.locationOSMId,
+ required this.locationOSMType,
+ // lines
+ required this.eraserCoordinates,
+ // multi
+ required this.barcodes,
+ required this.pricesAreDiscounted,
+ required this.prices,
+ required this.pricesWithoutDiscount,
+ });
+
+ BackgroundTaskAddPrice.fromJson(Map json)
+ : fullPath = json[_jsonTagImagePath] as String,
+ rotationDegrees = json[_jsonTagRotation] as int? ?? 0,
+ cropX1 = json[_jsonTagX1] as int? ?? 0,
+ cropY1 = json[_jsonTagY1] as int? ?? 0,
+ cropX2 = json[_jsonTagX2] as int? ?? 0,
+ cropY2 = json[_jsonTagY2] as int? ?? 0,
+ proofType = ProofType.fromOffTag(json[_jsonTagProofType] as String)!,
+ date = JsonHelper.stringTimestampToDate(json[_jsonTagDate] as String),
+ currency = Currency.fromName(json[_jsonTagCurrency] as String)!,
+ locationOSMId = json[_jsonTagOSMId] as int,
+ locationOSMType =
+ LocationOSMType.fromOffTag(json[_jsonTagOSMType] as String)!,
+ eraserCoordinates =
+ _fromJsonListDouble(json[_jsonTagEraserCoordinates]),
+ barcodes = json.containsKey(_jsonTagBarcode)
+ ? [json[_jsonTagBarcode] as String]
+ : _fromJsonListString(json[_jsonTagBarcodes])!,
+ pricesAreDiscounted = json.containsKey(_jsonTagIsDiscounted)
+ ? [json[_jsonTagIsDiscounted] as bool]
+ : _fromJsonListBool(json[_jsonTagAreDiscounted])!,
+ prices = json.containsKey(_jsonTagPrice)
+ ? [json[_jsonTagPrice] as double]
+ : _fromJsonListDouble(json[_jsonTagPrices])!,
+ pricesWithoutDiscount = json.containsKey(_jsonTagPriceWithoutDiscount)
+ ? [json[_jsonTagPriceWithoutDiscount] as double?]
+ : _fromJsonListNullableDouble(json[_jsonTagPricesWithoutDiscount])!,
+ super.fromJson(json);
+
+ static List? _fromJsonListDouble(final List? input) {
+ if (input == null) {
+ return null;
+ }
+ final List result = [];
+ for (final dynamic item in input) {
+ result.add(item as double);
+ }
+ return result;
+ }
+
+ static List? _fromJsonListNullableDouble(
+ final List? input,
+ ) {
+ if (input == null) {
+ return null;
+ }
+ final List result = [];
+ for (final dynamic item in input) {
+ result.add(item as double?);
+ }
+ return result;
+ }
+
+ static List? _fromJsonListString(final List? input) {
+ if (input == null) {
+ return null;
+ }
+ final List result = [];
+ for (final dynamic item in input) {
+ result.add(item as String);
+ }
+ return result;
+ }
+
+ static List? _fromJsonListBool(final List? input) {
+ if (input == null) {
+ return null;
+ }
+ final List result = [];
+ for (final dynamic item in input) {
+ result.add(item as bool);
+ }
+ return result;
+ }
+
+ static const String _jsonTagImagePath = 'imagePath';
+ static const String _jsonTagRotation = 'rotation';
+ static const String _jsonTagX1 = 'x1';
+ static const String _jsonTagY1 = 'y1';
+ static const String _jsonTagX2 = 'x2';
+ static const String _jsonTagY2 = 'y2';
+ static const String _jsonTagProofType = 'proofType';
+ static const String _jsonTagDate = 'date';
+ static const String _jsonTagEraserCoordinates = 'eraserCoordinates';
+ static const String _jsonTagCurrency = 'currency';
+ static const String _jsonTagOSMId = 'osmId';
+ static const String _jsonTagOSMType = 'osmType';
+ static const String _jsonTagBarcodes = 'barcodes';
+ static const String _jsonTagAreDiscounted = 'areDiscounted';
+ static const String _jsonTagPrices = 'prices';
+ static const String _jsonTagPricesWithoutDiscount = 'pricesWithoutDiscount';
+ @Deprecated('Use [_jsonTagBarcodes] instead')
+ static const String _jsonTagBarcode = 'barcode';
+ @Deprecated('Use [_jsonTagAreDiscounted] instead')
+ static const String _jsonTagIsDiscounted = 'isDiscounted';
+ @Deprecated('Use [_jsonTagPrices] instead')
+ static const String _jsonTagPrice = 'price';
+ @Deprecated('Use [_jsonTagPricesWithoutDiscount] instead')
+ static const String _jsonTagPriceWithoutDiscount = 'priceWithoutDiscount';
+
+ static const OperationType _operationType = OperationType.addPrice;
+
+ final String fullPath;
+ final int rotationDegrees;
+ final int cropX1;
+ final int cropY1;
+ final int cropX2;
+ final int cropY2;
+ final ProofType proofType;
+ final DateTime date;
+ final Currency currency;
+ final int locationOSMId;
+ final LocationOSMType locationOSMType;
+ final List? eraserCoordinates;
+ // per line
+ final List barcodes;
+ final List pricesAreDiscounted;
+ final List prices;
+ final List pricesWithoutDiscount;
+
+ @override
+ Map toJson() {
+ final Map result = super.toJson();
+ result[_jsonTagImagePath] = fullPath;
+ result[_jsonTagRotation] = rotationDegrees;
+ result[_jsonTagX1] = cropX1;
+ result[_jsonTagY1] = cropY1;
+ result[_jsonTagX2] = cropX2;
+ result[_jsonTagY2] = cropY2;
+ result[_jsonTagProofType] = proofType.offTag;
+ result[_jsonTagDate] = date.toIso8601String();
+ result[_jsonTagCurrency] = currency.name;
+ result[_jsonTagOSMId] = locationOSMId;
+ result[_jsonTagOSMType] = locationOSMType.offTag;
+ result[_jsonTagEraserCoordinates] = eraserCoordinates;
+ result[_jsonTagBarcodes] = barcodes;
+ result[_jsonTagAreDiscounted] = pricesAreDiscounted;
+ result[_jsonTagPrices] = prices;
+ result[_jsonTagPricesWithoutDiscount] = pricesWithoutDiscount;
+ return result;
+ }
+
+ /// Adds the background task about uploading a product image.
+ static Future addTask({
+ required final BuildContext context,
+ required final CropParameters cropObject,
+ required final ProofType proofType,
+ required final DateTime date,
+ required final Currency currency,
+ required final int locationOSMId,
+ required final LocationOSMType locationOSMType,
+ required final List barcodes,
+ required final List pricesAreDiscounted,
+ required final List prices,
+ required final List pricesWithoutDiscount,
+ }) async {
+ final LocalDatabase localDatabase = context.read();
+ final String uniqueId = await _operationType.getNewKey(localDatabase);
+ final BackgroundTask task = _getNewTask(
+ uniqueId: uniqueId,
+ cropObject: cropObject,
+ proofType: proofType,
+ date: date,
+ currency: currency,
+ locationOSMId: locationOSMId,
+ locationOSMType: locationOSMType,
+ barcodes: barcodes,
+ pricesAreDiscounted: pricesAreDiscounted,
+ prices: prices,
+ pricesWithoutDiscount: pricesWithoutDiscount,
+ );
+ if (!context.mounted) {
+ return;
+ }
+ await task.addToManager(localDatabase, context: context);
+ }
+
+ @override
+ (String, AlignmentGeometry)? getFloatingMessage(
+ final AppLocalizations appLocalizations) =>
+ (
+ appLocalizations.add_price_queued,
+ AlignmentDirectional.center,
+ );
+
+ /// Returns a new background task about changing a product.
+ static BackgroundTaskAddPrice _getNewTask({
+ required final String uniqueId,
+ required final CropParameters cropObject,
+ required final ProofType proofType,
+ required final DateTime date,
+ required final Currency currency,
+ required final int locationOSMId,
+ required final LocationOSMType locationOSMType,
+ required final List barcodes,
+ required final List pricesAreDiscounted,
+ required final List prices,
+ required final List pricesWithoutDiscount,
+ }) =>
+ BackgroundTaskAddPrice._(
+ uniqueId: uniqueId,
+ processName: _operationType.processName,
+ fullPath: cropObject.fullFile!.path,
+ rotationDegrees: cropObject.rotation,
+ cropX1: cropObject.x1,
+ cropY1: cropObject.y1,
+ cropX2: cropObject.x2,
+ cropY2: cropObject.y2,
+ proofType: proofType,
+ date: date,
+ currency: currency,
+ locationOSMId: locationOSMId,
+ locationOSMType: locationOSMType,
+ eraserCoordinates: cropObject.eraserCoordinates,
+ barcodes: barcodes,
+ pricesAreDiscounted: pricesAreDiscounted,
+ prices: prices,
+ pricesWithoutDiscount: pricesWithoutDiscount,
+ stamp: _getStamp(
+ date: date,
+ locationOSMId: locationOSMId,
+ locationOSMType: locationOSMType,
+ ),
+ );
+
+ static String _getStamp({
+ required final DateTime date,
+ required final int locationOSMId,
+ required final LocationOSMType locationOSMType,
+ }) =>
+ 'no_barcode;price;$date;$locationOSMId;$locationOSMType';
+
+ @override
+ Future postExecute(
+ final LocalDatabase localDatabase,
+ final bool success,
+ ) async {
+ await super.postExecute(localDatabase, success);
+ try {
+ (await BackgroundTaskUpload.getFile(fullPath)).deleteSync();
+ } catch (e) {
+ // not likely, but let's not spoil the task for that either.
+ }
+ try {
+ (await BackgroundTaskUpload.getFile(
+ BackgroundTaskImage.getCroppedPath(fullPath)))
+ .deleteSync();
+ } catch (e) {
+ // possible, but let's not spoil the task for that either.
+ }
+ }
+
+ @override
+ Future preExecute(final LocalDatabase localDatabase) async {}
+
+ @override
+ Future execute(final LocalDatabase localDatabase) async {
+ final List offsets = [];
+ if (eraserCoordinates != null) {
+ for (int i = 0; i < eraserCoordinates!.length; i += 2) {
+ final Offset offset = Offset(
+ eraserCoordinates![i],
+ eraserCoordinates![i + 1],
+ );
+ offsets.add(offset);
+ }
+ }
+ final String? path = await BackgroundTaskImage.cropIfNeeded(
+ fullPath: fullPath,
+ croppedPath: BackgroundTaskImage.getCroppedPath(fullPath),
+ rotationDegrees: rotationDegrees,
+ cropX1: cropX1,
+ cropY1: cropY1,
+ cropX2: cropX2,
+ cropY2: cropY2,
+ overlayPainter: offsets.isEmpty
+ ? null
+ : EraserPainter(
+ eraserModel: EraserModel(
+ rotation: CropRotationExtension.fromDegrees(rotationDegrees)!,
+ offsets: offsets,
+ ),
+ cropRect: BackgroundTaskImage.getDownsizedRect(
+ cropX1,
+ cropY1,
+ cropX2,
+ cropY2,
+ ),
+ ),
+ );
+ if (path == null) {
+ // TODO(monsieurtanuki): maybe something more refined when we dismiss the picture, like alerting the user, though it's not supposed to happen anymore from upstream.
+ return;
+ }
+
+ // authentication
+ final User user = getUser();
+ final MaybeError token =
+ await OpenPricesAPIClient.getAuthenticationToken(
+ username: user.userId,
+ password: user.password,
+ uriHelper: uriProductHelper,
+ );
+ if (token.isError) {
+ throw Exception('Could not get token: ${token.error}');
+ }
+ if (token.value.isEmpty) {
+ throw Exception('Unexpected empty token');
+ }
+ final String bearerToken = token.value;
+
+ // proof upload
+ final Uri initialImageUri = Uri.parse(path);
+ final MediaType initialMediaType =
+ HttpHelper().imagineMediaType(initialImageUri.path)!;
+ final MaybeError uploadProof = await OpenPricesAPIClient.uploadProof(
+ proofType: proofType,
+ imageUri: initialImageUri,
+ mediaType: initialMediaType,
+ bearerToken: bearerToken,
+ uriHelper: uriProductHelper,
+ );
+ if (uploadProof.isError) {
+ throw Exception('Could not upload proof: ${uploadProof.error}');
+ }
+
+ for (int i = 0; i < barcodes.length; i++) {
+ final Price newPrice = Price()
+ ..date = date
+ ..currency = currency
+ ..locationOSMId = locationOSMId
+ ..locationOSMType = locationOSMType
+ ..proofId = uploadProof.value.id
+ ..priceIsDiscounted = pricesAreDiscounted[i]
+ ..price = prices[i]
+ ..priceWithoutDiscount = pricesWithoutDiscount[i]
+ ..productCode = barcodes[i];
+
+ // create price
+ final MaybeError addedPrice =
+ await OpenPricesAPIClient.createPrice(
+ price: newPrice,
+ bearerToken: bearerToken,
+ uriHelper: uriProductHelper,
+ );
+ if (addedPrice.isError) {
+ throw Exception('Could not add price: ${addedPrice.error}');
+ }
+ }
+
+ // close session
+ final MaybeError closedSession =
+ await OpenPricesAPIClient.deleteUserSession(
+ uriHelper: uriProductHelper,
+ bearerToken: bearerToken,
+ );
+ if (closedSession.isError) {
+ // TODO(monsieurtanuki): do we really care?
+ // throw Exception('Could not close session: ${closedSession.error}');
+ return;
+ }
+ if (!closedSession.value) {
+ // TODO(monsieurtanuki): do we really care?
+ // throw Exception('Could not really close session');
+ return;
+ }
+ }
+
+ @override
+ bool isDeduplicable() => false;
+}
diff --git a/packages/smooth_app/lib/background/background_task_crop.dart b/packages/smooth_app/lib/background/background_task_crop.dart
index b457d6e3610..9e7a4e30888 100644
--- a/packages/smooth_app/lib/background/background_task_crop.dart
+++ b/packages/smooth_app/lib/background/background_task_crop.dart
@@ -149,7 +149,7 @@ class BackgroundTaskCrop extends BackgroundTaskUpload {
) async {
await super.postExecute(localDatabase, success);
try {
- (await getFile(croppedPath)).deleteSync();
+ (await BackgroundTaskUpload.getFile(croppedPath)).deleteSync();
} catch (e) {
// not likely, but let's not spoil the task for that either.
}
diff --git a/packages/smooth_app/lib/background/background_task_image.dart b/packages/smooth_app/lib/background/background_task_image.dart
index b15f9871cd0..be4bcb5b207 100644
--- a/packages/smooth_app/lib/background/background_task_image.dart
+++ b/packages/smooth_app/lib/background/background_task_image.dart
@@ -135,12 +135,6 @@ class BackgroundTaskImage extends BackgroundTaskUpload {
),
);
- /// Returns true if the stamp is an "image/OTHER" stamp.
- ///
- /// That's important because "image/OTHER" task are never duplicates.
- static bool isOtherStamp(final String stamp) =>
- stamp.contains(';image;${ImageField.OTHER.offTag};');
-
/// Returns a fake value that means: "remove the previous value when merging".
///
/// If we use this task, it means that we took a brand new picture. Therefore,
@@ -162,17 +156,18 @@ class BackgroundTaskImage extends BackgroundTaskUpload {
) async {
await super.postExecute(localDatabase, success);
try {
- (await getFile(fullPath)).deleteSync();
+ (await BackgroundTaskUpload.getFile(fullPath)).deleteSync();
} catch (e) {
// not likely, but let's not spoil the task for that either.
}
try {
- (await getFile(croppedPath)).deleteSync();
+ (await BackgroundTaskUpload.getFile(croppedPath)).deleteSync();
} catch (e) {
// not likely, but let's not spoil the task for that either.
}
try {
- (await getFile(_getCroppedPath())).deleteSync();
+ (await BackgroundTaskUpload.getFile(getCroppedPath(fullPath)))
+ .deleteSync();
} catch (e) {
// possible, but let's not spoil the task for that either.
}
@@ -204,38 +199,61 @@ class BackgroundTaskImage extends BackgroundTaskUpload {
source.bottom * factor,
);
+ static Rect getUpsizedRect(final Rect source) =>
+ getResizedRect(source, _cropConversionFactor);
+
+ static Rect getDownsizedRect(
+ final int cropX1,
+ final int cropY1,
+ final int cropX2,
+ final int cropY2,
+ ) =>
+ getResizedRect(
+ Rect.fromLTRB(
+ cropX1.toDouble(),
+ cropY1.toDouble(),
+ cropX2.toDouble(),
+ cropY2.toDouble(),
+ ),
+ 1 / _cropConversionFactor,
+ );
+
/// Conversion factor to `int` from / to UI / background task.
- static const int cropConversionFactor = 1000000;
+ static const int _cropConversionFactor = 1000000;
- /// Returns true if a crop operation is needed - after having performed it.
+ /// Returns the file path of a crop operation.
///
- /// Returns false if no crop operation is needed.
+ /// Returns directly the original [fullPath] if no crop operation was needed.
+ /// Returns the path of the cropped file if relevant.
/// Returns null if the image (cropped or not) is too small.
- Future _crop(final File file) async {
- final ui.Image full =
- await loadUiImage(await (await getFile(fullPath)).readAsBytes());
+ static Future cropIfNeeded({
+ required final String fullPath,
+ required final String croppedPath,
+ required final int rotationDegrees,
+ required final int cropX1,
+ required final int cropY1,
+ required final int cropX2,
+ required final int cropY2,
+ final CustomPainter? overlayPainter,
+ }) async {
+ final ui.Image full = await loadUiImage(
+ await (await BackgroundTaskUpload.getFile(fullPath)).readAsBytes());
if (cropX1 == 0 &&
cropY1 == 0 &&
- cropX2 == cropConversionFactor &&
- cropY2 == cropConversionFactor &&
+ cropX2 == _cropConversionFactor &&
+ cropY2 == _cropConversionFactor &&
rotationDegrees == 0) {
if (!isPictureBigEnough(full.width, full.height)) {
return null;
}
// in that case, no need to crop
- return false;
+ if (overlayPainter == null) {
+ return fullPath;
+ }
}
Size getCroppedSize() {
- final Rect cropRect = getResizedRect(
- Rect.fromLTRB(
- cropX1.toDouble(),
- cropY1.toDouble(),
- cropX2.toDouble(),
- cropY2.toDouble(),
- ),
- 1 / cropConversionFactor,
- );
+ final Rect cropRect = getDownsizedRect(cropX1, cropY1, cropX2, cropY2);
switch (CropRotationExtension.fromDegrees(rotationDegrees)!) {
case CropRotation.up:
case CropRotation.down:
@@ -257,43 +275,39 @@ class BackgroundTaskImage extends BackgroundTaskUpload {
return null;
}
final ui.Image cropped = await CropController.getCroppedBitmap(
- crop: getResizedRect(
- Rect.fromLTRB(
- cropX1.toDouble(),
- cropY1.toDouble(),
- cropX2.toDouble(),
- cropY2.toDouble(),
- ),
- 1 / cropConversionFactor,
- ),
+ crop: getDownsizedRect(cropX1, cropY1, cropX2, cropY2),
rotation: CropRotationExtension.fromDegrees(rotationDegrees)!,
image: full,
maxSize: null,
quality: FilterQuality.high,
+ overlayPainter: overlayPainter,
);
- await saveJpeg(file: file, source: cropped);
- return true;
+ await saveJpeg(
+ file: await BackgroundTaskUpload.getFile(croppedPath),
+ source: cropped,
+ );
+ return croppedPath;
}
- /// Returns the path of the locally computed cropped path (if relevant).
- String _getCroppedPath() => '$fullPath.cropped.jpg';
+ static String getCroppedPath(final String fullPath) =>
+ '$fullPath.cropped.jpg';
/// Uploads the product image.
@override
Future upload() async {
- final String path;
- final String croppedPath = _getCroppedPath();
- final bool? neededCrop = await _crop(await getFile(croppedPath));
- if (neededCrop == null) {
+ final String? path = await cropIfNeeded(
+ fullPath: fullPath,
+ croppedPath: getCroppedPath(fullPath),
+ rotationDegrees: rotationDegrees,
+ cropX1: cropX1,
+ cropY1: cropY1,
+ cropX2: cropX2,
+ cropY2: cropY2,
+ );
+ if (path == null) {
// TODO(monsieurtanuki): maybe something more refined when we dismiss the picture, like alerting the user, though it's not supposed to happen anymore from upstream.
return;
}
- if (neededCrop) {
- path = croppedPath;
- } else {
- path = fullPath;
- }
-
final ImageField imageField = ImageField.fromOffTag(this.imageField)!;
final OpenFoodFactsLanguage language = getLanguage();
final User user = getUser();
diff --git a/packages/smooth_app/lib/background/background_task_manager.dart b/packages/smooth_app/lib/background/background_task_manager.dart
index 0fa9d5694a9..66704385daf 100644
--- a/packages/smooth_app/lib/background/background_task_manager.dart
+++ b/packages/smooth_app/lib/background/background_task_manager.dart
@@ -3,7 +3,6 @@ import 'dart:convert';
import 'package:flutter/rendering.dart';
import 'package:smooth_app/background/background_task.dart';
-import 'package:smooth_app/background/background_task_image.dart';
import 'package:smooth_app/background/background_task_refresh_later.dart';
import 'package:smooth_app/background/operation_type.dart';
import 'package:smooth_app/data_models/login_result.dart';
@@ -275,8 +274,7 @@ class BackgroundTaskManager {
// now let's get rid of stamp duplicates.
final String stamp = task.stamp;
_debugPrint('task $taskId, stamp: $stamp');
- // for image/OTHER we don't remove duplicates (they are NOT duplicates)
- if (!BackgroundTaskImage.isOtherStamp(stamp)) {
+ if (task.isDeduplicable()) {
int? removeMe;
for (int i = 0; i < result.length; i++) {
// it's the same stamp, we can remove the previous task.
@@ -293,7 +291,7 @@ class BackgroundTaskManager {
result.removeAt(removeMe);
}
} else {
- _debugPrint('is "other" stamp!');
+ _debugPrint('is "not deduplicable" task!');
}
result.add(task);
}
diff --git a/packages/smooth_app/lib/background/background_task_unselect.dart b/packages/smooth_app/lib/background/background_task_unselect.dart
index 49242e72989..f952babbdd5 100644
--- a/packages/smooth_app/lib/background/background_task_unselect.dart
+++ b/packages/smooth_app/lib/background/background_task_unselect.dart
@@ -17,6 +17,7 @@ class BackgroundTaskUnselect extends BackgroundTaskBarcode
BackgroundTaskUnselect._({
required super.processName,
required super.uniqueId,
+ required OpenFoodFactsLanguage super.language,
required super.barcode,
required super.stamp,
required this.imageField,
@@ -81,6 +82,7 @@ class BackgroundTaskUnselect extends BackgroundTaskBarcode
BackgroundTaskUnselect._(
uniqueId: uniqueId,
barcode: barcode,
+ language: language,
processName: _operationType.processName,
imageField: imageField.offTag,
// same stamp as image upload
diff --git a/packages/smooth_app/lib/background/background_task_upload.dart b/packages/smooth_app/lib/background/background_task_upload.dart
index 766e43088a9..7d069f0f71c 100644
--- a/packages/smooth_app/lib/background/background_task_upload.dart
+++ b/packages/smooth_app/lib/background/background_task_upload.dart
@@ -108,8 +108,7 @@ abstract class BackgroundTaskUpload extends BackgroundTaskBarcode
/// we use in [getDirectory].
/// With this method we refresh the path for iOS.
/// cf. https://github.com/openfoodfacts/smooth-app/issues/4725
- @protected
- Future getFile(String path) async {
+ static Future getFile(String path) async {
if (Platform.isIOS) {
final int lastSeparator = path.lastIndexOf('/');
final String filename =
@@ -139,4 +138,11 @@ abstract class BackgroundTaskUpload extends BackgroundTaskBarcode
///
/// cf. [UpToDateChanges._overwrite] regarding `images` field.
ProductImage getProductImageChange();
+
+ /// Returns true only if it's not a "image/OTHER" task.
+ ///
+ /// That's important because "image/OTHER" task are never duplicates.
+ @override
+ bool isDeduplicable() =>
+ !stamp.contains(';image;${ImageField.OTHER.offTag};');
}
diff --git a/packages/smooth_app/lib/background/operation_type.dart b/packages/smooth_app/lib/background/operation_type.dart
index 869af3588d0..92cee088a82 100644
--- a/packages/smooth_app/lib/background/operation_type.dart
+++ b/packages/smooth_app/lib/background/operation_type.dart
@@ -1,5 +1,6 @@
import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:smooth_app/background/background_task.dart';
+import 'package:smooth_app/background/background_task_add_price.dart';
import 'package:smooth_app/background/background_task_crop.dart';
import 'package:smooth_app/background/background_task_details.dart';
import 'package:smooth_app/background/background_task_download_products.dart';
@@ -35,6 +36,7 @@ enum OperationType {
offlineProducts('P', 'OFFLINE_PRODUCTS'),
fullRefresh('F', 'FULL_REFRESH'),
languageRefresh('L', 'LANGUAGE_REFRESH'),
+ addPrice('A', 'ADD_PRICE'),
details('D', 'PRODUCT_EDIT');
const OperationType(this.header, this.processName);
@@ -65,62 +67,41 @@ enum OperationType {
'$_transientHeaderSeparator${work ?? ''}';
}
- BackgroundTask fromJson(Map map) {
- switch (this) {
- case crop:
- return BackgroundTaskCrop.fromJson(map);
- case details:
- return BackgroundTaskDetails.fromJson(map);
- case hungerGames:
- return BackgroundTaskHungerGames.fromJson(map);
- case image:
- return BackgroundTaskImage.fromJson(map);
- case refreshLater:
- return BackgroundTaskRefreshLater.fromJson(map);
- case unselect:
- return BackgroundTaskUnselect.fromJson(map);
- case offline:
- return BackgroundTaskOffline.fromJson(map);
- case offlineBarcodes:
- return BackgroundTaskTopBarcodes.fromJson(map);
- case offlineProducts:
- return BackgroundTaskDownloadProducts.fromJson(map);
- case fullRefresh:
- return BackgroundTaskFullRefresh.fromJson(map);
- case languageRefresh:
- return BackgroundTaskLanguageRefresh.fromJson(map);
- }
- }
+ BackgroundTask fromJson(Map map) => switch (this) {
+ crop => BackgroundTaskCrop.fromJson(map),
+ addPrice => BackgroundTaskAddPrice.fromJson(map),
+ details => BackgroundTaskDetails.fromJson(map),
+ hungerGames => BackgroundTaskHungerGames.fromJson(map),
+ image => BackgroundTaskImage.fromJson(map),
+ refreshLater => BackgroundTaskRefreshLater.fromJson(map),
+ unselect => BackgroundTaskUnselect.fromJson(map),
+ offline => BackgroundTaskOffline.fromJson(map),
+ offlineBarcodes => BackgroundTaskTopBarcodes.fromJson(map),
+ offlineProducts => BackgroundTaskDownloadProducts.fromJson(map),
+ fullRefresh => BackgroundTaskFullRefresh.fromJson(map),
+ languageRefresh => BackgroundTaskLanguageRefresh.fromJson(map),
+ };
bool matches(final TransientOperation action) =>
action.key.startsWith('$header$_transientHeaderSeparator');
- String getLabel(final AppLocalizations appLocalizations) {
- switch (this) {
- case OperationType.details:
- return appLocalizations.background_task_operation_details;
- case OperationType.image:
- return appLocalizations.background_task_operation_image;
- case OperationType.unselect:
- return 'Unselect a product image';
- case OperationType.hungerGames:
- return 'Answering to a Hunger Games question';
- case OperationType.crop:
- return 'Crop an existing image';
- case OperationType.refreshLater:
- return 'Waiting 10 min before refreshing product to get all automatic edits';
- case OperationType.offline:
- return 'Downloading top n products for offline usage';
- case OperationType.offlineBarcodes:
- return 'Downloading top n barcodes';
- case OperationType.offlineProducts:
- return 'Downloading products';
- case OperationType.fullRefresh:
- return 'Refreshing the full local database';
- case OperationType.languageRefresh:
- return 'Refreshing the local database to a new language';
- }
- }
+ String getLabel(final AppLocalizations appLocalizations) => switch (this) {
+ OperationType.details =>
+ appLocalizations.background_task_operation_details,
+ OperationType.addPrice => 'Add price',
+ OperationType.image => appLocalizations.background_task_operation_image,
+ OperationType.unselect => 'Unselect a product image',
+ OperationType.hungerGames => 'Answering to a Hunger Games question',
+ OperationType.crop => 'Crop an existing image',
+ OperationType.refreshLater =>
+ 'Waiting 10 min before refreshing product to get all automatic edits',
+ OperationType.offline => 'Downloading top n products for offline usage',
+ OperationType.offlineBarcodes => 'Downloading top n barcodes',
+ OperationType.offlineProducts => 'Downloading products',
+ OperationType.fullRefresh => 'Refreshing the full local database',
+ OperationType.languageRefresh =>
+ 'Refreshing the local database to a new language',
+ };
static int getSequentialId(final TransientOperation operation) {
final List keyItems =
diff --git a/packages/smooth_app/lib/cache/cache_manager.dart b/packages/smooth_app/lib/cache/cache_manager.dart
deleted file mode 100644
index 316cda982e9..00000000000
--- a/packages/smooth_app/lib/cache/cache_manager.dart
+++ /dev/null
@@ -1,28 +0,0 @@
-/// Abstract class defining a cache containing items of type [T] and accessible
-/// via a unique key of type [K]
-abstract class CacheMap {
- /// Saves an item
- /// Returns [true] if the item was saved
- Future put(
- K key,
- T item, {
- bool overrideExistingItem = true,
- });
-
- /// Gets an item by its key
- /// Returns [null] if it doesn't exist
- Future get(K key);
-
- /// Returns if an item is available in the cache by giving its [key]
- Future containsKey(K key);
-
- /// Returns the number of items
- Future get length;
-
- /// Removes an item by its key
- /// Returns [true] if the item existed and is now removed
- Future remove(K key);
-
- /// Removes all items
- Future clear();
-}
diff --git a/packages/smooth_app/lib/cache/files/file_cache_manager.dart b/packages/smooth_app/lib/cache/files/file_cache_manager.dart
deleted file mode 100644
index a52822b8e33..00000000000
--- a/packages/smooth_app/lib/cache/files/file_cache_manager.dart
+++ /dev/null
@@ -1,39 +0,0 @@
-import 'dart:typed_data';
-
-import 'package:path_provider/path_provider.dart';
-import 'package:smooth_app/cache/cache_manager.dart';
-import 'package:smooth_app/cache/files/file_cache_manager_impl.dart';
-
-/// Files caches work with a [String] key.
-/// This key being the filename.
-typedef FileCache = CacheMap;
-
-/// Cache allowing to store files in the device persistent storage.
-///
-/// Each cache is lazily created/loaded, meaning that even if [temporary] or
-/// [persistent] is called, nothing will be created until a sub-method
-/// like [get], [length]… is used.
-class FileCacheManager {
- const FileCacheManager._();
-
- static FileCache? _temporaryCache;
- static FileCache? _longLivingCache;
-
- static FileCache get temporary {
- _temporaryCache ??= FileCacheImpl(
- rootDirectory: getTemporaryDirectory(),
- subFolderName: 'temp',
- );
-
- return _temporaryCache!;
- }
-
- static FileCache get persistent {
- _longLivingCache ??= FileCacheImpl(
- rootDirectory: getApplicationDocumentsDirectory(),
- subFolderName: 'persistent',
- );
-
- return _longLivingCache!;
- }
-}
diff --git a/packages/smooth_app/lib/cache/files/file_cache_manager_impl.dart b/packages/smooth_app/lib/cache/files/file_cache_manager_impl.dart
deleted file mode 100644
index eebe0ac1a2d..00000000000
--- a/packages/smooth_app/lib/cache/files/file_cache_manager_impl.dart
+++ /dev/null
@@ -1,115 +0,0 @@
-import 'dart:io';
-
-import 'package:flutter/foundation.dart';
-import 'package:path/path.dart';
-import 'package:smooth_app/cache/files/file_cache_manager.dart';
-
-/// A FileCache implementation where files are stored in
-/// [rootDirectory]/files_cache/[subFolderName]
-class FileCacheImpl extends FileCache {
- FileCacheImpl({
- required this.rootDirectory,
- required this.subFolderName,
- }) : assert(subFolderName.isNotEmpty);
-
- final Future rootDirectory;
- final String subFolderName;
-
- /// This field will be lazily assigned after a call to [initCache]
- Directory? _directory;
-
- @protected
- Future initCache() async {
- if (_directory == null) {
- _directory = Directory(
- join(
- await rootDirectory.then((Directory d) => d.absolute.path),
- 'files_cache',
- subFolderName,
- ),
- );
- await _directory!.create(recursive: true);
- }
- }
-
- Future _ensureInitialized() async {
- if (_directory == null) {
- await initCache();
- }
- }
-
- Future _getFilePath(String key) async {
- await _ensureInitialized();
- return File(join(_directory!.absolute.path, key));
- }
-
- @override
- Future get(String key) async {
- final File file = await _getFilePath(key);
-
- if (file.existsSync()) {
- return file.readAsBytes();
- } else {
- return null;
- }
- }
-
- @override
- Future containsKey(String key) {
- return _getFilePath(key).then((File file) => file.existsSync());
- }
-
- @override
- Future put(
- String key,
- Uint8List item, {
- bool overrideExistingItem = true,
- }) async {
- if (await containsKey(key) && !overrideExistingItem) {
- return false;
- }
-
- // Will erase existing file
- final File file = await _getFilePath(key);
-
- try {
- await file.writeAsBytes(
- item,
- mode: FileMode.writeOnly,
- flush: true,
- );
- } on FileSystemException {
- return false;
- }
-
- return true;
- }
-
- @override
- Future get length => _ensureInitialized().then(
- (_) => _directory!.list().length,
- );
-
- @override
- Future remove(String key) async {
- if (await containsKey(key)) {
- await _getFilePath(key).then((File file) => file.delete());
- return true;
- }
-
- return false;
- }
-
- @override
- Future clear() async {
- await _ensureInitialized();
-
- // Only delete content, not the folder itself
- final List files =
- await _directory!.list(recursive: true).toList();
-
- for (final FileSystemEntity file in files) {
- await file.delete();
- }
- }
-}
diff --git a/packages/smooth_app/lib/cards/category_cards/asset_cache_helper.dart b/packages/smooth_app/lib/cards/category_cards/asset_cache_helper.dart
index 58699bc1160..718569230a2 100644
--- a/packages/smooth_app/lib/cards/category_cards/asset_cache_helper.dart
+++ b/packages/smooth_app/lib/cards/category_cards/asset_cache_helper.dart
@@ -9,6 +9,7 @@ class AssetCacheHelper {
this.width,
this.height,
this.color,
+ this.semanticsLabel,
});
/// Full asset names, e.g. 'assets/cache/ab-agriculture-biologique.74x90.svg'
@@ -21,9 +22,15 @@ class AssetCacheHelper {
final double? height;
final Color? color;
- Widget getEmptySpace() => SizedBox(
- width: width ?? height,
- height: height ?? width,
+ final String? semanticsLabel;
+
+ Widget getEmptySpace() => Semantics(
+ label: semanticsLabel,
+ image: true,
+ child: SizedBox(
+ width: width ?? height,
+ height: height ?? width,
+ ),
);
void notFound() => Logs.d(
diff --git a/packages/smooth_app/lib/cards/category_cards/svg_cache.dart b/packages/smooth_app/lib/cards/category_cards/svg_cache.dart
index 4d07818a8d7..8b955669a9e 100644
--- a/packages/smooth_app/lib/cards/category_cards/svg_cache.dart
+++ b/packages/smooth_app/lib/cards/category_cards/svg_cache.dart
@@ -3,6 +3,7 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:smooth_app/cards/category_cards/abstract_cache.dart';
import 'package:smooth_app/cards/category_cards/asset_cache_helper.dart';
import 'package:smooth_app/cards/category_cards/svg_safe_network.dart';
+import 'package:smooth_app/query/product_query.dart';
/// Widget that displays a svg from network (and cache while waiting).
class SvgCache extends AbstractCache {
@@ -11,9 +12,11 @@ class SvgCache extends AbstractCache {
super.width,
super.height,
this.color,
+ this.semanticsLabel,
});
final Color? color;
+ final String? semanticsLabel;
@override
List getCachedFilenames() {
@@ -57,6 +60,7 @@ class SvgCache extends AbstractCache {
width: width,
height: height,
color: forcedColor,
+ semanticsLabel: semanticsLabel,
);
return SvgSafeNetwork(
helper,
@@ -67,7 +71,8 @@ class SvgCache extends AbstractCache {
static String? getSemanticsLabel(BuildContext context, String iconUrl) {
final AppLocalizations localizations = AppLocalizations.of(context);
- return switch (Uri.parse(iconUrl).pathSegments.last) {
+ final String fileName = Uri.parse(iconUrl).pathSegments.last;
+ return switch (fileName) {
'ecoscore-a.svg' => localizations.ecoscore_a,
'ecoscore-b.svg' => localizations.ecoscore_b,
'ecoscore-c.svg' => localizations.ecoscore_c,
@@ -80,14 +85,98 @@ class SvgCache extends AbstractCache {
'nova-group-3.svg' => localizations.nova_group_3,
'nova-group-4.svg' => localizations.nova_group_4,
'nova-group-unknown.svg' => localizations.nova_group_unknown,
- 'nutriscore-a.svg' => localizations.nutriscore_a,
- 'nutriscore-b.svg' => localizations.nutriscore_b,
- 'nutriscore-c.svg' => localizations.nutriscore_c,
- 'nutriscore-d.svg' => localizations.nutriscore_d,
- 'nutriscore-e.svg' => localizations.nutriscore_e,
- 'nutriscore-unknown.svg' => localizations.nutriscore_unknown,
- 'nutriscore-not-applicable.svg' => localizations.ecoscore_not_applicable,
+ String _ when fileName.startsWith('nutriscore-') =>
+ _extractNutriScore(localizations, fileName),
_ => null,
};
}
+
+ static String _extractNutriScore(
+ AppLocalizations localizations,
+ String fileName,
+ ) {
+ // Old NutriScore
+ if (fileName == 'nutriscore-a.svg') {
+ return localizations.nutriscore_a;
+ } else if (fileName == 'nutriscore-b.svg') {
+ return localizations.nutriscore_b;
+ } else if (fileName == 'nutriscore-c.svg') {
+ return localizations.nutriscore_c;
+ } else if (fileName == 'nutriscore-d.svg') {
+ return localizations.nutriscore_d;
+ } else if (fileName == 'nutriscore-e.svg') {
+ return localizations.nutriscore_e;
+ } else if (fileName == 'nutriscore-unknown.svg') {
+ return localizations.nutriscore_unknown;
+ } else if (fileName == 'nutriscore-not-applicable.svg') {
+ return localizations.nutriscore_not_applicable;
+ }
+
+ // NutriScore V2
+ if (fileName == 'nutriscore-unknown-') {
+ return localizations.nutriscore_unknown_new_formula;
+ } else if (fileName == 'nutriscore-not-applicable-') {
+ return localizations.nutriscore_not_applicable_new_formula;
+ } else {
+ final String? letter;
+
+ if (fileName.startsWith('nutriscore-a-new')) {
+ letter = 'A';
+ } else if (fileName.startsWith('nutriscore-b-new')) {
+ letter = 'B';
+ } else if (fileName.startsWith('nutriscore-c-new')) {
+ letter = 'C';
+ } else if (fileName.startsWith('nutriscore-d-new')) {
+ letter = 'D';
+ } else if (fileName.startsWith('nutriscore-e-new')) {
+ letter = 'E';
+ } else {
+ return localizations.nutriscore_unknown;
+ }
+
+ return localizations.nutriscore_new_formula(letter);
+ }
+ }
+
+ static String getAssetsCacheForNutriscore(
+ NutriScoreValue nutriScore,
+ bool newNutriScore,
+ ) {
+ String suffix = '';
+ if (newNutriScore) {
+ final StringBuffer buffer = StringBuffer('-new-');
+
+ buffer.write(switch (ProductQuery.getLanguage().offTag) {
+ 'de' => 'de',
+ 'en' => 'en',
+ 'fr' => 'fr',
+ 'lb' => 'lb',
+ 'nl' => 'nl',
+ _ => 'en',
+ });
+
+ suffix = buffer.toString();
+ }
+
+ return switch (nutriScore) {
+ NutriScoreValue.a => 'assets/cache/nutriscore-a$suffix.svg',
+ NutriScoreValue.b => 'assets/cache/nutriscore-b$suffix.svg',
+ NutriScoreValue.c => 'assets/cache/nutriscore-c$suffix.svg',
+ NutriScoreValue.d => 'assets/cache/nutriscore-d$suffix.svg',
+ NutriScoreValue.e => 'assets/cache/nutriscore-e$suffix.svg',
+ NutriScoreValue.notApplicable =>
+ 'assets/cache/nutriscore-not-applicable$suffix.svg',
+ NutriScoreValue.unknown => 'assets/cache/nutriscore-unknown$suffix.svg',
+ };
+ }
+}
+
+enum NutriScoreValue {
+ a,
+ b,
+ c,
+ d,
+ e,
+ unknown,
+ notApplicable,
}
diff --git a/packages/smooth_app/lib/cards/category_cards/svg_safe_network.dart b/packages/smooth_app/lib/cards/category_cards/svg_safe_network.dart
index a0892f685bb..61c81fd365d 100644
--- a/packages/smooth_app/lib/cards/category_cards/svg_safe_network.dart
+++ b/packages/smooth_app/lib/cards/category_cards/svg_safe_network.dart
@@ -30,6 +30,7 @@ class _SvgSafeNetworkState extends State {
late final Future _loading = _load();
String get _url => widget.helper.url;
+
// TODO(monsieurtanuki): Change /dist/ url to be the first try when the majority of products have been updated
/// Loads the SVG file from url or from alternate url.
///
@@ -116,7 +117,8 @@ class _SvgSafeNetworkState extends State {
ui.BlendMode.srcIn,
),
fit: BoxFit.contain,
- semanticsLabel: SvgCache.getSemanticsLabel(context, _url),
+ semanticsLabel: widget.helper.semanticsLabel ??
+ SvgCache.getSemanticsLabel(context, _url),
placeholderBuilder: (BuildContext context) =>
SvgAsyncAsset(widget.helper),
);
diff --git a/packages/smooth_app/lib/cards/data_cards/product_image_carousel_item.dart b/packages/smooth_app/lib/cards/data_cards/product_image_carousel_item.dart
index 029b4b8d458..d25e8afec69 100644
--- a/packages/smooth_app/lib/cards/data_cards/product_image_carousel_item.dart
+++ b/packages/smooth_app/lib/cards/data_cards/product_image_carousel_item.dart
@@ -31,7 +31,7 @@ class ProductImageCarouselItem extends StatefulWidget {
class _ProductImageCarouselItemState extends State {
@override
Widget build(BuildContext context) {
- final Size screenSize = MediaQuery.of(context).size;
+ final Size screenSize = MediaQuery.sizeOf(context);
final AppLocalizations appLocalizations = AppLocalizations.of(context);
context.watch();
final ImageProvider? imageProvider = TransientFile.fromProductImageData(
diff --git a/packages/smooth_app/lib/cards/data_cards/score_card.dart b/packages/smooth_app/lib/cards/data_cards/score_card.dart
index 17ca032141b..e45143d3bda 100644
--- a/packages/smooth_app/lib/cards/data_cards/score_card.dart
+++ b/packages/smooth_app/lib/cards/data_cards/score_card.dart
@@ -48,7 +48,8 @@ class ScoreCard extends StatelessWidget {
required Attribute attribute,
required this.isClickable,
this.margin,
- }) : iconUrl = attribute.iconUrl,
+ }) : type = ScoreCardType.attribute,
+ iconUrl = attribute.iconUrl,
description = attribute.descriptionShort ?? attribute.description ?? '',
cardEvaluation = getCardEvaluationFromAttribute(attribute);
@@ -56,7 +57,8 @@ class ScoreCard extends StatelessWidget {
required TitleElement titleElement,
required this.isClickable,
this.margin,
- }) : iconUrl = titleElement.iconUrl,
+ }) : type = ScoreCardType.title,
+ iconUrl = titleElement.iconUrl,
description = titleElement.title,
cardEvaluation =
getCardEvaluationFromKnowledgePanelTitleElement(titleElement);
@@ -66,6 +68,7 @@ class ScoreCard extends StatelessWidget {
final CardEvaluation cardEvaluation;
final bool isClickable;
final EdgeInsetsGeometry? margin;
+ final ScoreCardType type;
@override
Widget build(BuildContext context) {
@@ -85,7 +88,8 @@ class ScoreCard extends StatelessWidget {
return Semantics(
value: _generateSemanticsValue(context),
excludeSemantics: true,
- button: true,
+ header: type == ScoreCardType.title,
+ button: isClickable,
child: Padding(
padding: margin ?? const EdgeInsets.symmetric(vertical: SMALL_SPACE),
child: Ink(
@@ -124,6 +128,10 @@ class ScoreCard extends StatelessWidget {
}
String _generateSemanticsValue(BuildContext context) {
+ if (type == ScoreCardType.title) {
+ return description;
+ }
+
final String? iconLabel = SvgCache.getSemanticsLabel(context, iconUrl!);
if (iconLabel == null) {
@@ -133,3 +141,8 @@ class ScoreCard extends StatelessWidget {
}
}
}
+
+enum ScoreCardType {
+ title,
+ attribute,
+}
diff --git a/packages/smooth_app/lib/cards/product_cards/smooth_product_card_found.dart b/packages/smooth_app/lib/cards/product_cards/smooth_product_card_found.dart
index f993419478c..6fa2c4f6947 100644
--- a/packages/smooth_app/lib/cards/product_cards/smooth_product_card_found.dart
+++ b/packages/smooth_app/lib/cards/product_cards/smooth_product_card_found.dart
@@ -35,7 +35,7 @@ class SmoothProductCardFound extends StatelessWidget {
final UserPreferences userPreferences = context.watch();
final ProductPreferences productPreferences =
context.watch();
- final Size screenSize = MediaQuery.of(context).size;
+ final Size screenSize = MediaQuery.sizeOf(context);
final ThemeData themeData = Theme.of(context);
final bool isDarkMode = themeData.colorScheme.brightness == Brightness.dark;
final List excludedAttributeIds =
diff --git a/packages/smooth_app/lib/cards/product_cards/smooth_product_card_template.dart b/packages/smooth_app/lib/cards/product_cards/smooth_product_card_template.dart
index e0630a85ab0..5c556c3355f 100644
--- a/packages/smooth_app/lib/cards/product_cards/smooth_product_card_template.dart
+++ b/packages/smooth_app/lib/cards/product_cards/smooth_product_card_template.dart
@@ -24,7 +24,7 @@ class SmoothProductCardTemplate extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final Size screenSize = MediaQuery.of(context).size;
+ final Size screenSize = MediaQuery.sizeOf(context);
final ThemeData themeData = Theme.of(context);
final bool isDarkMode = themeData.colorScheme.brightness == Brightness.dark;
final Color itemColor = isDarkMode ? PRIMARY_GREY_COLOR : LIGHT_GREY_COLOR;
diff --git a/packages/smooth_app/lib/data_models/location_list_supplier.dart b/packages/smooth_app/lib/data_models/location_list_supplier.dart
new file mode 100644
index 00000000000..032e7a1a913
--- /dev/null
+++ b/packages/smooth_app/lib/data_models/location_list_supplier.dart
@@ -0,0 +1,100 @@
+import 'dart:convert';
+
+import 'package:http/http.dart' as http;
+import 'package:openfoodfacts/openfoodfacts.dart';
+import 'package:smooth_app/pages/locations/osm_location.dart';
+import 'package:smooth_app/query/product_query.dart';
+
+/// Asynchronously loads locations.
+class LocationListSupplier {
+ LocationListSupplier(
+ this.query,
+ );
+
+ final String query;
+
+ final List locations = [];
+
+ /// Returns null if OK, or the message error
+ Future asyncLoad() async {
+ // don't ask me why, but it looks like we need to explicitly set a language,
+ // or else we get different (and not relevant) results
+ // and only en,fr,de can be used.
+ OpenFoodFactsLanguage getQueryLanguage() =>
+ switch (ProductQuery.getLanguage()) {
+ OpenFoodFactsLanguage.FRENCH => OpenFoodFactsLanguage.FRENCH,
+ OpenFoodFactsLanguage.GERMAN => OpenFoodFactsLanguage.GERMAN,
+ OpenFoodFactsLanguage.ENGLISH => OpenFoodFactsLanguage.ENGLISH,
+ _ => OpenFoodFactsLanguage.ENGLISH,
+ };
+
+ try {
+ locations.clear();
+ final http.Response response = await http.get(
+ Uri(
+ scheme: 'https',
+ host: 'photon.komoot.io',
+ path: 'api',
+ queryParameters: {
+ 'q': query,
+ 'lang': getQueryLanguage().offTag,
+ },
+ ),
+ );
+ if (response.statusCode != 200) {
+ return 'Could not retrieve locations';
+ }
+ final Map map = json.decode(response.body);
+ if (map['type'] != 'FeatureCollection') {
+ return 'Unexpected result type: ${map['type']}';
+ }
+ final List features = map['features'];
+ for (final Map item in features) {
+ final Map properties = item['properties'];
+ final LocationOSMType? osmType = _convertType(properties['osm_type']);
+ if (osmType == null) {
+ continue;
+ }
+ final Map geometry = item['geometry'];
+ final String type = geometry['type'];
+ if (type != 'Point') {
+ continue;
+ }
+ final List coordinates = geometry['coordinates'];
+ final double longitude = coordinates[0] as double;
+ final double latitude = coordinates[1] as double;
+ final int osmId = properties['osm_id'];
+ final String? name = properties['name'];
+ final String? street = properties['street'];
+ final String? city = properties['city'];
+ final String? countryCode = properties['countrycode'];
+ final String? country = properties['country'];
+ final String? postCode = properties['postcode'];
+ final OsmLocation osmLocation = OsmLocation(
+ osmId: osmId,
+ osmType: osmType,
+ longitude: longitude,
+ latitude: latitude,
+ name: name,
+ city: city,
+ postcode: postCode,
+ street: street,
+ country: country,
+ countryCode: countryCode,
+ );
+ locations.add(osmLocation);
+ }
+ } catch (e) {
+ locations.clear();
+ return e.toString();
+ }
+ return null;
+ }
+
+ static LocationOSMType? _convertType(final String type) => switch (type) {
+ 'W' => LocationOSMType.way,
+ 'N' => LocationOSMType.node,
+ 'R' => LocationOSMType.relation,
+ _ => null,
+ };
+}
diff --git a/packages/smooth_app/lib/data_models/location_query_model.dart b/packages/smooth_app/lib/data_models/location_query_model.dart
new file mode 100644
index 00000000000..1ec9b11b305
--- /dev/null
+++ b/packages/smooth_app/lib/data_models/location_query_model.dart
@@ -0,0 +1,53 @@
+import 'package:flutter/material.dart';
+import 'package:smooth_app/data_models/location_list_supplier.dart';
+import 'package:smooth_app/pages/locations/osm_location.dart';
+import 'package:smooth_app/pages/product/common/loading_status.dart';
+
+/// Location query model.
+class LocationQueryModel with ChangeNotifier {
+ LocationQueryModel(this.query) {
+ _asyncLoad(notify: true);
+ }
+
+ final String query;
+
+ late LoadingStatus _loadingStatus;
+ String? _loadingError;
+ List displayedResults = [];
+
+ bool isEmpty() => displayedResults.isEmpty;
+
+ String? get loadingError => _loadingError;
+ LoadingStatus get loadingStatus => _loadingStatus;
+
+ late final LocationListSupplier supplier = LocationListSupplier(query);
+
+ Future _asyncLoad({
+ final bool notify = false,
+ final bool fromScratch = false,
+ }) async {
+ _loadingStatus = LoadingStatus.LOADING;
+ _loadingError = await supplier.asyncLoad();
+ if (_loadingError != null) {
+ _loadingStatus = LoadingStatus.ERROR;
+ } else {
+ await _process(supplier.locations, fromScratch);
+ _loadingStatus = LoadingStatus.LOADED;
+ }
+ if (notify) {
+ notifyListeners();
+ }
+ return _loadingStatus == LoadingStatus.LOADED;
+ }
+
+ Future _process(
+ final List locations,
+ final bool fromScratch,
+ ) async {
+ if (fromScratch) {
+ displayedResults.clear();
+ }
+ displayedResults.addAll(locations);
+ _loadingStatus = LoadingStatus.LOADED;
+ }
+}
diff --git a/packages/smooth_app/lib/data_models/news_feed/newsfeed_json.dart b/packages/smooth_app/lib/data_models/news_feed/newsfeed_json.dart
new file mode 100644
index 00000000000..936c0f3e199
--- /dev/null
+++ b/packages/smooth_app/lib/data_models/news_feed/newsfeed_json.dart
@@ -0,0 +1,428 @@
+part of 'newsfeed_provider.dart';
+
+/// Content from the JSON and converted to what's in "newsfeed_model.dart"
+
+class _TagLineJSON {
+ _TagLineJSON.fromJson(Map json)
+ : news = (json['news'] as Map).map(
+ (dynamic id, dynamic value) => MapEntry(
+ id,
+ _TagLineItemNewsItem.fromJson(id, value),
+ ),
+ ),
+ taglineFeed = _TaglineJSONFeed.fromJson(json['tagline_feed']);
+
+ final _TagLineJSONNewsList news;
+ final _TaglineJSONFeed taglineFeed;
+
+ AppNews toTagLine(String locale) {
+ final Map tagLineNews = news.map(
+ (String key, _TagLineItemNewsItem value) => MapEntry(
+ key,
+ value.toTagLineItem(locale),
+ ),
+ );
+
+ final _TagLineJSONFeedLocale localizedFeed = taglineFeed.loadNews(locale);
+ final Iterable feed = localizedFeed.news
+ .map((_TagLineJSONFeedLocaleItem item) {
+ if (news[item.id] == null) {
+ // The asked ID doesn't exist in the news
+ return null;
+ }
+ return item.overrideNewsItem(news[item.id]!, locale);
+ })
+ .where((AppNewsFeedItem? item) =>
+ item != null &&
+ (item.startDate == null ||
+ item.startDate!.isBefore(DateTime.now())) &&
+ (item.endDate == null || item.endDate!.isAfter(DateTime.now())))
+ .whereNotNull();
+
+ return AppNews(
+ news: AppNewsList(tagLineNews),
+ feed: AppNewsFeed(
+ feed.toList(growable: false),
+ ),
+ );
+ }
+}
+
+typedef _TagLineJSONNewsList = Map;
+
+class _TagLineItemNewsItem {
+ const _TagLineItemNewsItem._({
+ required this.id,
+ required this.url,
+ required _TagLineItemNewsTranslations translations,
+ this.startDate,
+ this.endDate,
+ this.style,
+ }) : _translations = translations;
+
+ _TagLineItemNewsItem.fromJson(this.id, Map json)
+ : assert((json['url'] as String).isNotEmpty),
+ url = json['url'],
+ assert((json['translations'] as Map)
+ .containsKey('default')),
+ _translations = (json['translations'] as Map)
+ .map((dynamic key, dynamic value) {
+ if (key == 'default') {
+ return MapEntry(
+ key, _TagLineItemNewsTranslationDefault.fromJson(value));
+ } else {
+ return MapEntry(
+ key,
+ _TagLineItemNewsTranslation.fromJson(value),
+ );
+ }
+ }),
+ startDate = DateTime.tryParse(json['start_date']),
+ endDate = DateTime.tryParse(json['end_date']),
+ style = json['style'] == null
+ ? null
+ : _TagLineNewsStyle.fromJson(json['style']);
+
+ final String id;
+ final String url;
+ final _TagLineItemNewsTranslations _translations;
+ final DateTime? startDate;
+ final DateTime? endDate;
+ final _TagLineNewsStyle? style;
+
+ _TagLineItemNewsTranslation loadTranslation(String locale) {
+ _TagLineItemNewsTranslation? translation;
+ // Direct match
+ if (_translations.containsKey(locale)) {
+ translation = _translations[locale];
+ } else if (locale.contains('_')) {
+ final List splittedLocale = locale.split('_');
+ final String languageCode = splittedLocale.first;
+ final String countryCode = '_${splittedLocale.last}';
+ if (_translations.containsKey(languageCode)) {
+ translation = _translations[languageCode];
+ } else if (_translations.containsKey(countryCode)) {
+ translation = _translations[countryCode];
+ }
+ }
+
+ return _translations['default']!.merge(translation);
+ }
+
+ AppNewsItem toTagLineItem(String locale) {
+ final _TagLineItemNewsTranslation translation = loadTranslation(locale);
+ // We can assume the default translation has a non-null title and message
+ return AppNewsItem(
+ id: id,
+ title: translation.title!,
+ message: translation.message!,
+ url: translation.url ?? url,
+ buttonLabel: translation.buttonLabel,
+ startDate: startDate,
+ endDate: endDate,
+ style: style?.toTagLineStyle(),
+ image: translation.image?.overridesContent == true
+ ? translation.image?.toTagLineImage()
+ : null,
+ );
+ }
+
+ _TagLineItemNewsItem copyWith({
+ String? url,
+ _TagLineItemNewsTranslations? translations,
+ DateTime? startDate,
+ DateTime? endDate,
+ _TagLineNewsStyle? style,
+ }) {
+ return _TagLineItemNewsItem._(
+ id: id,
+ // Still the same
+ url: url ?? this.url,
+ translations: translations ?? _translations,
+ startDate: startDate ?? this.startDate,
+ endDate: endDate ?? this.endDate,
+ style: style ?? this.style,
+ );
+ }
+}
+
+typedef _TagLineItemNewsTranslations = Map;
+
+class _TagLineItemNewsTranslation {
+ _TagLineItemNewsTranslation._({
+ this.title,
+ this.message,
+ this.url,
+ this.buttonLabel,
+ this.image,
+ });
+
+ _TagLineItemNewsTranslation.fromJson(Map json)
+ : assert(json['title'] == null || (json['title'] as String).isNotEmpty),
+ assert(
+ json['message'] == null || (json['message'] as String).isNotEmpty),
+ assert(json['url'] == null || (json['url'] as String).isNotEmpty),
+ assert(json['button_label'] == null ||
+ (json['button_label'] as String).isNotEmpty),
+ title = json['title'],
+ message = json['message'],
+ url = json['url'],
+ buttonLabel = json['button_label'],
+ image = json['image'] == null
+ ? null
+ : _TagLineNewsImage.fromJson(json['image']);
+ final String? title;
+ final String? message;
+ final String? url;
+ final String? buttonLabel;
+ final _TagLineNewsImage? image;
+
+ _TagLineItemNewsTranslation copyWith({
+ String? title,
+ String? message,
+ String? url,
+ String? buttonLabel,
+ _TagLineNewsImage? image,
+ }) {
+ return _TagLineItemNewsTranslation._(
+ title: title ?? this.title,
+ message: message ?? this.message,
+ url: url ?? this.url,
+ buttonLabel: buttonLabel ?? this.buttonLabel,
+ image: image ?? this.image,
+ );
+ }
+
+ _TagLineItemNewsTranslation merge(_TagLineItemNewsTranslation? other) {
+ if (other == null) {
+ return this;
+ }
+
+ return copyWith(
+ title: other.title,
+ message: other.message,
+ url: other.url,
+ buttonLabel: other.buttonLabel,
+ image: other.image,
+ );
+ }
+}
+
+class _TagLineItemNewsTranslationDefault extends _TagLineItemNewsTranslation {
+ _TagLineItemNewsTranslationDefault.fromJson(Map json)
+ : assert((json['title'] as String).isNotEmpty),
+ assert((json['message'] as String).isNotEmpty),
+ assert(json['image'] == null ||
+ ((json['image'] as Map)['url'] as String)
+ .isNotEmpty),
+ super.fromJson(json);
+}
+
+class _TagLineNewsImage {
+ _TagLineNewsImage.fromJson(Map json)
+ : assert(json['width'] == null ||
+ ((json['width'] as num) >= 0.0 && (json['width'] as num) <= 1.0)),
+ assert(json['alt'] == null || (json['alt'] as String).isNotEmpty),
+ url = json['url'],
+ width = json['width'],
+ alt = json['alt'];
+
+ final String? url;
+ final double? width;
+ final String? alt;
+
+ AppNewsImage toTagLineImage() {
+ return AppNewsImage(
+ src: url,
+ width: width,
+ alt: alt,
+ );
+ }
+
+ bool get overridesContent => url != null || width != null || alt != null;
+}
+
+class _TagLineNewsStyle {
+ _TagLineNewsStyle._({
+ this.titleBackground,
+ this.titleTextColor,
+ this.titleIndicatorColor,
+ this.messageBackground,
+ this.messageTextColor,
+ this.buttonBackground,
+ this.buttonTextColor,
+ this.contentBackgroundColor,
+ });
+
+ _TagLineNewsStyle.fromJson(Map json)
+ : assert(json['title_background'] == null ||
+ (json['title_background'] as String).startsWith('#')),
+ assert(json['title_text_color'] == null ||
+ (json['title_text_color'] as String).startsWith('#')),
+ assert(json['title_indicator_color'] == null ||
+ (json['title_indicator_color'] as String).startsWith('#')),
+ assert(json['message_background'] == null ||
+ (json['message_background'] as String).startsWith('#')),
+ assert(json['message_text_color'] == null ||
+ (json['message_text_color'] as String).startsWith('#')),
+ assert(json['button_background'] == null ||
+ (json['button_background'] as String).startsWith('#')),
+ assert(json['button_text_color'] == null ||
+ (json['button_text_color'] as String).startsWith('#')),
+ assert(json['content_background_color'] == null ||
+ (json['content_background_color'] as String).startsWith('#')),
+ titleBackground = json['title_background'],
+ titleTextColor = json['title_text_color'],
+ titleIndicatorColor = json['title_indicator_color'],
+ messageBackground = json['message_background'],
+ messageTextColor = json['message_text_color'],
+ buttonBackground = json['button_background'],
+ buttonTextColor = json['button_text_color'],
+ contentBackgroundColor = json['content_background_color'];
+
+ final String? titleBackground;
+ final String? titleTextColor;
+ final String? titleIndicatorColor;
+ final String? messageBackground;
+ final String? messageTextColor;
+ final String? buttonBackground;
+ final String? buttonTextColor;
+ final String? contentBackgroundColor;
+
+ _TagLineNewsStyle copyWith({
+ String? titleBackground,
+ String? titleTextColor,
+ String? titleIndicatorColor,
+ String? messageBackground,
+ String? messageTextColor,
+ String? buttonBackground,
+ String? buttonTextColor,
+ String? contentBackgroundColor,
+ }) {
+ return _TagLineNewsStyle._(
+ titleBackground: titleBackground ?? this.titleBackground,
+ titleTextColor: titleTextColor ?? this.titleTextColor,
+ titleIndicatorColor: titleIndicatorColor ?? this.titleIndicatorColor,
+ messageBackground: messageBackground ?? this.messageBackground,
+ messageTextColor: messageTextColor ?? this.messageTextColor,
+ buttonBackground: buttonBackground ?? this.buttonBackground,
+ buttonTextColor: buttonTextColor ?? this.buttonTextColor,
+ contentBackgroundColor:
+ contentBackgroundColor ?? this.contentBackgroundColor,
+ );
+ }
+
+ AppNewsStyle toTagLineStyle() => AppNewsStyle.fromHexa(
+ titleBackground: titleBackground,
+ titleTextColor: titleTextColor,
+ titleIndicatorColor: titleIndicatorColor,
+ messageBackground: messageBackground,
+ messageTextColor: messageTextColor,
+ buttonBackground: buttonBackground,
+ buttonTextColor: buttonTextColor,
+ contentBackgroundColor: contentBackgroundColor,
+ );
+}
+
+class _TaglineJSONFeed {
+ _TaglineJSONFeed.fromJson(Map json)
+ : assert(json.containsKey('default')),
+ _news = json.map(
+ (dynamic key, dynamic value) =>
+ MapEntry(
+ key,
+ _TagLineJSONFeedLocale.fromJson(value),
+ ),
+ );
+
+ final _TagLineJSONFeedList _news;
+
+ _TagLineJSONFeedLocale loadNews(String locale) {
+ // Direct match
+ if (_news.containsKey(locale)) {
+ return _news[locale]!;
+ }
+
+ // Try by language
+ if (locale.contains('_')) {
+ final List splittedLocale = locale.split('_');
+ final String languageCode = splittedLocale.first;
+ final String countryCode = '_${splittedLocale.last}';
+ if (_news.containsKey(languageCode)) {
+ return _news[languageCode]!;
+ } else if (_news.containsKey(countryCode)) {
+ return _news[countryCode]!;
+ }
+ }
+
+ return _news['default']!;
+ }
+}
+
+typedef _TagLineJSONFeedList = Map;
+
+class _TagLineJSONFeedLocale {
+ _TagLineJSONFeedLocale.fromJson(Map json)
+ : assert(json['news'] is Iterable),
+ news = (json['news'] as Iterable)
+ .map((dynamic json) => _TagLineJSONFeedLocaleItem.fromJson(json));
+
+ final Iterable<_TagLineJSONFeedLocaleItem> news;
+}
+
+class _TagLineJSONFeedLocaleItem {
+ _TagLineJSONFeedLocaleItem.fromJson(Map json)
+ : assert((json['id'] as String).isNotEmpty),
+ id = json['id'],
+ overrideContent = json['override'] != null
+ ? _TagLineJSONFeedNewsItemOverride.fromJson(
+ json['override'] as Map)
+ : null;
+
+ final String id;
+ final _TagLineJSONFeedNewsItemOverride? overrideContent;
+
+ AppNewsFeedItem overrideNewsItem(
+ _TagLineItemNewsItem newsItem,
+ String locale,
+ ) {
+ _TagLineItemNewsItem item = newsItem;
+
+ if (overrideContent != null) {
+ item = newsItem.copyWith(
+ url: overrideContent!.url ?? newsItem.url,
+ startDate: overrideContent!.startDate ?? newsItem.startDate,
+ endDate: overrideContent!.endDate ?? newsItem.endDate,
+ style: overrideContent!.style ?? newsItem.style,
+ );
+ }
+
+ final AppNewsItem tagLineItem = item.toTagLineItem(locale);
+
+ return AppNewsFeedItem(
+ news: tagLineItem,
+ startDate: tagLineItem.startDate,
+ endDate: tagLineItem.endDate,
+ );
+ }
+}
+
+class _TagLineJSONFeedNewsItemOverride {
+ _TagLineJSONFeedNewsItemOverride.fromJson(Map json)
+ : assert(json['url'] == null || (json['url'] as String).isNotEmpty),
+ url = json['url'],
+ startDate = json['start_date'] != null
+ ? DateTime.tryParse(json['start_date'])
+ : null,
+ endDate = json['end_date'] != null
+ ? DateTime.tryParse(json['end_date'])
+ : null,
+ style = json['style'] == null
+ ? null
+ : _TagLineNewsStyle.fromJson(json['style']);
+
+ final String? url;
+ final DateTime? startDate;
+ final DateTime? endDate;
+ final _TagLineNewsStyle? style;
+}
diff --git a/packages/smooth_app/lib/data_models/news_feed/newsfeed_model.dart b/packages/smooth_app/lib/data_models/news_feed/newsfeed_model.dart
new file mode 100644
index 00000000000..a4790124990
--- /dev/null
+++ b/packages/smooth_app/lib/data_models/news_feed/newsfeed_model.dart
@@ -0,0 +1,166 @@
+import 'dart:ui';
+
+class AppNews {
+ const AppNews({
+ required this.news,
+ required this.feed,
+ });
+
+ final AppNewsList news;
+ final AppNewsFeed feed;
+
+ bool get hasContent => news._news.isNotEmpty && feed.news.isNotEmpty;
+
+ @override
+ String toString() {
+ return 'AppNews{news: $news, feed: $feed}';
+ }
+}
+
+class AppNewsList {
+ const AppNewsList(Map news) : _news = news;
+
+ final Map _news;
+
+ AppNewsItem? operator [](String key) => _news[key];
+
+ @override
+ String toString() {
+ return 'AppNewsList{_news: $_news}';
+ }
+}
+
+class AppNewsItem {
+ const AppNewsItem({
+ required this.id,
+ required this.title,
+ required this.message,
+ required this.url,
+ this.buttonLabel,
+ this.startDate,
+ this.endDate,
+ this.image,
+ this.style,
+ });
+
+ final String id;
+ final String title;
+ final String message;
+ final String url;
+ final String? buttonLabel;
+ final DateTime? startDate;
+ final DateTime? endDate;
+ final AppNewsImage? image;
+ final AppNewsStyle? style;
+
+ @override
+ String toString() {
+ return 'AppNewsItem{id: $id, title: $title, message: $message, url: $url, buttonLabel: $buttonLabel, startDate: $startDate, endDate: $endDate, image: $image, style: $style}';
+ }
+}
+
+class AppNewsStyle {
+ const AppNewsStyle({
+ this.titleBackground,
+ this.titleTextColor,
+ this.titleIndicatorColor,
+ this.messageBackground,
+ this.messageTextColor,
+ this.buttonBackground,
+ this.buttonTextColor,
+ this.contentBackgroundColor,
+ });
+
+ AppNewsStyle.fromHexa({
+ String? titleBackground,
+ String? titleTextColor,
+ String? titleIndicatorColor,
+ String? messageBackground,
+ String? messageTextColor,
+ String? buttonBackground,
+ String? buttonTextColor,
+ String? contentBackgroundColor,
+ }) : titleBackground = _parseColor(titleBackground),
+ titleTextColor = _parseColor(titleTextColor),
+ titleIndicatorColor = _parseColor(titleIndicatorColor),
+ messageBackground = _parseColor(messageBackground),
+ messageTextColor = _parseColor(messageTextColor),
+ buttonBackground = _parseColor(buttonBackground),
+ buttonTextColor = _parseColor(buttonTextColor),
+ contentBackgroundColor = _parseColor(contentBackgroundColor);
+
+ final Color? titleBackground;
+ final Color? titleTextColor;
+ final Color? titleIndicatorColor;
+ final Color? messageBackground;
+ final Color? messageTextColor;
+ final Color? buttonBackground;
+ final Color? buttonTextColor;
+ final Color? contentBackgroundColor;
+
+ static Color? _parseColor(String? hexa) {
+ if (hexa == null || hexa.length != 7) {
+ return null;
+ }
+ return Color(int.parse(hexa.substring(1), radix: 16));
+ }
+
+ @override
+ String toString() {
+ return 'AppNewsStyle{titleBackground: $titleBackground, titleTextColor: $titleTextColor, titleIndicatorColor: $titleIndicatorColor, messageBackground: $messageBackground, messageTextColor: $messageTextColor, buttonBackground: $buttonBackground, buttonTextColor: $buttonTextColor, contentBackgroundColor: $contentBackgroundColor}';
+ }
+}
+
+class AppNewsImage {
+ const AppNewsImage({
+ required this.src,
+ this.width,
+ this.alt,
+ });
+
+ final String? src;
+ final double? width;
+ final String? alt;
+
+ @override
+ String toString() {
+ return 'AppNewsImage{src: $src, width: $width, alt: $alt}';
+ }
+}
+
+class AppNewsFeed {
+ const AppNewsFeed(this.news);
+
+ final List news;
+
+ bool get isNotEmpty => news.isNotEmpty;
+
+ @override
+ String toString() {
+ return 'TagLineFeed{news: $news}';
+ }
+}
+
+class AppNewsFeedItem {
+ const AppNewsFeedItem({
+ required this.news,
+ DateTime? startDate,
+ DateTime? endDate,
+ }) : _startDate = startDate,
+ _endDate = endDate;
+
+ final AppNewsItem news;
+ final DateTime? _startDate;
+ final DateTime? _endDate;
+
+ String get id => news.id;
+
+ DateTime? get startDate => _startDate ?? news.startDate;
+
+ DateTime? get endDate => _endDate ?? news.endDate;
+
+ @override
+ String toString() {
+ return 'AppNewsFeedItem{news: $news, _startDate: $_startDate, _endDate: $_endDate}';
+ }
+}
diff --git a/packages/smooth_app/lib/data_models/news_feed/newsfeed_provider.dart b/packages/smooth_app/lib/data_models/news_feed/newsfeed_provider.dart
new file mode 100644
index 00000000000..c72b44ff146
--- /dev/null
+++ b/packages/smooth_app/lib/data_models/news_feed/newsfeed_provider.dart
@@ -0,0 +1,218 @@
+import 'dart:convert';
+import 'dart:io';
+import 'dart:isolate';
+
+import 'package:collection/collection.dart';
+import 'package:flutter/widgets.dart';
+import 'package:http/http.dart' as http;
+import 'package:openfoodfacts/openfoodfacts.dart';
+import 'package:path/path.dart';
+import 'package:path_provider/path_provider.dart';
+import 'package:smooth_app/data_models/news_feed/newsfeed_model.dart';
+import 'package:smooth_app/data_models/preferences/user_preferences.dart';
+import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart';
+import 'package:smooth_app/query/product_query.dart';
+import 'package:smooth_app/services/smooth_services.dart';
+
+part 'newsfeed_json.dart';
+
+/// This provides one one side a list of news and on the other a feed of news.
+/// A feed contains some of the news?
+///
+/// The content is fetched on the server and cached locally (1 day).
+/// To be notified of changes, listen to this [ChangeNotifier] and more
+/// particularly to the [state] property.
+class AppNewsProvider extends ChangeNotifier {
+ AppNewsProvider(UserPreferences preferences)
+ : _state = const AppNewsStateLoading(),
+ _preferences = preferences,
+ _uriOverride = preferences.getDevModeString(
+ UserPreferencesDevMode.userPreferencesCustomNewsJSONURI),
+ _domain = preferences.getDevModeString(
+ UserPreferencesDevMode.userPreferencesTestEnvDomain),
+ _prodEnv = preferences
+ .getFlag(UserPreferencesDevMode.userPreferencesFlagProd) {
+ _preferences.addListener(_onPreferencesChanged);
+ loadLatestNews();
+ }
+
+ final UserPreferences _preferences;
+
+ AppNewsState _state;
+
+ bool get hasContent =>
+ _state is AppNewsStateLoaded &&
+ (_state as AppNewsStateLoaded).content.hasContent;
+
+ Future loadLatestNews({bool forceUpdate = false}) async {
+ _emit(const AppNewsStateLoading());
+
+ final String locale = ProductQuery.getLocaleString();
+ if (locale.startsWith('-')) {
+ // ProductQuery not ready
+ return;
+ }
+
+ final File cacheFile = await _newsCacheFile;
+ String? jsonString;
+ // Try from the cache first
+ if (!forceUpdate && _isNewsCacheValid(cacheFile)) {
+ jsonString = cacheFile.readAsStringSync();
+ }
+
+ if (jsonString == null || jsonString.isEmpty == true) {
+ jsonString = await _fetchJSON();
+ }
+
+ if (jsonString?.isNotEmpty != true) {
+ _emit(const AppNewsStateError('JSON news file is empty'));
+ return;
+ }
+
+ final AppNews? appNews = await Isolate.run(
+ () => _parseJSONAndGetLocalizedContent(jsonString!, locale));
+ if (appNews == null) {
+ _emit(const AppNewsStateError('Unable to parse the JSON news file'));
+ Logs.e('Unable to parse the JSON news file');
+ } else {
+ _emit(AppNewsStateLoaded(appNews, cacheFile.lastModifiedSync()));
+ Logs.i('News ${forceUpdate ? 're' : ''}loaded');
+ }
+ }
+
+ void _emit(AppNewsState state) {
+ _state = state;
+ WidgetsBinding.instance.addPostFrameCallback((_) {
+ notifyListeners();
+ });
+ }
+
+ AppNewsState get state => _state;
+
+ static Future _parseJSONAndGetLocalizedContent(
+ String json,
+ String locale,
+ ) async {
+ try {
+ final _TagLineJSON tagLineJSON =
+ _TagLineJSON.fromJson(jsonDecode(json) as Map);
+ return tagLineJSON.toTagLine(locale);
+ } catch (_) {
+ return null;
+ }
+ }
+
+ /// API URL: [https://world.openfoodfacts.[org/net]/resources/files/tagline-off-ios-v3.json]
+ /// or [https://world.openfoodfacts.[org/net]/resources/files/tagline-off-android-v3.json]
+ Future _fetchJSON() async {
+ try {
+ final UriProductHelper uriProductHelper = ProductQuery.uriProductHelper;
+ final Map headers = {};
+ final Uri uri;
+
+ if (_uriOverride?.isNotEmpty == true) {
+ uri = Uri.parse(_uriOverride!);
+ } else {
+ uri = uriProductHelper.getUri(path: _newsUrl);
+ }
+
+ if (uriProductHelper.userInfoForPatch != null) {
+ headers['Authorization'] =
+ 'Basic ${base64Encode(utf8.encode(uriProductHelper.userInfoForPatch!))}';
+ }
+
+ final http.Response response = await http.get(uri, headers: headers);
+
+ if (response.statusCode == 404) {
+ Logs.e("Remote file $uri doesn't exist!");
+ throw Exception('Incorrect URL= $uri');
+ }
+
+ final String json = const Utf8Decoder().convert(response.bodyBytes);
+
+ if (!json.startsWith('[') && !json.startsWith('{')) {
+ throw Exception('Invalid JSON');
+ }
+ await _saveNewsToCache(json);
+ return json;
+ } catch (_) {
+ return null;
+ }
+ }
+
+ /// Based on the platform, the URL may differ
+ String get _newsUrl {
+ if (Platform.isIOS || Platform.isMacOS) {
+ return '/resources/files/tagline-off-ios-v3.json';
+ } else {
+ return '/resources/files/tagline-off-android-v3.json';
+ }
+ }
+
+ Future get _newsCacheFile => getApplicationCacheDirectory()
+ .then((Directory dir) => File(join(dir.path, 'tagline.json')));
+
+ Future _saveNewsToCache(final String json) async {
+ final File file = await _newsCacheFile;
+ return file.writeAsString(json);
+ }
+
+ bool _isNewsCacheValid(File file) =>
+ file.existsSync() &&
+ file.lengthSync() > 0 &&
+ file
+ .lastModifiedSync()
+ .isAfter(DateTime.now().add(const Duration(days: -1)));
+
+ bool? _prodEnv;
+ String? _domain;
+ String? _uriOverride;
+
+ /// [ProductQuery.uriProductHelper] is not synced yet,
+ /// so we have to check it manually
+ Future _onPreferencesChanged() async {
+ final String jsonURI = _preferences.getDevModeString(
+ UserPreferencesDevMode.userPreferencesCustomNewsJSONURI) ??
+ '';
+ final String domain = _preferences.getDevModeString(
+ UserPreferencesDevMode.userPreferencesTestEnvDomain) ??
+ '';
+ final bool prodEnv =
+ _preferences.getFlag(UserPreferencesDevMode.userPreferencesFlagProd) ??
+ true;
+
+ if (domain != _domain || prodEnv != _prodEnv || jsonURI != _uriOverride) {
+ _domain = domain;
+ _prodEnv = prodEnv;
+ _uriOverride = jsonURI;
+ loadLatestNews(forceUpdate: true);
+ }
+ }
+
+ @override
+ void dispose() {
+ _preferences.removeListener(_onPreferencesChanged);
+ super.dispose();
+ }
+}
+
+sealed class AppNewsState {
+ const AppNewsState();
+}
+
+final class AppNewsStateLoading extends AppNewsState {
+ const AppNewsStateLoading();
+}
+
+class AppNewsStateLoaded extends AppNewsState {
+ const AppNewsStateLoaded(this.content, this.lastUpdate);
+
+ final AppNews content;
+ final DateTime lastUpdate;
+}
+
+class AppNewsStateError extends AppNewsState {
+ const AppNewsStateError(this.exception);
+
+ final dynamic exception;
+}
diff --git a/packages/smooth_app/lib/data_models/onboarding_loader.dart b/packages/smooth_app/lib/data_models/onboarding_loader.dart
index 9ba991956e8..33a193971f3 100644
--- a/packages/smooth_app/lib/data_models/onboarding_loader.dart
+++ b/packages/smooth_app/lib/data_models/onboarding_loader.dart
@@ -44,8 +44,7 @@ class OnboardingLoader {
}
return;
case OnboardingPage.NOT_STARTED:
- case OnboardingPage.REINVENTION:
- case OnboardingPage.SCAN_EXAMPLE:
+ case OnboardingPage.HOME_PAGE:
case OnboardingPage.HEALTH_CARD_EXAMPLE:
case OnboardingPage.ECO_CARD_EXAMPLE:
case OnboardingPage.PREFERENCES_PAGE:
diff --git a/packages/smooth_app/lib/data_models/personalized_ranking_model.dart b/packages/smooth_app/lib/data_models/personalized_ranking_model.dart
index c39aaa39ec2..03b4b437e2c 100644
--- a/packages/smooth_app/lib/data_models/personalized_ranking_model.dart
+++ b/packages/smooth_app/lib/data_models/personalized_ranking_model.dart
@@ -3,12 +3,7 @@ import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:smooth_app/data_models/product_preferences.dart';
import 'package:smooth_app/database/dao_product.dart';
import 'package:smooth_app/database/local_database.dart';
-
-enum LoadingStatus {
- LOADING,
- LOADED,
- ERROR,
-}
+import 'package:smooth_app/pages/product/common/loading_status.dart';
/// Model that computes the scores and sorts the barcodes accordingly.
class PersonalizedRankingModel with ChangeNotifier {
diff --git a/packages/smooth_app/lib/data_models/preferences/migration/user_preferences_migration.dart b/packages/smooth_app/lib/data_models/preferences/migration/user_preferences_migration.dart
index 08a8b8b1406..5cdb4b9766d 100644
--- a/packages/smooth_app/lib/data_models/preferences/migration/user_preferences_migration.dart
+++ b/packages/smooth_app/lib/data_models/preferences/migration/user_preferences_migration.dart
@@ -78,7 +78,7 @@ class _UserPreferencesMigrationV2 extends UserPreferencesMigration {
null) {
await preferences._sharedPreferences.setInt(
UserPreferences._TAG_USER_GROUP,
- Random().nextInt(10),
+ math.Random().nextInt(10),
);
}
}
diff --git a/packages/smooth_app/lib/data_models/preferences/user_preferences.dart b/packages/smooth_app/lib/data_models/preferences/user_preferences.dart
index 0876509b572..f5c4d3aa077 100644
--- a/packages/smooth_app/lib/data_models/preferences/user_preferences.dart
+++ b/packages/smooth_app/lib/data_models/preferences/user_preferences.dart
@@ -1,4 +1,4 @@
-import 'dart:math';
+import 'dart:math' as math;
import 'package:flutter/material.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
@@ -7,6 +7,7 @@ import 'package:smooth_app/data_models/product_preferences.dart';
import 'package:smooth_app/pages/onboarding/onboarding_flow_navigator.dart';
import 'package:smooth_app/pages/preferences/user_preferences_dev_mode.dart';
import 'package:smooth_app/themes/color_schemes.dart';
+import 'package:smooth_app/themes/theme_provider.dart';
part 'package:smooth_app/data_models/preferences/migration/user_preferences_migration.dart';
@@ -67,12 +68,16 @@ class UserPreferences extends ChangeNotifier {
static const String _TAG_CURRENT_COLOR_SCHEME = 'currentColorScheme';
static const String _TAG_CURRENT_CONTRAST_MODE = 'contrastMode';
static const String _TAG_USER_COUNTRY_CODE = 'userCountry';
+ static const String _TAG_USER_COUNTRY_CODE_LAST_UPDATE =
+ 'userCountryLastUpdate';
+ static const String _TAG_USER_CURRENCY_CODE = 'userCurrency';
static const String _TAG_LAST_VISITED_ONBOARDING_PAGE =
'lastVisitedOnboardingPage';
static const String _TAG_PREFIX_FLAG = 'FLAG_PREFIX_';
static const String _TAG_DEV_MODE = 'devMode';
static const String _TAG_USER_TRACKING = 'user_tracking';
static const String _TAG_CRASH_REPORTS = 'crash_reports';
+ static const String _TAG_PRICES_FEEDBACK_FORM = 'prices_feedback_form';
static const String _TAG_EXCLUDED_ATTRIBUTE_IDS = 'excluded_attributes';
static const String _TAG_USER_GROUP = '_user_group';
static const String _TAG_UNIQUE_RANDOM = '_unique_random';
@@ -88,6 +93,9 @@ class UserPreferences extends ChangeNotifier {
/// Vibrations / haptic feedback
static const String _TAG_HAPTIC_FEEDBACK_IN_APP = 'haptic_feedback_enabled';
+ /// Price privacy warning
+ static const String TAG_PRICE_PRIVACY_WARNING = 'price_privacy_warning';
+
/// Attribute group that is not collapsed
static const String _TAG_ACTIVE_ATTRIBUTE_GROUP = 'activeAttributeGroup';
@@ -104,6 +112,11 @@ class UserPreferences extends ChangeNotifier {
static const String _TAG_USER_KNOWLEDGE_PANEL_ORDER =
'userKnowledgePanelOrder';
+ /// Tagline feed (news displayed / clicked)
+ static const String _TAG_TAGLINE_FEED_NEWS_DISPLAYED =
+ 'taglineFeedNewsDisplayed';
+ static const String _TAG_TAGLINE_FEED_NEWS_CLICKED = 'taglineFeedNewsClicked';
+
Future init(final ProductPreferences productPreferences) async {
await _onMigrate();
@@ -179,7 +192,7 @@ class UserPreferences extends ChangeNotifier {
if (result != null) {
return result;
}
- result = Random().nextInt(1 << 32);
+ result = math.Random().nextInt(1 << 32);
await _sharedPreferences.setInt(tag, result);
return result;
}
@@ -193,8 +206,17 @@ class UserPreferences extends ChangeNotifier {
bool get crashReports =>
_sharedPreferences.getBool(_TAG_CRASH_REPORTS) ?? false;
+ Future markPricesFeedbackFormAsCompleted() async {
+ await _sharedPreferences.setBool(_TAG_PRICES_FEEDBACK_FORM, false);
+ notifyListeners();
+ }
+
+ bool get shouldShowPricesFeedbackForm =>
+ _sharedPreferences.getBool(_TAG_PRICES_FEEDBACK_FORM) ?? true;
+
String get currentTheme =>
- _sharedPreferences.getString(_TAG_CURRENT_THEME_MODE) ?? 'System Default';
+ _sharedPreferences.getString(_TAG_CURRENT_THEME_MODE) ??
+ THEME_SYSTEM_DEFAULT;
String get currentColor =>
_sharedPreferences.getString(_TAG_CURRENT_COLOR_SCHEME) ??
@@ -207,12 +229,24 @@ class UserPreferences extends ChangeNotifier {
/// Please use [ProductQuery.setCountry] as interface
Future setUserCountryCode(final String countryCode) async {
await _sharedPreferences.setString(_TAG_USER_COUNTRY_CODE, countryCode);
+ await _sharedPreferences.setInt(
+ _TAG_USER_COUNTRY_CODE_LAST_UPDATE,
+ DateTime.now().millisecondsSinceEpoch,
+ );
notifyListeners();
}
String? get userCountryCode =>
_sharedPreferences.getString(_TAG_USER_COUNTRY_CODE);
+ Future setUserCurrencyCode(final String code) async {
+ await _sharedPreferences.setString(_TAG_USER_CURRENCY_CODE, code);
+ notifyListeners();
+ }
+
+ String? get userCurrencyCode =>
+ _sharedPreferences.getString(_TAG_USER_CURRENCY_CODE);
+
Future setLastVisitedOnboardingPage(final OnboardingPage page) async {
await _sharedPreferences.setInt(
_TAG_LAST_VISITED_ONBOARDING_PAGE, page.index);
@@ -223,6 +257,7 @@ class UserPreferences extends ChangeNotifier {
await setLastVisitedOnboardingPage(OnboardingPage.NOT_STARTED);
// for tests with a fresh null country
await _sharedPreferences.remove(_TAG_USER_COUNTRY_CODE);
+ await _sharedPreferences.remove(_TAG_USER_CURRENCY_CODE);
notifyListeners();
}
@@ -231,7 +266,8 @@ class UserPreferences extends ChangeNotifier {
_sharedPreferences.getInt(_TAG_LAST_VISITED_ONBOARDING_PAGE);
return pageIndex == null
? OnboardingPage.NOT_STARTED
- : OnboardingPage.values[pageIndex];
+ : OnboardingPage
+ .values[math.min(pageIndex, OnboardingPage.values.length - 1)];
}
Future incrementScanCount() async {
@@ -359,4 +395,56 @@ class UserPreferences extends ChangeNotifier {
_TAG_USER_KNOWLEDGE_PANEL_ORDER, source);
notifyListeners();
}
+
+ List get taglineFeedDisplayedNews =>
+ _sharedPreferences.getStringList(_TAG_TAGLINE_FEED_NEWS_DISPLAYED) ??
+ [];
+
+ List get taglineFeedClickedNews =>
+ _sharedPreferences.getStringList(_TAG_TAGLINE_FEED_NEWS_CLICKED) ??
+ [];
+
+ // This method voluntarily does not notify listeners (not needed)
+ Future taglineFeedMarkNewsAsDisplayed(final String ids) async {
+ final List displayedNews = taglineFeedDisplayedNews;
+ final List clickedNews = taglineFeedClickedNews;
+
+ if (!displayedNews.contains(ids)) {
+ displayedNews.add(ids);
+ _sharedPreferences.setStringList(
+ _TAG_TAGLINE_FEED_NEWS_DISPLAYED,
+ displayedNews,
+ );
+ }
+
+ if (clickedNews.contains(ids)) {
+ clickedNews.remove(ids);
+ _sharedPreferences.setStringList(
+ _TAG_TAGLINE_FEED_NEWS_CLICKED,
+ clickedNews,
+ );
+ }
+ }
+
+ // This method voluntarily does not notify listeners (not needed)
+ Future taglineFeedMarkNewsAsClicked(final String ids) async {
+ final List displayedNews = taglineFeedDisplayedNews;
+ final List clickedNews = taglineFeedClickedNews;
+
+ if (displayedNews.contains(ids)) {
+ displayedNews.remove(ids);
+ _sharedPreferences.setStringList(
+ _TAG_TAGLINE_FEED_NEWS_DISPLAYED,
+ displayedNews,
+ );
+ }
+
+ if (!clickedNews.contains(ids)) {
+ clickedNews.add(ids);
+ _sharedPreferences.setStringList(
+ _TAG_TAGLINE_FEED_NEWS_CLICKED,
+ clickedNews,
+ );
+ }
+ }
}
diff --git a/packages/smooth_app/lib/data_models/product_query_model.dart b/packages/smooth_app/lib/data_models/product_query_model.dart
index 534b7e6101d..f9eeccb55b0 100644
--- a/packages/smooth_app/lib/data_models/product_query_model.dart
+++ b/packages/smooth_app/lib/data_models/product_query_model.dart
@@ -1,11 +1,6 @@
import 'package:flutter/material.dart';
import 'package:smooth_app/data_models/product_list_supplier.dart';
-
-enum LoadingStatus {
- LOADING,
- LOADED,
- ERROR,
-}
+import 'package:smooth_app/pages/product/common/loading_status.dart';
class ProductQueryModel with ChangeNotifier {
ProductQueryModel(this._supplier) {
diff --git a/packages/smooth_app/lib/data_models/tagline.dart b/packages/smooth_app/lib/data_models/tagline.dart
deleted file mode 100644
index 9c392294b14..00000000000
--- a/packages/smooth_app/lib/data_models/tagline.dart
+++ /dev/null
@@ -1,88 +0,0 @@
-import 'dart:convert';
-import 'dart:io';
-
-import 'package:http/http.dart' as http;
-import 'package:openfoodfacts/openfoodfacts.dart';
-import 'package:smooth_app/helpers/collections_helper.dart';
-import 'package:smooth_app/query/product_query.dart';
-
-/// A tagline is the text displayed on the homepage
-/// It may contain a link to an external resource
-/// No cache is expected here
-/// API URL: [https://world.openfoodfacts.org/files/tagline-off-ios-v2.json] or
-/// [https://world.openfoodfacts.org/files/tagline-off-android-v2.json]
-Future fetchTagLine() {
- final String locale = ProductQuery.getLanguage().code;
-
- return http
- .get(
- Uri.https(
- 'world.openfoodfacts.org',
- _tagLineUrl,
- ),
- )
- .then(
- (http.Response value) => const Utf8Decoder().convert(value.bodyBytes))
- .then((String value) =>
- _TagLine.fromJSON(jsonDecode(value) as List))
- .then((_TagLine tagLine) => tagLine[locale] ?? tagLine['en'])
- .catchError((dynamic err) => null);
-}
-
-/// Based on the platform, the URL may differ
-String get _tagLineUrl {
- if (Platform.isIOS || Platform.isMacOS) {
- return '/files/tagline-off-ios-v2.json';
- } else {
- return '/files/tagline-off-android-v2.json';
- }
-}
-
-class _TagLine {
- _TagLine.fromJSON(List json)
- : _items = Map.fromEntries(
- json.map(
- (dynamic element) {
- return MapEntry(
- ((element as Map)['language'] as String)
- .toLowerCase(),
- TagLineItem._fromJSON(element['data'] as Map),
- );
- },
- ),
- );
-
- /// Taglines by their locale
- final Map _items;
-
- /// Finds a tagline with its locale
- TagLineItem? operator [](String key) {
- final String locale = key.toLowerCase();
-
- // Let's try with the full locale
- if (_items.containsKey(locale)) {
- return _items[locale];
- }
-
- // Let's try with the language only (eg => fr_FR to fr)
- final String languageCode = locale.substring(0, 2);
-
- if (_items.containsKey(languageCode)) {
- return _items[languageCode];
- } else {
- // Finally let's try with a subset (eg => no fr_BE but fr_FR)
- return _items.getValueByKeyStartWith(languageCode, ignoreCase: true);
- }
- }
-}
-
-class TagLineItem {
- TagLineItem._fromJSON(Map json)
- : url = json['url'] as String,
- message = json['message'] as String;
-
- final String url;
- final String message;
-
- bool get hasLink => url.startsWith('http');
-}
diff --git a/packages/smooth_app/lib/data_models/user_management_provider.dart b/packages/smooth_app/lib/data_models/user_management_provider.dart
index e1d02a40d8a..57499661469 100644
--- a/packages/smooth_app/lib/data_models/user_management_provider.dart
+++ b/packages/smooth_app/lib/data_models/user_management_provider.dart
@@ -1,3 +1,5 @@
+import 'dart:async';
+
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
@@ -45,7 +47,7 @@ class UserManagementProvider with ChangeNotifier {
try {
effectiveUserId = userId ?? await DaoSecuredString.get(_USER_ID);
effectivePassword = password ?? await DaoSecuredString.get(_PASSWORD);
- effectiveCookie = password ?? await DaoSecuredString.get(_COOKIE);
+ effectiveCookie = await DaoSecuredString.get(_COOKIE);
} on PlatformException {
/// Decrypting the values can go wrong if, for example, the app was
/// manually overwritten from an external apk.
@@ -55,9 +57,7 @@ class UserManagementProvider with ChangeNotifier {
Logs.e('Credentials query failed, you have been logged out');
}
- if (effectiveUserId == null ||
- effectivePassword == null ||
- effectiveCookie == null) {
+ if (effectiveUserId == null || effectivePassword == null) {
return;
}
@@ -112,14 +112,16 @@ class UserManagementProvider with ChangeNotifier {
password: user.password,
),
);
- switch (loginResult.type) {
- case LoginResultType.successful:
- case LoginResultType.serverIssue:
- case LoginResultType.exception:
- return;
- case LoginResultType.unsuccessful:
- // TODO(m123): Notify the user
- await logout();
+
+ if (loginResult.type == LoginResultType.unsuccessful) {
+ // TODO(m123): Notify the user
+ await logout();
+ return;
+ }
+
+ /// Save the cookie if necessary
+ if (user.cookie == null && loginResult.user?.cookie != null) {
+ putUser(loginResult.user!);
}
}
}
diff --git a/packages/smooth_app/lib/database/dao_osm_location.dart b/packages/smooth_app/lib/database/dao_osm_location.dart
new file mode 100644
index 00000000000..b02e041f70c
--- /dev/null
+++ b/packages/smooth_app/lib/database/dao_osm_location.dart
@@ -0,0 +1,127 @@
+import 'dart:async';
+import 'package:openfoodfacts/openfoodfacts.dart';
+import 'package:smooth_app/database/abstract_sql_dao.dart';
+import 'package:smooth_app/database/local_database.dart';
+import 'package:smooth_app/pages/locations/osm_location.dart';
+import 'package:sqflite/sqflite.dart';
+
+/// DAO about OSM locations.
+class DaoOsmLocation extends AbstractSqlDao {
+ DaoOsmLocation(super.localDatabase);
+
+ static const String _table = 'osm_location';
+ static const String _columnId = 'osm_id';
+ static const String _columnType = 'osm_type';
+ static const String _columnLongitude = 'longitude';
+ static const String _columnLatitude = 'latitude';
+ static const String _columnName = 'name';
+ static const String _columnStreet = 'street';
+ static const String _columnCity = 'city';
+ static const String _columnPostCode = 'post_code';
+ static const String _columnCountry = 'country';
+ static const String _columnCountryCode = 'country_code';
+ static const String _columnLastAccess = 'last_access';
+
+ static const List _columns = [
+ _columnId,
+ _columnType,
+ _columnLongitude,
+ _columnLatitude,
+ _columnName,
+ _columnStreet,
+ _columnCity,
+ _columnPostCode,
+ _columnCountry,
+ _columnCountryCode,
+ _columnLastAccess,
+ ];
+
+ static FutureOr onUpgrade(
+ final Database db,
+ final int oldVersion,
+ final int newVersion,
+ ) async {
+ if (oldVersion < 6) {
+ await db.execute('create table $_table('
+ ' $_columnId INT NOT NULL'
+ ',$_columnType TEXT NOT NULL'
+ ',$_columnLongitude REAL NOT NULL'
+ ',$_columnLatitude REAL NOT NULL'
+ ',$_columnName TEXT'
+ ',$_columnStreet TEXT'
+ ',$_columnCity TEXT'
+ ',$_columnPostCode TEXT'
+ ',$_columnCountry TEXT'
+ ',$_columnCountryCode TEXT'
+ ',$_columnLastAccess INT NOT NULL'
+ // cf. https://www.sqlite.org/lang_conflict.html
+ ',PRIMARY KEY($_columnId,$_columnType) on conflict replace'
+ ')');
+ }
+ }
+
+ /// Deletes the [OsmLocation] that matches the key.
+ Future delete(final OsmLocation osmLocation) async =>
+ localDatabase.database.delete(
+ _table,
+ where: '$_columnId = ? AND $_columnType = ?',
+ whereArgs: [osmLocation.osmId, osmLocation.osmType.offTag],
+ );
+
+ /// Returns all the [OsmLocation]s, ordered by descending last access.
+ Future> getAll() async {
+ final List result = [];
+ final List> queryResults =
+ await localDatabase.database.query(
+ _table,
+ columns: _columns,
+ orderBy: '$_columnLastAccess DESC',
+ );
+ for (final Map row in queryResults) {
+ final OsmLocation? item = _getItemFromQueryResult(row);
+ if (item != null) {
+ result.add(item);
+ }
+ }
+ return result;
+ }
+
+ Future put(final OsmLocation osmLocation) async =>
+ localDatabase.database.insert(
+ _table,
+ {
+ _columnId: osmLocation.osmId,
+ _columnType: osmLocation.osmType.offTag,
+ _columnLongitude: osmLocation.longitude,
+ _columnLatitude: osmLocation.latitude,
+ _columnName: osmLocation.name,
+ _columnStreet: osmLocation.street,
+ _columnCity: osmLocation.city,
+ _columnPostCode: osmLocation.postcode,
+ _columnCountry: osmLocation.country,
+ _columnCountryCode: osmLocation.countryCode,
+ _columnLastAccess: LocalDatabase.nowInMillis(),
+ },
+ );
+
+ OsmLocation? _getItemFromQueryResult(final Map row) {
+ final LocationOSMType? type =
+ LocationOSMType.fromOffTag(row[_columnType] as String);
+ if (type == null) {
+ // very very unlikely
+ return null;
+ }
+ return OsmLocation(
+ osmId: row[_columnId] as int,
+ osmType: type,
+ longitude: row[_columnLongitude] as double,
+ latitude: row[_columnLatitude] as double,
+ name: row[_columnName] as String?,
+ street: row[_columnStreet] as String?,
+ city: row[_columnCity] as String?,
+ postcode: row[_columnPostCode] as String?,
+ country: row[_columnCountry] as String?,
+ countryCode: row[_columnCountryCode] as String?,
+ );
+ }
+}
diff --git a/packages/smooth_app/lib/database/dao_string_list.dart b/packages/smooth_app/lib/database/dao_string_list.dart
index 568e48d8790..ff42487464f 100644
--- a/packages/smooth_app/lib/database/dao_string_list.dart
+++ b/packages/smooth_app/lib/database/dao_string_list.dart
@@ -8,7 +8,11 @@ class DaoStringList extends AbstractDao {
static const String _hiveBoxName = 'stringList';
- static const String keySearchHistory = 'searchHistory';
+ /// Key for the list of product search history.
+ static const String keySearchProductHistory = 'searchHistory';
+
+ /// Key for the list of location search history
+ static const String keySearchLocationHistory = 'searchLocationHistory';
/// Key for the list of task ids.
static const String keyTasks = 'tasks';
@@ -18,7 +22,8 @@ class DaoStringList extends AbstractDao {
/// Max lengths of each key (null means no limit).
static const Map _maxLengths = {
- keySearchHistory: 10,
+ keySearchProductHistory: 10,
+ keySearchLocationHistory: 10,
keyTasks: null,
// TODO(monsieurtanuki): more "latest" languages are possible if we create a page to remove some of them
keyLanguages: 1,
diff --git a/packages/smooth_app/lib/database/local_database.dart b/packages/smooth_app/lib/database/local_database.dart
index 5df0729e0b3..b3542785dee 100644
--- a/packages/smooth_app/lib/database/local_database.dart
+++ b/packages/smooth_app/lib/database/local_database.dart
@@ -12,6 +12,7 @@ import 'package:smooth_app/database/abstract_dao.dart';
import 'package:smooth_app/database/dao_hive_product.dart';
import 'package:smooth_app/database/dao_instant_string.dart';
import 'package:smooth_app/database/dao_int.dart';
+import 'package:smooth_app/database/dao_osm_location.dart';
import 'package:smooth_app/database/dao_product.dart';
import 'package:smooth_app/database/dao_product_last_access.dart';
import 'package:smooth_app/database/dao_product_list.dart';
@@ -20,7 +21,7 @@ import 'package:smooth_app/database/dao_string_list.dart';
import 'package:smooth_app/database/dao_string_list_map.dart';
import 'package:smooth_app/database/dao_transient_operation.dart';
import 'package:smooth_app/database/dao_work_barcode.dart';
-import 'package:sqflite/sqflite.dart';
+import 'package:sqflite_common_ffi/sqflite_ffi.dart';
class LocalDatabase extends ChangeNotifier {
LocalDatabase._(final Database database) : _database = database {
@@ -52,18 +53,22 @@ class LocalDatabase extends ChangeNotifier {
static Future getLocalDatabase() async {
// sql from there
- final String databasesRootPath;
+ String? databasesRootPath;
if (defaultTargetPlatform == TargetPlatform.iOS) {
// as suggested in https://pub.dev/documentation/sqflite/latest/sqflite/getDatabasesPath.html
final Directory directory = await getLibraryDirectory();
databasesRootPath = directory.path;
- } else {
- databasesRootPath = await getDatabasesPath();
+ } else if (Platform.isLinux || Platform.isWindows) {
+ sqfliteFfiInit();
+ databaseFactory = databaseFactoryFfi;
}
+
+ databasesRootPath ??= await getDatabasesPath();
+
final String databasePath = join(databasesRootPath, 'smoothie.db');
final Database database = await openDatabase(
databasePath,
- version: 5,
+ version: 6,
singleInstance: true,
onUpgrade: _onUpgrade,
);
@@ -107,5 +112,6 @@ class LocalDatabase extends ChangeNotifier {
await DaoProduct.onUpgrade(db, oldVersion, newVersion);
await DaoWorkBarcode.onUpgrade(db, oldVersion, newVersion);
await DaoProductLastAccess.onUpgrade(db, oldVersion, newVersion);
+ await DaoOsmLocation.onUpgrade(db, oldVersion, newVersion);
}
}
diff --git a/packages/smooth_app/lib/generic_lib/buttons/smooth_simple_button.dart b/packages/smooth_app/lib/generic_lib/buttons/smooth_simple_button.dart
index cc978a528ab..52dae9e156d 100644
--- a/packages/smooth_app/lib/generic_lib/buttons/smooth_simple_button.dart
+++ b/packages/smooth_app/lib/generic_lib/buttons/smooth_simple_button.dart
@@ -33,19 +33,19 @@ class SmoothSimpleButton extends StatelessWidget {
style: ButtonStyle(
backgroundColor: buttonColor == null
? null
- : MaterialStateProperty.all(buttonColor!),
- shape: MaterialStateProperty.all(
+ : WidgetStateProperty.all(buttonColor!),
+ shape: WidgetStateProperty.all(
RoundedRectangleBorder(borderRadius: borderRadius),
),
overlayColor: context.read().isAmoledTheme
- ? MaterialStateProperty.resolveWith((Set states) {
- return states.contains(MaterialState.pressed)
+ ? WidgetStateProperty.resolveWith((Set states) {
+ return states.contains(WidgetState.pressed)
? Theme.of(context).colorScheme.primary.withOpacity(0.3)
: null;
})
: null,
side: context.read().isAmoledTheme
- ? MaterialStateProperty.all(
+ ? WidgetStateProperty.all(
const BorderSide(color: Colors.white),
)
: null,
diff --git a/packages/smooth_app/lib/generic_lib/dialogs/smooth_alert_dialog.dart b/packages/smooth_app/lib/generic_lib/dialogs/smooth_alert_dialog.dart
index f9f51c0aed0..0d03fca3a89 100644
--- a/packages/smooth_app/lib/generic_lib/dialogs/smooth_alert_dialog.dart
+++ b/packages/smooth_app/lib/generic_lib/dialogs/smooth_alert_dialog.dart
@@ -26,6 +26,7 @@ import 'package:smooth_app/helpers/keyboard_helper.dart';
class SmoothAlertDialog extends StatelessWidget {
const SmoothAlertDialog({
this.title,
+ this.leadingTitle,
required this.body,
this.positiveAction,
this.negativeAction,
@@ -41,6 +42,7 @@ class SmoothAlertDialog extends StatelessWidget {
);
final String? title;
+ final Widget? leadingTitle;
final bool close;
final Widget body;
final SmoothActionButton? positiveAction;
@@ -143,7 +145,12 @@ class SmoothAlertDialog extends StatelessWidget {
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
- if (title != null) _SmoothDialogTitle(label: title!, close: close),
+ if (title != null)
+ _SmoothDialogTitle(
+ label: title!,
+ close: close,
+ leading: leadingTitle,
+ ),
body,
],
),
@@ -158,15 +165,20 @@ class _SmoothDialogTitle extends StatelessWidget {
const _SmoothDialogTitle({
required this.label,
required this.close,
+ this.leading,
});
static const double _titleHeight = 32.0;
final String label;
final bool close;
+ final Widget? leading;
@override
Widget build(BuildContext context) {
+ final TextStyle textStyle =
+ Theme.of(context).textTheme.displayMedium ?? const TextStyle();
+
return Column(
mainAxisSize: MainAxisSize.min,
children: [
@@ -176,12 +188,24 @@ class _SmoothDialogTitle extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.spaceEvenly,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
+ if (leading != null)
+ Padding(
+ padding: EdgeInsetsDirectional.only(
+ top: leading is Icon ? 2.0 : 0.0,
+ end: SMALL_SPACE,
+ ),
+ child: IconTheme(
+ data: IconThemeData(
+ color: textStyle.color,
+ ),
+ child: leading!),
+ ),
_buildCross(true),
Expanded(
child: FittedBox(
child: Text(
label,
- style: Theme.of(context).textTheme.displayMedium,
+ style: textStyle,
),
),
),
@@ -189,7 +213,7 @@ class _SmoothDialogTitle extends StatelessWidget {
],
),
),
- Divider(color: Theme.of(context).colorScheme.onBackground),
+ Divider(color: Theme.of(context).colorScheme.onSurface),
const SizedBox(height: 12),
],
);
@@ -221,16 +245,21 @@ class _SmoothDialogCrossButton extends StatelessWidget {
maintainAnimation: true,
maintainState: true,
visible: visible,
- child: InkWell(
- customBorder: const CircleBorder(),
- child: const Padding(
- padding: EdgeInsets.all(SMALL_SPACE),
- child: Icon(
- Icons.close,
- size: _SmoothDialogTitle._titleHeight - (2 * SMALL_SPACE),
+ child: Semantics(
+ label: MaterialLocalizations.of(context).closeButtonLabel,
+ button: true,
+ excludeSemantics: true,
+ child: InkWell(
+ customBorder: const CircleBorder(),
+ child: const Padding(
+ padding: EdgeInsets.all(SMALL_SPACE),
+ child: Icon(
+ Icons.close,
+ size: _SmoothDialogTitle._titleHeight - (2 * SMALL_SPACE),
+ ),
),
+ onTap: () => Navigator.of(context, rootNavigator: true).pop(),
),
- onTap: () => Navigator.of(context, rootNavigator: true).pop(),
),
);
} else {
@@ -670,9 +699,9 @@ class SmoothListAlertDialog extends StatelessWidget {
vertical: SMALL_SPACE,
),
body: SizedBox(
- height: MediaQuery.of(context).size.height /
+ height: MediaQuery.sizeOf(context).height /
(context.keyboardVisible ? 1.0 : 1.5),
- width: MediaQuery.of(context).size.width,
+ width: MediaQuery.sizeOf(context).width,
child: Column(
children: [
Container(
diff --git a/packages/smooth_app/lib/generic_lib/svg_icon_chip.dart b/packages/smooth_app/lib/generic_lib/svg_icon_chip.dart
index 0c0af7d78b2..b1081c96757 100644
--- a/packages/smooth_app/lib/generic_lib/svg_icon_chip.dart
+++ b/packages/smooth_app/lib/generic_lib/svg_icon_chip.dart
@@ -11,7 +11,7 @@ class SvgIconChip extends StatelessWidget {
final double height;
@override
- Widget build(BuildContext context) => Container(
+ Widget build(BuildContext context) => ConstrainedBox(
constraints: BoxConstraints(minWidth: height),
child: SvgCache(iconUrl, height: height),
);
diff --git a/packages/smooth_app/lib/generic_lib/widgets/images/smooth_image.dart b/packages/smooth_app/lib/generic_lib/widgets/images/smooth_image.dart
index 3e8a6be7cf1..95e24525693 100644
--- a/packages/smooth_app/lib/generic_lib/widgets/images/smooth_image.dart
+++ b/packages/smooth_app/lib/generic_lib/widgets/images/smooth_image.dart
@@ -18,7 +18,16 @@ class SmoothImage extends StatelessWidget {
this.fit = BoxFit.cover,
this.rounded = true,
this.heroTag,
- });
+ this.cacheWidth,
+ this.cacheHeight,
+ }) : assert(
+ cacheWidth == null || imageProvider is NetworkImage,
+ 'cacheWidth requires a NetworkImage',
+ ),
+ assert(
+ cacheHeight == null || imageProvider is NetworkImage,
+ 'cacheHeight requires a NetworkImage',
+ );
final ImageProvider? imageProvider;
final double? height;
@@ -28,17 +37,28 @@ class SmoothImage extends StatelessWidget {
final BoxFit fit;
final String? heroTag;
final bool rounded;
+ final int? cacheWidth;
+ final int? cacheHeight;
@override
Widget build(BuildContext context) {
- Widget child = imageProvider == null
- ? const PictureNotFound()
- : Image(
- image: imageProvider!,
- fit: fit,
- loadingBuilder: _loadingBuilder,
- errorBuilder: _errorBuilder,
- );
+ Widget child = switch (imageProvider) {
+ NetworkImage(url: final String url) => Image.network(
+ url,
+ fit: fit,
+ loadingBuilder: _loadingBuilder,
+ errorBuilder: _errorBuilder,
+ cacheWidth: cacheWidth,
+ cacheHeight: cacheHeight,
+ ),
+ ImageProvider() => Image(
+ image: imageProvider!,
+ fit: fit,
+ loadingBuilder: _loadingBuilder,
+ errorBuilder: _errorBuilder,
+ ),
+ _ => const PictureNotFound(),
+ };
if (heroTag != null) {
child = Hero(tag: heroTag!, child: child);
diff --git a/packages/smooth_app/lib/generic_lib/widgets/smooth_back_button.dart b/packages/smooth_app/lib/generic_lib/widgets/smooth_back_button.dart
index 038dc1359e6..ca4e99636d1 100644
--- a/packages/smooth_app/lib/generic_lib/widgets/smooth_back_button.dart
+++ b/packages/smooth_app/lib/generic_lib/widgets/smooth_back_button.dart
@@ -16,13 +16,21 @@ class SmoothBackButton extends StatelessWidget {
final Color? iconColor;
@override
- Widget build(BuildContext context) => Material(
- type: MaterialType.transparency,
+ Widget build(BuildContext context) {
+ final MaterialLocalizations localizations =
+ MaterialLocalizations.of(context);
+
+ return Material(
+ type: MaterialType.transparency,
+ child: Semantics(
+ value: localizations.backButtonTooltip,
+ button: true,
+ excludeSemantics: true,
child: InkWell(
onTap: onPressed ?? () => Navigator.maybePop(context),
customBorder: const CircleBorder(),
child: Tooltip(
- message: MaterialLocalizations.of(context).backButtonTooltip,
+ message: localizations.backButtonTooltip,
child: Padding(
padding: _iconPadding,
child: Icon(
@@ -36,7 +44,9 @@ class SmoothBackButton extends StatelessWidget {
),
),
),
- );
+ ),
+ );
+ }
/// The iOS/macOS icon requires a little padding to be well-centered
EdgeInsetsGeometry get _iconPadding {
diff --git a/packages/smooth_app/lib/generic_lib/widgets/smooth_gauge.dart b/packages/smooth_app/lib/generic_lib/widgets/smooth_gauge.dart
deleted file mode 100644
index 95d6643461c..00000000000
--- a/packages/smooth_app/lib/generic_lib/widgets/smooth_gauge.dart
+++ /dev/null
@@ -1,43 +0,0 @@
-import 'package:flutter/material.dart';
-import 'package:percent_indicator/percent_indicator.dart';
-
-class SmoothGauge extends StatelessWidget {
- const SmoothGauge({
- required this.value,
- this.size = 80.0,
- required this.color,
- this.backgroundColor,
- this.circular = true,
- this.width = 100.0,
- });
-
- final double value;
- final double size;
- final Color color;
- final Color? backgroundColor;
- final bool circular;
- final double width;
-
- @override
- Widget build(BuildContext context) {
- return circular
- ? CircularPercentIndicator(
- radius: size,
- lineWidth: 5.0,
- percent: value <= 1.0 ? value : 1.0,
- center: Text(
- '${(value * 100).floor()}%',
- style: TextStyle(color: color),
- ),
- progressColor: color,
- backgroundColor: backgroundColor ?? color.withAlpha(50),
- circularStrokeCap: CircularStrokeCap.round,
- )
- : LinearPercentIndicator(
- width: width,
- percent: value <= 1.0 ? value : 1.0,
- progressColor: color,
- backgroundColor: backgroundColor ?? color.withAlpha(50),
- );
- }
-}
diff --git a/packages/smooth_app/lib/generic_lib/widgets/smooth_text_form_field.dart b/packages/smooth_app/lib/generic_lib/widgets/smooth_text_form_field.dart
index 8ea02fadb2a..ce4d0fc6166 100644
--- a/packages/smooth_app/lib/generic_lib/widgets/smooth_text_form_field.dart
+++ b/packages/smooth_app/lib/generic_lib/widgets/smooth_text_form_field.dart
@@ -24,6 +24,7 @@ class SmoothTextFormField extends StatefulWidget {
this.onFieldSubmitted,
this.autofocus,
this.focusNode,
+ this.spellCheckConfiguration,
});
final TextFieldTypes type;
@@ -40,6 +41,7 @@ class SmoothTextFormField extends StatefulWidget {
final ValueChanged? onFieldSubmitted;
final bool? autofocus;
final FocusNode? focusNode;
+ final SpellCheckConfiguration? spellCheckConfiguration;
@override
State createState() => _SmoothTextFormFieldState();
@@ -83,6 +85,8 @@ class _SmoothTextFormFieldState extends State {
setState(() {});
}
},
+ spellCheckConfiguration: widget.spellCheckConfiguration ??
+ const SpellCheckConfiguration.disabled(),
onFieldSubmitted: widget.onFieldSubmitted,
style: TextStyle(fontSize: textSize),
cursorHeight: textSize * (textStyle.height ?? 1.4),
diff --git a/packages/smooth_app/lib/helpers/launch_url_helper.dart b/packages/smooth_app/lib/helpers/launch_url_helper.dart
index 95a8aff0bcc..3e1264d2f16 100644
--- a/packages/smooth_app/lib/helpers/launch_url_helper.dart
+++ b/packages/smooth_app/lib/helpers/launch_url_helper.dart
@@ -1,10 +1,26 @@
import 'dart:io';
+import 'package:flutter/widgets.dart';
+import 'package:go_router/go_router.dart';
import 'package:smooth_app/helpers/analytics_helper.dart';
import 'package:url_launcher/url_launcher.dart';
class LaunchUrlHelper {
- LaunchUrlHelper._();
+ const LaunchUrlHelper._();
+
+ static Future launchURLAndFollowDeepLinks(
+ BuildContext context,
+ String url,
+ ) async {
+ assert(url.isNotEmpty);
+
+ if (url.startsWith(RegExp('http(s)?://[a-z]*.openfoodfacts.(net|org)'))) {
+ AnalyticsHelper.trackOutlink(url: url);
+ GoRouter.of(context).go(url);
+ } else {
+ return launchURL(url);
+ }
+ }
/// Launches the url in an external browser.
static Future launchURL(String url) async {
diff --git a/packages/smooth_app/lib/helpers/num_utils.dart b/packages/smooth_app/lib/helpers/num_utils.dart
new file mode 100644
index 00000000000..e9dc242b7d4
--- /dev/null
+++ b/packages/smooth_app/lib/helpers/num_utils.dart
@@ -0,0 +1,21 @@
+extension DoubleExtension on double {
+ /// Returns the progress of the current value between [min] and [max].
+ /// /!\ May return < 0 or > 1 values, use [progressAndClamp] if you want to limit the output.
+ /// Eg: 5.progress(0, 10) => 0.5
+ /// Eg: -1.progress(0, 5) => -0.2
+ double progress(num min, num max) {
+ return (this - min) / (max - min);
+ }
+
+ /// Returns the progress of the current value between [min] and [max].
+ /// The minimum value will always be 0 and the maximum value will always be [clamp].
+ double progressAndClamp(num min, double max, double clamp) {
+ return progress(min, max).clamp(0.0, clamp);
+ }
+}
+
+extension IntExtension on int {
+ double progress(int min, int max) {
+ return (this - min) / (max - min);
+ }
+}
diff --git a/packages/smooth_app/lib/helpers/physics.dart b/packages/smooth_app/lib/helpers/physics.dart
new file mode 100644
index 00000000000..8a3b0e30bed
--- /dev/null
+++ b/packages/smooth_app/lib/helpers/physics.dart
@@ -0,0 +1,429 @@
+import 'dart:io';
+import 'dart:math' as math;
+
+import 'package:flutter/rendering.dart';
+import 'package:flutter/widgets.dart';
+import 'package:provider/provider.dart';
+
+class VerticalClampScroll extends StatefulWidget {
+ const VerticalClampScroll({
+ required this.steps,
+ required this.child,
+ super.key,
+ }) : assert(steps.length >= 2);
+
+ final List steps;
+ final Widget child;
+
+ @override
+ State createState() => _VerticalClampScrollState();
+}
+
+class _VerticalClampScrollState extends State {
+ late final Iterable _reversedSteps;
+ final VerticalClampScrollLimiter _limiter = VerticalClampScrollLimiter();
+ ScrollDirection? _direction;
+ ScrollMetrics? _startMetrics;
+
+ @override
+ void initState() {
+ super.initState();
+ _reversedSteps = widget.steps.reversed;
+ }
+
+ @override
+ Widget build(BuildContext context) {
+ return ScrollConfiguration(
+ behavior: _CustomScrollBehavior(
+ VerticalSnapScrollPhysics.get(
+ steps: widget.steps,
+ ),
+ ),
+ child: NotificationListener(
+ onNotification: (ScrollNotification notif) {
+ if (notif.metrics.axisDirection == AxisDirection.left ||
+ notif.metrics.axisDirection == AxisDirection.right) {
+ return false;
+ }
+
+ if (notif is UserScrollNotification) {
+ _direction = notif.direction;
+
+ if (notif.direction != ScrollDirection.idle) {
+ _startMetrics = notif.metrics;
+ }
+ } else if (notif is ScrollUpdateNotification) {
+ _onScrollUpdate(notif);
+ } else if (notif is ScrollEndNotification) {
+ _onScrollEnd(notif);
+ }
+
+ return true;
+ },
+ child: ChangeNotifierProvider(
+ create: (_) => _limiter,
+ child: widget.child,
+ ),
+ ),
+ );
+ }
+
+ void _onScrollEnd(ScrollEndNotification notif) {
+ if (notif.dragDetails != null) {
+ final (double? min, double? max) = _getRange(
+ widget.steps,
+ notif.metrics.pixels,
+ );
+
+ double? scrollTo;
+ // Down
+ if (_direction == ScrollDirection.reverse && max != null) {
+ scrollTo = max;
+ } else if (_direction == ScrollDirection.forward && min != null) {
+ scrollTo = min;
+ }
+
+ if (scrollTo != null) {
+ Future.delayed(Duration.zero, () {
+ context.read().animateTo(
+ scrollTo!,
+ curve: Curves.easeOutCubic,
+ duration: const Duration(milliseconds: 500),
+ );
+ });
+ }
+ }
+ }
+
+ void _onScrollUpdate(ScrollUpdateNotification notif) {
+ if (_direction != ScrollDirection.forward || _startMetrics == null) {
+ return;
+ }
+
+ if (_limiter.value != null && notif.metrics.pixels > _limiter.value!) {
+ context.read().position.correctPixels(_limiter.value!);
+ return;
+ }
+
+ for (int i = 0; i != _reversedSteps.length; i++) {
+ if (_blockScrollIfNecessary(
+ notif, _reversedSteps.elementAt(i), i == _reversedSteps.length - 1)) {
+ break;
+ }
+ }
+ }
+
+ bool _blockScrollIfNecessary(
+ ScrollUpdateNotification notif,
+ double step,
+ bool isLast,
+ ) {
+ if (isLast) {
+ if (_startMetrics!.extentBefore >= step) {
+ if (notif.metrics.pixels <= step) {
+ context.read().position.correctPixels(step);
+ }
+ return true;
+ }
+ }
+
+ return false;
+ }
+}
+
+class VerticalClampScrollLimiter extends ValueNotifier {
+ VerticalClampScrollLimiter() : super(null);
+
+ void limitScroll(double height) {
+ value = height;
+ }
+}
+
+class VerticalSnapScrollPhysics extends ScrollPhysics {
+ static ScrollPhysics get({
+ required List steps,
+ bool lastStepBlocking = true,
+ }) {
+ if (Platform.isIOS || Platform.isMacOS) {
+ return _VerticalSnapBouncingScrollPhysics(
+ steps: steps,
+ lastStepBlocking: lastStepBlocking,
+ );
+ } else {
+ return _VerticalSnapClampingScrollPhysics(
+ steps: steps,
+ lastStepBlocking: lastStepBlocking,
+ );
+ }
+ }
+}
+
+//ignore: must_be_immutable
+class _VerticalSnapClampingScrollPhysics extends ClampingScrollPhysics
+ with _VerticalSnapScrollPhysicsHelper {
+ _VerticalSnapClampingScrollPhysics({
+ required List steps,
+ bool lastStepBlocking = true,
+ }) {
+ _init(
+ steps: steps,
+ lastStepBlocking: lastStepBlocking,
+ );
+ }
+
+ @override
+ _VerticalSnapClampingScrollPhysics applyTo(ScrollPhysics? ancestor) {
+ return _VerticalSnapClampingScrollPhysics(
+ steps: _steps,
+ lastStepBlocking: _lastStepBlocking,
+ );
+ }
+
+ @override
+ Simulation? createBallisticSimulation(
+ ScrollMetrics position,
+ double velocity,
+ ) {
+ return createBallisticSimulation2(position, velocity);
+ }
+}
+
+//ignore: must_be_immutable
+class _VerticalSnapBouncingScrollPhysics extends BouncingScrollPhysics
+ with _VerticalSnapScrollPhysicsHelper {
+ _VerticalSnapBouncingScrollPhysics({
+ required List steps,
+ bool lastStepBlocking = true,
+ }) {
+ _init(
+ steps: steps,
+ lastStepBlocking: lastStepBlocking,
+ );
+ }
+
+ @override
+ _VerticalSnapBouncingScrollPhysics applyTo(ScrollPhysics? ancestor) {
+ return _VerticalSnapBouncingScrollPhysics(
+ steps: _steps,
+ lastStepBlocking: _lastStepBlocking,
+ );
+ }
+
+ @override
+ Simulation? createBallisticSimulation(
+ ScrollMetrics position,
+ double velocity,
+ ) {
+ return createBallisticSimulation2(position, velocity);
+ }
+}
+
+/// A custom [ScrollPhysics] that snaps to specific [steps].
+/// ignore: must_be_immutable
+mixin _VerticalSnapScrollPhysicsHelper on ScrollPhysics {
+ void _init({
+ required List steps,
+ bool lastStepBlocking = true,
+ }) {
+ _steps = steps.toList()..sort();
+ _lastStepBlocking = lastStepBlocking;
+ _ignoreNextScroll = false;
+ }
+
+ late List _steps;
+
+ // If true, scrolling from the bottom with be blocked at the last step
+ // If false, scrolling from the bottom will continue
+ late bool _lastStepBlocking;
+ late bool _ignoreNextScroll;
+
+ double? _lastPixels;
+
+ Simulation? createBallisticSimulation2(
+ ScrollMetrics position,
+ double velocity,
+ ) {
+ final Tolerance tolerance = toleranceFor(position);
+ if (velocity.abs() < tolerance.velocity) {
+ return null;
+ }
+ if (velocity > 0.0 && position.pixels >= position.maxScrollExtent) {
+ _ignoreNextScroll = false;
+ return null;
+ }
+ if (velocity < 0.0 && position.pixels <= position.minScrollExtent) {
+ _ignoreNextScroll = false;
+ return null;
+ }
+
+ final Simulation? simulation =
+ super.createBallisticSimulation(position, velocity);
+ double? proposedPixels = simulation?.x(double.infinity);
+
+ if (simulation == null || proposedPixels == null) {
+ final (double? min, _) = _getRange(_steps, position.pixels);
+
+ if (min != null && min != _steps.last && _ignoreNextScroll) {
+ return ScrollSpringSimulation(
+ spring,
+ position.pixels,
+ min,
+ velocity,
+ tolerance: toleranceFor(position),
+ );
+ } else {
+ _ignoreNextScroll = false;
+ return null;
+ }
+ }
+
+ _ignoreNextScroll = false;
+ final (double? min, double? max) = _getRange(_steps, position.pixels);
+ bool hasChanged = false;
+ if (min != null && max == null) {
+ if (proposedPixels < min) {
+ proposedPixels = min;
+ hasChanged = true;
+ }
+ } else if (min != null && max != null) {
+ if (position.pixels - proposedPixels > 0) {
+ proposedPixels = min;
+ } else {
+ proposedPixels = max;
+ }
+ hasChanged = true;
+ }
+
+ if (_lastPixels == null) {
+ _lastPixels = proposedPixels;
+ } else {
+ _lastPixels = _fixInconsistency(proposedPixels);
+ }
+
+ /// Smooth scroll to a step
+ if (hasChanged && (_lastStepBlocking || position.pixels < _steps.last)) {
+ return ScrollSpringSimulation(
+ spring,
+ position.pixels,
+ _lastPixels!,
+ velocity,
+ tolerance: tolerance,
+ );
+ }
+
+ /// Normal scrolling
+ return simulation;
+ }
+
+ // In some cases, the proposed pixels have a giant space and finding the range
+ // is incorrect. In that case, we ensure to have a contiguous range.
+ double _fixInconsistency(double proposedPixels) {
+ return fixInconsistency(_steps, proposedPixels, _lastPixels!);
+ }
+
+ static double fixInconsistency(
+ List steps,
+ double proposedPixels,
+ double initialPixelPosition,
+ ) {
+ final int newPosition = _getStepPosition(steps, proposedPixels);
+ final int oldPosition = _getStepPosition(steps, initialPixelPosition);
+
+ if (newPosition - oldPosition >= 2) {
+ return steps[math.min(newPosition - 1, 0)];
+ } else if (newPosition - oldPosition <= -2) {
+ return steps[math.min(newPosition + 1, steps.length - 1)];
+ }
+
+ return proposedPixels;
+ }
+
+ static int _getStepPosition(List steps, double pixels) {
+ for (int i = steps.length - 1; i >= 0; i--) {
+ final double step = steps.elementAt(i);
+
+ if (pixels >= step) {
+ return i;
+ }
+ }
+
+ return 0;
+ }
+}
+
+(double?, double?) _getRange(List steps, double position) {
+ for (int i = steps.length - 1; i >= 0; i--) {
+ final double step = steps[i];
+
+ if (i == steps.length - 1 && position > step) {
+ return (step, null);
+ } else if (position > step && position < steps[i + 1]) {
+ return (step, steps[i + 1]);
+ }
+ }
+
+ return (null, null);
+}
+
+class _CustomScrollBehavior extends ScrollBehavior {
+ const _CustomScrollBehavior(this.physics);
+
+ final ScrollPhysics physics;
+
+ @override
+ ScrollPhysics getScrollPhysics(BuildContext context) => physics;
+}
+
+class HorizontalSnapScrollPhysics extends ScrollPhysics {
+ const HorizontalSnapScrollPhysics({super.parent, required this.snapSize});
+
+ final double snapSize;
+
+ @override
+ HorizontalSnapScrollPhysics applyTo(ScrollPhysics? ancestor) {
+ return HorizontalSnapScrollPhysics(
+ parent: buildParent(ancestor), snapSize: snapSize);
+ }
+
+ double _getPage(ScrollMetrics position) {
+ return position.pixels / snapSize;
+ }
+
+ double _getPixels(ScrollMetrics position, double page) {
+ return page * snapSize;
+ }
+
+ double _getTargetPixels(
+ ScrollMetrics position, Tolerance tolerance, double velocity) {
+ double page = _getPage(position);
+ if (velocity < -tolerance.velocity) {
+ page -= 0.5;
+ } else if (velocity > tolerance.velocity) {
+ page += 0.5;
+ }
+ return _getPixels(position, page.roundToDouble());
+ }
+
+ @override
+ Simulation? createBallisticSimulation(
+ ScrollMetrics position,
+ double velocity,
+ ) {
+ // If we're out of range and not headed back in range, defer to the parent
+ // ballistics, which should put us back in range at a page boundary.
+ if ((velocity <= 0.0 && position.pixels <= position.minScrollExtent) ||
+ (velocity >= 0.0 && position.pixels >= position.maxScrollExtent)) {
+ return super.createBallisticSimulation(position, velocity);
+ }
+ final Tolerance tolerance = toleranceFor(position);
+ final double target = _getTargetPixels(position, tolerance, velocity);
+ if (target != position.pixels) {
+ return ScrollSpringSimulation(spring, position.pixels, target, velocity,
+ tolerance: tolerance);
+ }
+ return null;
+ }
+
+ @override
+ bool get allowImplicitScrolling => false;
+}
diff --git a/packages/smooth_app/lib/helpers/product_cards_helper.dart b/packages/smooth_app/lib/helpers/product_cards_helper.dart
index b26a228a7fe..cf8553433f3 100644
--- a/packages/smooth_app/lib/helpers/product_cards_helper.dart
+++ b/packages/smooth_app/lib/helpers/product_cards_helper.dart
@@ -270,6 +270,7 @@ ProductImageData getProductImageData(
imageUrl: productImage.getUrl(
product.barcode!,
imageSize: ImageSize.DISPLAY,
+ uriHelper: ProductQuery.uriProductHelper,
),
language: language,
);
diff --git a/packages/smooth_app/lib/helpers/provider_helper.dart b/packages/smooth_app/lib/helpers/provider_helper.dart
index 9af48309ec6..3e5753cc5a4 100644
--- a/packages/smooth_app/lib/helpers/provider_helper.dart
+++ b/packages/smooth_app/lib/helpers/provider_helper.dart
@@ -38,3 +38,59 @@ class _ListenerState extends SingleChildState> {
return child ?? const SizedBox.shrink();
}
}
+
+/// Same as [Consumer] but only rebuilds if [buildWhen] returns true
+/// (And on the first build)
+class ConsumerFilter extends StatefulWidget {
+ const ConsumerFilter({
+ required this.builder,
+ required this.buildWhen,
+ this.child,
+ super.key,
+ });
+
+ final Widget Function(
+ BuildContext context,
+ T value,
+ Widget? child,
+ ) builder;
+ final bool Function(T? previousValue, T currentValue) buildWhen;
+
+ final Widget? child;
+
+ @override
+ State> createState() => _ConsumerFilterState();
+}
+
+class _ConsumerFilterState extends State> {
+ T? oldValue;
+ Widget? oldWidget;
+
+ @override
+ Widget build(BuildContext context) {
+ return Consumer(
+ builder: (BuildContext context, T value, Widget? child) {
+ if (widget.buildWhen(oldValue, value) || oldWidget == null) {
+ oldWidget = widget.builder(
+ context,
+ value,
+ child,
+ );
+ }
+
+ oldValue = value;
+
+ return widget.builder(
+ context,
+ value,
+ oldWidget,
+ );
+ },
+ child: widget.child,
+ );
+ }
+}
+
+extension ValueNotifierExtensions on ValueNotifier {
+ void emit(T value) => this.value = value;
+}
diff --git a/packages/smooth_app/lib/helpers/strings_helper.dart b/packages/smooth_app/lib/helpers/strings_helper.dart
index 25bfa53d969..055db2cb4db 100644
--- a/packages/smooth_app/lib/helpers/strings_helper.dart
+++ b/packages/smooth_app/lib/helpers/strings_helper.dart
@@ -1,3 +1,5 @@
+import 'package:flutter/material.dart';
+
extension StringExtensions on String {
/// Returns a list containing all positions of a [charCode]
/// By default, the case is taken into account.
@@ -42,3 +44,97 @@ extension StringExtensions on String {
});
}
}
+
+class TextHelper {
+ const TextHelper._();
+
+ /// Split the text into parts.
+ /// Eg: with the symbol '*'
+ /// 'Hello *world*!' => [('Hello ', defaultStyle), ('world', highlightedStyle), ('!', defaultStyle)]
+ static List<(String, TextStyle?)> getPartsBetweenSymbol({
+ required String text,
+ required String symbol,
+ required int symbolLength,
+ required TextStyle? defaultStyle,
+ required TextStyle? highlightedStyle,
+ }) {
+ text = text.replaceAll(r'\n', '\n');
+
+ final Iterable highlightedParts =
+ RegExp('$symbol[^$symbol]+$symbol').allMatches(text);
+
+ final List<(String, TextStyle?)> parts = <(String, TextStyle?)>[];
+
+ if (highlightedParts.isEmpty) {
+ parts.add((text, defaultStyle));
+ } else {
+ parts
+ .add((text.substring(0, highlightedParts.first.start), defaultStyle));
+ for (int i = 0; i != highlightedParts.length; i++) {
+ final RegExpMatch subPart = highlightedParts.elementAt(i);
+
+ parts.add(
+ (
+ text.substring(
+ subPart.start + symbolLength, subPart.end - symbolLength),
+ highlightedStyle
+ ),
+ );
+
+ if (i < highlightedParts.length - 1) {
+ parts.add((
+ text.substring(
+ subPart.end, highlightedParts.elementAt(i + 1).start),
+ defaultStyle
+ ));
+ } else if (subPart.end < text.length) {
+ parts.add((text.substring(subPart.end, text.length), defaultStyle));
+ }
+ }
+ }
+ return parts;
+ }
+}
+
+class FormattedText extends StatelessWidget {
+ const FormattedText({
+ required this.text,
+ this.textStyle,
+ this.textAlign,
+ });
+
+ final String text;
+ final TextStyle? textStyle;
+ final TextAlign? textAlign;
+
+ @override
+ Widget build(BuildContext context) {
+ final TextStyle defaultTextStyle = textStyle ?? const TextStyle();
+ return Semantics(
+ value: text.replaceAll(r'**', '').replaceAll('\n', ' '),
+ excludeSemantics: true,
+ child: RichText(
+ text: TextSpan(
+ style: DefaultTextStyle.of(context).style,
+ children: TextHelper.getPartsBetweenSymbol(
+ text: text,
+ symbol: r'\*\*',
+ symbolLength: 2,
+ defaultStyle: defaultTextStyle,
+ highlightedStyle:
+ const TextStyle(fontWeight: FontWeight.bold))
+ .map(
+ ((String, TextStyle?) part) {
+ return TextSpan(
+ text: part.$1,
+ style: defaultTextStyle.merge(part.$2),
+ semanticsLabel: '-',
+ );
+ },
+ ).toList(growable: false),
+ ),
+ textAlign: textAlign ?? TextAlign.start,
+ ),
+ );
+ }
+}
diff --git a/packages/smooth_app/lib/helpers/ui_helpers.dart b/packages/smooth_app/lib/helpers/ui_helpers.dart
index 0f392b67d36..ca03682d7fb 100644
--- a/packages/smooth_app/lib/helpers/ui_helpers.dart
+++ b/packages/smooth_app/lib/helpers/ui_helpers.dart
@@ -16,7 +16,7 @@ class IconWidgetSizer {
static const double _ICON_WIDGET_SIZE_RATIO = 1 / 10;
static double getIconSizeFromContext(BuildContext context) {
- final Size screenSize = MediaQuery.of(context).size;
+ final Size screenSize = MediaQuery.sizeOf(context);
return screenSize.width * _ICON_WIDGET_SIZE_RATIO;
}
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_action_card.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_action_card.dart
index 55fcc1888ad..61c09bbaaad 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_action_card.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_action_card.dart
@@ -31,7 +31,7 @@ class KnowledgePanelActionCard extends StatelessWidget {
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
- SmoothHtmlWidget(element.html),
+ if (element.html != null) SmoothHtmlWidget(element.html!),
const SizedBox(height: SMALL_SPACE),
...actionWidgets,
],
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart
index 0ac2b7f6603..6c9ef63db4f 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_group_card.dart
@@ -28,10 +28,13 @@ class KnowledgePanelGroupCard extends StatelessWidget {
if (groupElement.title != null && groupElement.title!.isNotEmpty)
Padding(
padding: const EdgeInsetsDirectional.only(top: LARGE_SPACE),
- child: Text(
- groupElement.title!,
- style:
- themeData.textTheme.titleSmall!.apply(color: Colors.grey),
+ child: Semantics(
+ explicitChildNodes: true,
+ child: Text(
+ groupElement.title!,
+ style:
+ themeData.textTheme.titleSmall!.apply(color: Colors.grey),
+ ),
),
),
for (final String panelId in groupElement.panelIds)
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_image_card.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_image_card.dart
index b44ee88d481..263f8135df3 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_image_card.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_image_card.dart
@@ -1,6 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
+import 'package:smooth_app/helpers/launch_url_helper.dart';
/// Card that displays a Knowledge Panel _Image_ element.
class KnowledgePanelImageCard extends StatelessWidget {
@@ -12,11 +13,21 @@ class KnowledgePanelImageCard extends StatelessWidget {
// TODO(g123k): It would be nice to provide a Placeholder
@override
- Widget build(BuildContext context) => Image.network(
- imageElement.url,
- width: imageElement.width?.toDouble(),
- height: imageElement.height?.toDouble(),
- );
+ Widget build(BuildContext context) {
+ final Widget image = Image.network(
+ imageElement.url,
+ width: imageElement.width?.toDouble(),
+ height: imageElement.height?.toDouble(),
+ );
+ final String? linkUrl = imageElement.linkUrl;
+ if (linkUrl == null) {
+ return image;
+ }
+ return InkWell(
+ onTap: () => LaunchUrlHelper.launchURL(linkUrl),
+ child: image,
+ );
+ }
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_page.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_page.dart
index 3d0ead01919..93eb004619a 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_page.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_page.dart
@@ -1,5 +1,6 @@
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
import 'package:matomo_tracker/matomo_tracker.dart';
import 'package:openfoodfacts/openfoodfacts.dart';
import 'package:provider/provider.dart';
@@ -9,8 +10,8 @@ import 'package:smooth_app/generic_lib/design_constants.dart';
import 'package:smooth_app/generic_lib/widgets/smooth_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels/knowledge_panel_expanded_card.dart';
import 'package:smooth_app/knowledge_panel/knowledge_panels_builder.dart';
-import 'package:smooth_app/pages/carousel_manager.dart';
import 'package:smooth_app/pages/product/common/product_refresher.dart';
+import 'package:smooth_app/pages/scan/carousel/scan_carousel_manager.dart';
import 'package:smooth_app/widgets/smooth_app_bar.dart';
import 'package:smooth_app/widgets/smooth_scaffold.dart';
@@ -50,13 +51,19 @@ class _KnowledgePanelPageState extends State
@override
Widget build(BuildContext context) {
+ final AppLocalizations appLocalizations = AppLocalizations.of(context);
+ final String title = _getTitle();
+
context.watch();
refreshUpToDate();
return SmoothScaffold(
appBar: SmoothAppBar(
- title: Text(
- _getTitle(),
- maxLines: 2,
+ title: Semantics(
+ label: _getTitleForAccessibility(appLocalizations, title),
+ child: Text(
+ title,
+ maxLines: 2,
+ ),
),
),
body: RefreshIndicator(
@@ -96,7 +103,7 @@ class _KnowledgePanelPageState extends State
Future _refreshProduct(BuildContext context) async {
try {
final String? barcode =
- ExternalCarouselManager.read(context).currentBarcode;
+ ExternalScanCarouselManager.read(context).currentBarcode;
if (barcode?.isEmpty == true) {
return;
}
@@ -126,6 +133,24 @@ class _KnowledgePanelPageState extends State
return '';
}
+ String _getTitleForAccessibility(
+ AppLocalizations appLocalizations,
+ String title,
+ ) {
+ final String productName = upToDateProduct.productName ??
+ upToDateProduct.abbreviatedName ??
+ upToDateProduct.genericName ??
+ '';
+ if (title.isEmpty) {
+ return appLocalizations.knowledge_panel_page_title_no_title(productName);
+ } else {
+ return appLocalizations.knowledge_panel_page_title(
+ title,
+ productName,
+ );
+ }
+ }
+
@override
void debugFillProperties(DiagnosticPropertiesBuilder properties) {
super.debugFillProperties(properties);
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_text_card.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_text_card.dart
index 1d390fdd824..fb09b1747d5 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_text_card.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_text_card.dart
@@ -18,9 +18,11 @@ class KnowledgePanelTextCard extends StatelessWidget {
@override
Widget build(BuildContext context) {
- final Widget text = SmoothHtmlWidget(
- textElement.html,
- textStyle: WellSpacedTextHelper.TEXT_STYLE_WITH_WELL_SPACED,
+ final Widget text = MergeSemantics(
+ child: SmoothHtmlWidget(
+ textElement.html,
+ textStyle: WellSpacedTextHelper.TEXT_STYLE_WITH_WELL_SPACED,
+ ),
);
if (!_hasSource) {
diff --git a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_title_card.dart b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_title_card.dart
index ae51b6fc00a..743683927e9 100644
--- a/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_title_card.dart
+++ b/packages/smooth_app/lib/knowledge_panel/knowledge_panels/knowledge_panel_title_card.dart
@@ -79,6 +79,7 @@ class KnowledgePanelTitleCard extends StatelessWidget {
child: Semantics(
value: _generateSemanticsValue(context),
button: isClickable,
+ container: true,
excludeSemantics: true,
child: Row(
children: [
diff --git a/packages/smooth_app/lib/l10n/app_aa.arb b/packages/smooth_app/lib/l10n/app_aa.arb
index 9fe05c9c847..4c629c401ac 100644
--- a/packages/smooth_app/lib/l10n/app_aa.arb
+++ b/packages/smooth_app/lib/l10n/app_aa.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_af.arb b/packages/smooth_app/lib/l10n/app_af.arb
index f256ceffbe9..21d0f14f6cb 100644
--- a/packages/smooth_app/lib/l10n/app_af.arb
+++ b/packages/smooth_app/lib/l10n/app_af.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Neem 'n foto",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ak.arb b/packages/smooth_app/lib/l10n/app_ak.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ak.arb
+++ b/packages/smooth_app/lib/l10n/app_ak.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_am.arb b/packages/smooth_app/lib/l10n/app_am.arb
index d4a5c9e0f71..416ed2c77ed 100644
--- a/packages/smooth_app/lib/l10n/app_am.arb
+++ b/packages/smooth_app/lib/l10n/app_am.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ar.arb b/packages/smooth_app/lib/l10n/app_ar.arb
index 97af742a1f5..1f9dcc97150 100644
--- a/packages/smooth_app/lib/l10n/app_ar.arb
+++ b/packages/smooth_app/lib/l10n/app_ar.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "صورة المكونات",
"nutritional_facts_photo_title": "صورة الحقائق الغذائية",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "التقاط صورة",
"take_more_photo_title": "التقط المزيد من الصور",
"front_photo_uploaded": "تم تحميل الصورة الأمامية",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "لم يتم العثور على أي منتج",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "لم يتم العثور على نتائج:",
- "searchPanelHeader": "ابحث عن أول منتج لك، أو اعمل مسح ضوئي للكود. ",
- "@Product query status": {},
"refreshing_product": "تحديث المنتج",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "يتعذر جلب معلمومات حول هذا المنتج بسبب خطأ في الشبكة.",
"cached_results_from": "إظهار النتائج من:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "الفئات",
- "edit_ingredients_extrait_ingredients_btn_text": "استخراج المكونات",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "تحديث الصورة",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "تحديث الصورة",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "تم",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "معطيات",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "النتيجة البيئية",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "مشاركة",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_as.arb b/packages/smooth_app/lib/l10n/app_as.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_as.arb
+++ b/packages/smooth_app/lib/l10n/app_as.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_az.arb b/packages/smooth_app/lib/l10n/app_az.arb
index 5012cb64689..7b7b86c1735 100644
--- a/packages/smooth_app/lib/l10n/app_az.arb
+++ b/packages/smooth_app/lib/l10n/app_az.arb
@@ -31,8 +31,8 @@
"go_back_to_top": "Yuxarıya qayıt",
"save": "Save",
"save_confirmation": "Yadda saxlamaq istədiyinizə əminsiniz?",
- "skip": "Skip",
- "cancel": "Cancel",
+ "skip": "Ötür",
+ "cancel": "İmtina",
"@cancel": {},
"ignore": "Rədd et",
"@ignore": {
@@ -151,7 +151,7 @@
"incorrect_credentials": "Incorrect username or password.",
"password_lost_incorrect_credentials": "This email or username doesn't exist. Please check your credentials.",
"password_lost_server_unavailable": "We are currently experiencing slowdowns on our servers and we apologise for it. Please try again later.",
- "login": "Login",
+ "login": "Daxil ol",
"@login": {
"description": "Text field hint: unified name for either username or e-mail address"
},
@@ -505,7 +505,7 @@
"@unknownBrand": {},
"unknownProductName": "Unknown product name",
"@unknownProductName": {},
- "label_refresh": "Refresh",
+ "label_refresh": "Yenilə",
"@label_refresh": {
"description": "Refresh the cached product"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1209,7 +1288,7 @@
"permission_photo_denied_dialog_settings_title": "Permission denied",
"permission_photo_denied_dialog_settings_message": "As you've previously denied the camera permission, you must allow it manually from the Settings.",
"permission_photo_denied_dialog_settings_button_open": "Open settings",
- "permission_photo_denied_dialog_settings_button_cancel": "Cancel",
+ "permission_photo_denied_dialog_settings_button_cancel": "İmtina",
"permission_photo_none_found": "No camera detected",
"@permission_photo_none_found": {
"description": "Message for the user when no camera was detected, replacing the barcode scanner"
@@ -1339,15 +1418,15 @@
"@edit_product_form_item_emb_codes_examples": {
"description": "Product edition - EMB Codes - explanations"
},
- "edit_product_form_item_categories_title": "Categories",
+ "edit_product_form_item_categories_title": "Kateqoriyalar",
"@edit_product_form_item_categories_title": {
"description": "Product edition - Categories - Title"
},
- "edit_product_form_item_categories_hint": "category",
+ "edit_product_form_item_categories_hint": "kateqoriya",
"@edit_product_form_item_categories_hint": {
"description": "Product edition - Categories - input textfield hint"
},
- "edit_product_form_item_categories_type": "category",
+ "edit_product_form_item_categories_type": "kateqoriya",
"@edit_product_form_item_categories_type": {
"description": "Product edition - Categories - input textfield type"
},
@@ -1385,7 +1464,7 @@
"@edit_product_form_item_nutrition_facts_subtitle": {
"description": "Product edition - Nutrition facts - SubTitle"
},
- "edit_product_form_save": "Edit",
+ "edit_product_form_save": "Düzəliş etmək",
"@edit_product_form_save": {
"description": "Product edition - Nutrition facts - Save button"
},
@@ -1399,19 +1478,35 @@
},
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
- "category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "category_picker_page_appbar_text": "Kateqoriyalar",
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1598,7 +1693,7 @@
"@dev_preferences_button_positive": {
"description": "User dev preferences - Positive button label"
},
- "dev_preferences_button_negative": "Cancel",
+ "dev_preferences_button_negative": "İmtina",
"@dev_preferences_button_negative": {
"description": "User dev preferences - Negative button label"
},
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1736,7 +1977,7 @@
"@summary_card_button_add_basic_details": {
"description": "Summary card - Button to add details about the product"
},
- "edit_photo_button_label": "Edit",
+ "edit_photo_button_label": "Düzəliş etmək",
"@edit_photo_button_label": {
"description": "Edit photo button label"
},
@@ -1768,7 +2009,7 @@
"@edit_photo_language_none": {
"description": "Warning message: for this product and this field, there are no images at all, in any language"
},
- "category_picker_screen_title": "Categories",
+ "category_picker_screen_title": "Kateqoriyalar",
"@category_picker_screen_title": {
"description": "Categories picker screen title"
},
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Paylaş",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_be.arb b/packages/smooth_app/lib/l10n/app_be.arb
index 9ae4493d784..f573d468abb 100644
--- a/packages/smooth_app/lib/l10n/app_be.arb
+++ b/packages/smooth_app/lib/l10n/app_be.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Фота прадукту спераду",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Пацвердзіце запампоўку фота прадукту спераду",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Фота інгрэдыентаў",
"nutritional_facts_photo_title": "Фота звестак аб пажыўнасці",
"recycling_photo_title": "Фота звестак аб перапрацоўцы",
+ "take_photo_title": "Сфатаграфаваць",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Фота спераду запампавана",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Прадукт не знойдзены",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "не знойдзена:",
- "searchPanelHeader": "Шукайце або скануйце свой першы прадукт",
- "@Product query status": {},
"refreshing_product": "Абнаўленне прадукту",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Немагчыма атрымаць інфармацыю аб гэтым прадукце з-за памылкі сеткі.",
"cached_results_from": "Паказаць вынікі за:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "У 2012 годзе\nмы вынайшлі праграму\nдля сумеснага сканавання",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Паколькі нам «стукнула»10 гадоў,\nмы вынаходзім яе\nз нуля!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Працягнуць",
"onboarding_welcome_loading_dialog_title": "Загружаецца ваш першы прыклад прадукту",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Вібрацыя і тактыльны водгук",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Запоўніце асноўныя звесткі",
"not_implemented_snackbar_text": "Яшчэ не рэалізавана",
"category_picker_page_appbar_text": "Катэгорыі",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Абнавіць фота",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Распазнаць упакоўку",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Абнавіць фота",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Даныя",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Выключыць Eco-ацэнку",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Усе недаапрацаваныя прадукты",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_bg.arb b/packages/smooth_app/lib/l10n/app_bg.arb
index 04486e8eee8..4f79aa0a9fa 100644
--- a/packages/smooth_app/lib/l10n/app_bg.arb
+++ b/packages/smooth_app/lib/l10n/app_bg.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Снимка на продукта отпред",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Потвърди качването на снимката на предната страна на продукта",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Снимка на съставките",
"nutritional_facts_photo_title": "Снимка на хранителните стойности",
"recycling_photo_title": "Снимка на указанията за рециклиране",
+ "take_photo_title": "Направи снимка",
"take_more_photo_title": "Направи още снимки",
"front_photo_uploaded": "Снимката на предната страна е качена",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Няма намерен продукт",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "не е намерено:",
- "searchPanelHeader": "Потърси или сканирай първия си продукт",
- "@Product query status": {},
"refreshing_product": "Актуализация на продукта",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Харесваш ли приложението?",
"tagline_app_review_button_positive": "Обичам го! 😍",
"tagline_app_review_button_negative": "Не особено…",
"tagline_app_review_button_later": "Попитай по-късно",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Не харесваш приложението?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Невъзможно е да се извлече информация за този продукт поради грешка в мрежата.",
"cached_results_from": "Кеширани резултати от:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Моля, избери страна:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Измислихме приложението\nза съвместно сканиране \nпрез 2012 г.",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "10 години по-късно\nго преоткриваме\nот самото начало!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Продължи",
"onboarding_welcome_loading_dialog_title": "Зареждане на първия ти примерен продукт",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Вибрация и усещане",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Попълни основните подробности",
"not_implemented_snackbar_text": "Все още не е внедрено",
"category_picker_page_appbar_text": "Категории",
- "edit_ingredients_extrait_ingredients_btn_text": "Извлечи съставките",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Обнови снимката",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Извличане на опаковката",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Обнови снимката",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Продъктът не е открит",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Готово",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Данни",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Изключи Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Всички продукти, които трябва да бъдат завършени",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Стартиране на опресняването на всички продукти, съхранявани локално",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Избери език:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Инсталирай Open Beauty Facts, за да създадеш козметична база данни",
"faq_title_install_pet": "Инсталирай Open Pet Food Facts, за да създадеш база данни с храни за домашни любимци",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Сподели",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "bg",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_bm.arb b/packages/smooth_app/lib/l10n/app_bm.arb
index 54e0b04ca38..034656adb48 100644
--- a/packages/smooth_app/lib/l10n/app_bm.arb
+++ b/packages/smooth_app/lib/l10n/app_bm.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Suguyaw",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_bn.arb b/packages/smooth_app/lib/l10n/app_bn.arb
index bda95f8abf3..df9e896913f 100644
--- a/packages/smooth_app/lib/l10n/app_bn.arb
+++ b/packages/smooth_app/lib/l10n/app_bn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "একটি ছবি নিন",
"take_more_photo_title": "আরও কিছু ছবি তুলুন",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "শ্রেণীসমূহ",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "তথ্য",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "শেয়ার",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_bo.arb b/packages/smooth_app/lib/l10n/app_bo.arb
index 0582593abcc..d880cf68188 100644
--- a/packages/smooth_app/lib/l10n/app_bo.arb
+++ b/packages/smooth_app/lib/l10n/app_bo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_br.arb b/packages/smooth_app/lib/l10n/app_br.arb
index 1bbaff47003..a47c5ccddb6 100644
--- a/packages/smooth_app/lib/l10n/app_br.arb
+++ b/packages/smooth_app/lib/l10n/app_br.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Tapout ur skeudenn",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Rummadoù",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Graet",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Roadennoù",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Rannañ",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_bs.arb b/packages/smooth_app/lib/l10n/app_bs.arb
index b4ce0945a6a..9f80e3cf392 100644
--- a/packages/smooth_app/lib/l10n/app_bs.arb
+++ b/packages/smooth_app/lib/l10n/app_bs.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorije",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ca.arb b/packages/smooth_app/lib/l10n/app_ca.arb
index fa7744bd05a..cd0811b7bed 100644
--- a/packages/smooth_app/lib/l10n/app_ca.arb
+++ b/packages/smooth_app/lib/l10n/app_ca.arb
@@ -145,9 +145,9 @@
"@ecoCardUtility": {
"description": "Description of what a user can use the Eco data in a product for."
},
- "server_error_open_new_issue": "No server response! You may open an issue with the following link.",
+ "server_error_open_new_issue": "No hi ha resposta del servidor! Podeu obrir una incidència amb el següent enllaç.",
"@user_management": {},
- "sign_in_text": "Sign in to your Open Food Facts account to save your contributions",
+ "sign_in_text": "Inicieu la sessió al vostre compte d'Open Food Facts per desar les vostres contribucions",
"incorrect_credentials": "Usuari o contrasenya incorrectes.",
"password_lost_incorrect_credentials": "This email or username doesn't exist. Please check your credentials.",
"password_lost_server_unavailable": "We are currently experiencing slowdowns on our servers and we apologise for it. Please try again later.",
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto frontal del producte",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirma la càrrega de la foto frontal del producte",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto dels ingredients",
"nutritional_facts_photo_title": "Foto dels valors nutricionals",
"recycling_photo_title": "Foto del reciclatge",
+ "take_photo_title": "Fer una foto",
"take_more_photo_title": "Feu més fotos",
"front_photo_uploaded": "S'ha penjat la foto frontal",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Cap producte trobat",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "no trobat:",
- "searchPanelHeader": "Cerqueu o escanegeu el primer producte",
- "@Product query status": {},
"refreshing_product": "Producte refrescant",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Us agrada l'aplicació?",
"tagline_app_review_button_positive": "M'encanta! 😍",
"tagline_app_review_button_negative": "No gaire…",
"tagline_app_review_button_later": "Pregunta-m'ho després",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "No us agrada, la nostra aplicació?",
"app_review_negative_modal_text": "Podríeu emprar uns minuts per a dir-nos el per què?",
"app_review_negative_modal_positive_button": "I tant!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "No es pot obtenir informació sobre aquest producte a causa d'un error de xarxa.",
"cached_results_from": "Mostra resultats de:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -818,7 +895,7 @@
"@native_app_settings": {
"description": "Native App Settings in app settings"
},
- "native_app_description": "Open systems settings for Open Food Facts",
+ "native_app_description": "Obre la configuració del sistema per a Open Food Facts",
"@native_app_description": {
"description": "Native App description in app settings"
},
@@ -837,7 +914,7 @@
"@Lists": {},
"no_prodcut_in_list": "No hi ha cap producte en aquesta llista",
"no_product_in_section": "No hi ha cap producte en aquesta secció",
- "recently_seen_products": "All viewed products",
+ "recently_seen_products": "Tots els productes vistos",
"clear": "Esborra",
"@clear": {
"description": "Clears a product list (short label)"
@@ -911,12 +988,12 @@
},
"retry_button_label": "Torna a provar",
"connect_with_us": "Connecta amb nosaltres",
- "instagram": "Follow us on Instagram",
+ "instagram": "Segueix-nos a Instagram",
"instagram_link": "https://instagram.com/open.food.facts",
- "twitter": "Follow us on X (formerly Twitter)",
+ "twitter": "Segueix-nos a X (abans Twitter)",
"twitter_link": "https://www.twitter.com/openfoodfacts",
"blog": "Bloc",
- "faq": "FAQ",
+ "faq": "PMF",
"discover": "Descobrir",
"how_to_contribute": "Com contribuir",
"hint_knowledge_panel_message": "Podeu fer clic a qualsevol part de la targeta per obtenir més detalls del que veieu. Proveu-ho ara!",
@@ -927,7 +1004,7 @@
"@consent_analytics_title": {
"description": "Title for the consent analytics UI Page"
},
- "consent_analytics_body1": "Help the Open Food Facts volunteers to improve the app. You decide whether to submit anonymous analytics.",
+ "consent_analytics_body1": "Ajudeu als voluntaris d'Open Food Facts a millorar l'aplicació. Decidiu si voleu enviar analítiques anònimes.",
"@conset_analytics_body1": {
"description": "first paragraph for the consent analytics UI Page"
},
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Vam inventar\nl'aplicació col·laborativa\nd'escaneig l'any 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Ja que en fem 10,\nl'estem reinventant\ndes de zero!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continuar",
"onboarding_welcome_loading_dialog_title": "S'està carregant el vostre primer exemple de producte",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibració i hàptica",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Detalls bàsics complets",
"not_implemented_snackbar_text": "Encara no s'ha implementat",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extreu els ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Actualitza la foto",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extreure l'embalatge",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Actualitza la foto",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Afegir un preu",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "No s'ha trobat el producte",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Preu",
+ "prices_amount_price_discounted": "Preu rebaixat",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Data",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Prova",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Fet",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dades",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclou l'Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Tots els productes per completar",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Començant l'actualització de tots els productes emmagatzemats localment",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
- "nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_new_formula": "Nutri-Score {letter} (nou càlcul)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (nou càlcul)",
+ "nutriscore_unknown": "Nutri-Score desconegut",
+ "nutriscore_unknown_new_formula": "Nutri-score desconegut (nou càlcul)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Aquest enllaç no es pot obrir al vostre dispositiu. Si us plau, comproveu que teniu un navegador instal·lat.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Detalls per a {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Detalls per a {pageName} amb {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Comparteix",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ce.arb b/packages/smooth_app/lib/l10n/app_ce.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ce.arb
+++ b/packages/smooth_app/lib/l10n/app_ce.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_co.arb b/packages/smooth_app/lib/l10n/app_co.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_co.arb
+++ b/packages/smooth_app/lib/l10n/app_co.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_cs.arb b/packages/smooth_app/lib/l10n/app_cs.arb
index 251c07638b0..aac58d30cc8 100644
--- a/packages/smooth_app/lib/l10n/app_cs.arb
+++ b/packages/smooth_app/lib/l10n/app_cs.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Ilustrace s neznámým Nutri-Score a Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Přední fotka produktu",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Potvrdit nahrání přední fotky produktu",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Fotografie ingrediencí",
"nutritional_facts_photo_title": "Fotografie nutričních údajů",
"recycling_photo_title": "Fotografie recyklace",
+ "take_photo_title": "Vyfotit",
"take_more_photo_title": "Vyfotit další obrázky",
"front_photo_uploaded": "Přední fotka nahrána",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nebyl nalezen žádný produkt",
"@no_product_found": {},
+ "no_location_found": "Nenalezena žádná poloha",
"not_found": "nenalezeno:",
- "searchPanelHeader": "Vyhledejte nebo naskenujte svůj první produkt",
- "@Product query status": {},
"refreshing_product": "Obnovování produktu",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Vyhledat produkt",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Líbí se vám aplikace?",
"tagline_app_review_button_positive": "Miluji to! 😍",
"tagline_app_review_button_negative": "Ani ne...",
"tagline_app_review_button_later": "Zeptejte se mě později",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Nelíbí se vám naše aplikace?",
"app_review_negative_modal_text": "Mohl byste nám dát pár sekund a říct nám proč?",
"app_review_negative_modal_positive_button": "Ano, samozřejmě!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Vyskytla se chyba!",
+ "product_internet_error_modal_message": "Nemůžeme načíst informace o tomto produktu kvůli chybě sítě. Zkontrolujte prosím připojení k internetu a zkuste to znovu.\n\nVnitřní chyba:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Nelze načíst informace o tomto produktu kvůli chybě sítě.",
"cached_results_from": "Zobrazit výsledky z:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Prosím zvolte měnu",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Právě jste změnili zemi.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Chcete změnit měnu z {previousCurrency} na {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Vyberte prosím zemi:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "V roce 2012 jsme vynalezli\nkooperativní\naplikaci pro skenování",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Jelikož je nám 10 let, vymýšlíme ji od základu znovu!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Pokračovat",
"onboarding_welcome_loading_dialog_title": "Načítám váš první příklad produktu",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibrace a haptika",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Vyplňte základní údaje",
"not_implemented_snackbar_text": "Zatím neimplementováno",
"category_picker_page_appbar_text": "Kategorie",
- "edit_ingredients_extrait_ingredients_btn_text": "Aut. rozpoznat složení",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Obnovit fotku",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extrakt balení",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Obnovit fotku",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Zástupce pro aplikaci Ceny na produktové stránce",
"prices_app_button": "Přejít do aplikace Ceny",
+ "prices_generic_title": "Ceny",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Přidat cenu",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produkt nebyl nalezen",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Hledat produkt",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "Zobrazit ceny",
+ "prices_list_length_one_page": "{count,plural, =0{Zatím žádná cena} =1{Pouze 1 cena} few{Všechny {count} ceny} other{Všech {count} cen}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Posledních {pageSize} cen (celkem: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Množství",
+ "prices_amount_is_discounted": "Je zlevněné?",
+ "prices_amount_price_normal": "Cena",
+ "prices_amount_price_discounted": "Snížená cena",
+ "prices_amount_price_not_discounted": "Původní cena",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Nesprávná hodnota",
+ "prices_amount_price_mandatory": "Povinná hodnota",
+ "prices_currency_subtitle": "Měna",
+ "prices_date_subtitle": "Datum",
+ "prices_location_subtitle": "Obchod",
+ "prices_location_find": "Najít obchod",
+ "prices_location_mandatory": "Musíte vybrat obchod!",
+ "prices_proof_subtitle": "Důkaz",
+ "prices_proof_find": "Vybrat důkaz",
+ "prices_proof_receipt": "Účtenka",
+ "prices_proof_price_tag": "Cenovka",
+ "prices_proof_mandatory": "Musíte vybrat důkaz!",
+ "prices_add_validation_error": "Chyba ověření",
+ "prices_privacy_warning_title": "Upozornění na soukromí",
+ "prices_privacy_warning_message": "Ceny budou veřejné, spolu s obchodem, na který odkazují.\nTo by mohlo umožnit lidem, kteří znají váš pseudonym Open Food Facts:\n* odvodit, ve které oblasti žijete\n* vědět, co kupujete\nPokud s tím jste znepokojeni, změňte si prosím svůj pseudonym nebo si vytvořte nový účet Open Food Facts a přihlaste se pomocí něj do aplikace.",
+ "prices_unknown_product": "Neznámý produkt",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Hotovo",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Údaje",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Vyloučit Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Znovu použijte a upravte toto vyhledávání",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Moje ceny",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Moje důkazy",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Přidány nejnovější ceny",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Nejlepší přispěvatelé cen",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Obchody s nejvíce cenami",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Produkty s nejvíce cenami",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Všechny produkty k dokončení",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "Cena bude zaslána na server co nejdříve.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Spouštění aktualizace všech lokálně uložených produktů",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Vyberte svou měnu:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Vyberte svůj jazyk:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Nový výpočet)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (Nový výpočet)",
"nutriscore_unknown": "Neznámé Nutri-Score",
+ "nutriscore_unknown_new_formula": "Neznámé Nutri-Score (Nový výpočet)",
"nutriscore_not_applicable": "Nutri-Score nelze použít",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score nelze použít (Nový výpočet)",
"ecoscore_generic": "Eco-score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Nainstalujte Open Beauty Facts a vytvořte kosmetickou databázi",
"faq_title_install_pet": "Nainstalujte si Open Pet Food Facts a vytvořte databázi krmiv pro domácí zvířata",
"faq_title_install_product": "Nainstalujte Open Products Facts pro vytvoření databáze produktů pro prodloužení životnosti objektů",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Importujte své produkty do Open Food Facts",
"contact_title_pro_email": "Kontakt výrobce",
"contact_title_press_page": "Pro média",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Tento odkaz nelze na vašem zařízení otevřít. Zkontrolujte, zda máte nainstalovaný prohlížeč.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Podrobnosti o {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Podrobnosti o {pageName} s {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Průvodce",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Sdílet",
+ "guide_nutriscore_v2_enabled": "pravda",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Nutri-Score se vyvíjí: vysvětlení!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Co je Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Nutri-Score je logo, jehož cílem je informovat vás o **nutriční kvalitě potravin**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Barevný kód se liší od tmavě zelené (**A**) pro **nejzdravější** produkty až po tmavě červenou (**E**) pro **méně zdravé**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Logo Nutri-Score A",
+ "guide_nutriscore_v2_why_v2_title": "Proč se Nutri-Score vyvíjí?",
+ "guide_nutriscore_v2_why_v2_intro": "Vzorec pro Nutri-Score **se vyvíjí** k poskytování lepších doporučení:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Lepší hodnocení všech nápojů",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Srovnávací poznámky **mléka**, **mléčných nápojů** s přidaným cukrem a **zeleninových** nápojů byly v novém algoritmu lépe rozlišeny.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Lepší hodnocení nápojů",
+ "guide_nutriscore_v2_why_v2_arg2_text": "**Obsah cukru** je lépe zohledněn a upřednostňuje **nízce slazené** nápoje.\\n**Sladidla budou rovněž penalizována**: dietní limonády budou sníženy z hodnocení B na hodnotu mezi C a E. Doporučeným nápojem zůstává voda.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Sůl a cukr penalizovány",
+ "guide_nutriscore_v2_why_v2_arg3_text": "**Příliš sladké** nebo **příliš slané** produkty budou mít své **hodnocení dále sníženo**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchie v olejích a rybách",
+ "guide_nutriscore_v2_why_v2_arg4_text": "Hodnocení určitých **tučných ryb** a **olejů bohatých na dobré tuky** se zlepší.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Omezené červené maso",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Konzumace **červeného masa by měla být omezena**. To je důvod, proč **drůbež bude mít poměrně lepší hodnocení**.",
+ "guide_nutriscore_v2_new_logo_title": "Jak odlišit staré Nutri-Score a nový výpočet?",
+ "guide_nutriscore_v2_new_logo_text": "Od této chvíle může logo zobrazovat zmínku „**Nový výpočet**“, aby bylo jasné, že se skutečně jedná o nový výpočet.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Logo nového Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Kde najít nový výpočet Nutri-Score?",
+ "guide_nutriscore_v2_where_paragraph1": "Nutri-Score se používá v několika zemích: Německo, Belgie, Španělsko, Francie, Lucembursko, Nizozemsko a Švýcarsko.",
+ "guide_nutriscore_v2_where_paragraph2": "Výrobci mají nejpozději do **2026** čas **nahradit** starý výpočet novým.",
+ "guide_nutriscore_v2_where_paragraph3": "Bez čekání **už najdete v aplikaci OpenFoodFacts** nový výpočet, včetně případů, kdy výrobci neaktualizovali skóre.",
+ "guide_nutriscore_v2_unchanged_title": "Co se nemění",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Nutri-Score je skóre navržené k **měření nutriční kvality**. Je **doplňkem skupiny NOVA** pro **ultra zpracované potraviny** (taktéž přítomných v aplikaci).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Pro výrobce zůstává zobrazení Nutri-Score **nepovinné**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_cv.arb b/packages/smooth_app/lib/l10n/app_cv.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_cv.arb
+++ b/packages/smooth_app/lib/l10n/app_cv.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_cy.arb b/packages/smooth_app/lib/l10n/app_cy.arb
index dc7cf09ccd7..1c3b2975c95 100644
--- a/packages/smooth_app/lib/l10n/app_cy.arb
+++ b/packages/smooth_app/lib/l10n/app_cy.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Tynnu llun",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categorïau",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_da.arb b/packages/smooth_app/lib/l10n/app_da.arb
index c56ef451518..90bc68b80ec 100644
--- a/packages/smooth_app/lib/l10n/app_da.arb
+++ b/packages/smooth_app/lib/l10n/app_da.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Produktforsidefoto",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Bekræft upload af produktforsidefoto",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingrediensfoto",
"nutritional_facts_photo_title": "Næringsfaktafoto",
"recycling_photo_title": "Genbrugsfoto",
+ "take_photo_title": "Tag et billede",
"take_more_photo_title": "Tag flere billeder",
"front_photo_uploaded": "Forsidefoto uploadet",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Intet produkt fundet",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "ikke fundet:",
- "searchPanelHeader": "Søg eller skan dit første produkt",
- "@Product query status": {},
"refreshing_product": "Opfrisker produkt",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Kan du lide appen?",
"tagline_app_review_button_positive": "Jeg elsker det! 😍",
"tagline_app_review_button_negative": "Ikke rigtigt…",
"tagline_app_review_button_later": "Spørg mig senere",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Kan du ikke lide vores app?",
"app_review_negative_modal_text": "Vil du bruge et par sekunder på at fortælle os hvorfor?",
"app_review_negative_modal_positive_button": "Ja, selvfølgelig!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Ikke muligt at hente disse produktoplysninger grundet netværksfejl.",
"cached_results_from": "Vis resultater fra:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Vi opfandt\nden kollaborative\nskannings-app i 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Da vi fylder 10 år,\nvi genopfinder den\nfra bunden!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Velkommen!",
+ "onboarding_home_welcome_text2": "Appen, der hjælper dig med at vælge mad, der er godt for **dig** og **planeten**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Fortsæt",
"onboarding_welcome_loading_dialog_title": "Indlæser første eksempelprodukt",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration og haptik",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Udfyld basisoplysninger",
"not_implemented_snackbar_text": "Endnu ikke implementeret",
"category_picker_page_appbar_text": "Kategorier",
- "edit_ingredients_extrait_ingredients_btn_text": "Udtræk ingredienser",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Opfrisk foto",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Udtræk emballage",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Opfrisk foto",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produktet blev ikke fundet",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Stregkodelæser",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Prisskilt",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Færdiggjort",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Undtag Øko-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Genbrug og redigér denne søgning",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Alle produkter til færdiggørelse",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starter opdateringen af alle de lokalt lagrede produkter",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Øko-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "Ny beregning af Nutri-Score: hvad er nyt?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Del",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_de.arb b/packages/smooth_app/lib/l10n/app_de.arb
index bb48c1111e3..9af6a20011c 100644
--- a/packages/smooth_app/lib/l10n/app_de.arb
+++ b/packages/smooth_app/lib/l10n/app_de.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Eine Abbildung mit unbekanntem Nutri-Score und Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto von der Vorderseite des Produkts",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Hochladen des Fotos der Vorderseite des Produkts bestätigen",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto der Zutatenliste",
"nutritional_facts_photo_title": "Foto der Nährwertangaben",
"recycling_photo_title": "Foto der Recycling-Informationen",
+ "take_photo_title": "Foto aufnehmen",
"take_more_photo_title": "Weitere Fotos aufnehmen",
"front_photo_uploaded": "Foto der Vorderseite der Verpackung hochgeladen",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Keine Produkte gefunden",
"@no_product_found": {},
+ "no_location_found": "Kein Standort gefunden",
"not_found": "Nicht gefunden:",
- "searchPanelHeader": "Suchen oder scannen Sie Ihr erstes Produkt",
- "@Product query status": {},
"refreshing_product": "Produkt wird aktualisiert",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Foto aufgenommen am {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Foto aufgenommen am {date}. Dieses Foto kann veraltet sein",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Willkommen bei Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scannen** eines Barcodes oder\n**Suchen** nach einem Produkt",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Produkt suchen",
+ "homepage_main_card_search_field_tooltip": "Suche starten",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Neueste Nachrichten: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Gefällt Ihnen die App?",
"tagline_app_review_button_positive": "Ich liebe sie! 😍",
"tagline_app_review_button_negative": "Nicht wirklich …",
"tagline_app_review_button_later": "Später erneut fragen",
+ "tagline_feed_news_button": "Mehr erfahren",
"app_review_negative_modal_title": "Gefällt Ihnen diese App?",
"app_review_negative_modal_text": "Könnten Sie sich ein paar Sekunden Zeit nehmen und uns sagen, warum?",
"app_review_negative_modal_positive_button": "Ja, natürlich!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Ein Fehler ist aufgetreten!",
+ "product_internet_error_modal_message": "Aufgrund eines Netzwerkfehlers konnten keine Informationen zu diesem Produkt abgerufen werden. Bitte überprüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.\n\nInterner Fehler:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Informationen über dieses Produkt können aufgrund eines Netzwerkfehlers nicht abgerufen werden.",
"cached_results_from": "Ergebnisse anzeigen von:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Bitte wählen Sie eine Währung",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Sie haben gerade das Land gewechselt.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Möchten Sie die Währung von {previousCurrency} in {possibleCurrency} ändern?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Bitte wählen Sie ein Land:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Wir haben 2012 die\nApp für kollaboratives\nScannen erfunden",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Anlässlich unseres\n10-jährigen Bestehens\nerfinden wir es von Grund auf neu!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Willkommen!",
+ "onboarding_home_welcome_text2": "Die App, die Ihnen hilft, Lebensmittel auszuwählen, die gut für **Sie** und den **Planeten** sind!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Weiter",
"onboarding_welcome_loading_dialog_title": "Ihr erstes Beispielprodukt wird geladen",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Lesen Sie einen Barcode mit Ihrer Kamera ein",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration und haptisches Feedback",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Allgemeine Angaben vervollständigen",
"not_implemented_snackbar_text": "Noch nicht implementiert",
"category_picker_page_appbar_text": "Kategorien",
- "edit_ingredients_extrait_ingredients_btn_text": "Zutaten extrahieren",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Zutaten aus dem Foto extrahieren",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Zutaten werden aus\ndem Foto extrahiert",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Foto wird geladen …",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Foto aktualisieren",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Verpackung extrahieren",
+ "edit_packaging_extract_btn_text": "Verpackung aus dem\nFoto extrahieren",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Verpackung wird aus dem Foto extrahiert",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Foto wird geladen …",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Foto aktualisieren",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Verknüpfung zur Preise-App auf der Produktseite",
"prices_app_button": "Zur Preise-App wechseln",
+ "prices_generic_title": "Preise",
+ "prices_add_n_prices": "{count,plural, one {}=1{Preis hinzufügen} other{{count} Preise hinzufügen}}",
+ "prices_send_n_prices": "{count,plural, one {}=1{Preis senden} other{{count} Preise senden}}",
+ "prices_add_an_item": "Ein Element hinzufügen",
+ "prices_add_a_price": "Preis hinzufügen",
+ "prices_add_a_receipt": "Beleg hinzufügen",
+ "prices_add_price_tags": "Preisschilder hinzufügen",
+ "prices_barcode_search_not_found": "Produkt nicht gefunden",
+ "prices_barcode_search_none_yet": "Noch kein Produkt",
+ "prices_barcode_search_question": "Möchten Sie nach diesem Produkt suchen?",
+ "prices_barcode_search_title": "Produkte suchen",
+ "prices_barcode_search_running": "Nach {barcode} suchen",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcodelesegerät",
+ "prices_view_prices": "Preise anzeigen",
+ "prices_list_length_one_page": "{count,plural, =0{Noch kein Preis} =1{Nur ein Preis} other{Alle {count} Preise}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Letzte {pageSize} Preise (insgesamt: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, one {}=0{Noch kein Nachweis} =1{Nur ein Nachweis} other{Alle {count} Nachweise}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Letzte {pageSize} Nachweise (insgesamt: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Die besten {pageSize} Mitwirkende (insgesamt: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Betrag",
+ "prices_amount_is_discounted": "Preisreduziert?",
+ "prices_amount_price_normal": "Preis",
+ "prices_amount_price_discounted": "Reduzierter Preis",
+ "prices_amount_price_not_discounted": "Ursprünglicher Preis",
+ "prices_amount_no_product": "Ein Produkt fehlt!",
+ "prices_amount_price_incorrect": "Ungültiger Wert",
+ "prices_amount_price_mandatory": "Notwendiger Wert",
+ "prices_currency_subtitle": "Währung",
+ "prices_date_subtitle": "Datum",
+ "prices_location_subtitle": "Laden",
+ "prices_location_find": "Einen Laden finden",
+ "prices_location_mandatory": "Sie müssen einen Laden auswählen!",
+ "prices_proof_subtitle": "Nachweis",
+ "prices_proof_find": "Wählen Sie einen Nachweis",
+ "prices_proof_receipt": "Kassenbon",
+ "prices_proof_price_tag": "Preisschild",
+ "prices_proof_mandatory": "Sie müssen einen Nachweis auswählen!",
+ "prices_add_validation_error": "Überprüfungsfehler",
+ "prices_privacy_warning_title": "Datenschutzwarnung",
+ "prices_privacy_warning_message": "Die Preise werden zusammen mit dem Laden, auf den sie sich beziehen, veröffentlicht.\nDas könnte es Leuten, die Ihr Open Food Facts-Pseudonym kennen, ermöglichen:\n• Rückschlüsse auf Ihre Wohngegend ziehen\n• wissen, was Sie kaufen\nWenn Sie damit nicht einverstanden sind, ändern Sie bitte Ihr Pseudonym oder erstellen Sie ein neues Open Food Facts-Konto und melden Sie sich damit bei der App an.",
+ "prices_unknown_product": "Unbekanntes Produkt",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Fertig",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Serverkonfiguration",
+ "dev_mode_section_product_page": "Produktseite",
+ "dev_mode_section_ui": "Benutzeroberfläche",
+ "dev_mode_section_data": "Daten",
+ "dev_mode_section_experimental_features": "Experimentelle Funktionen",
"dev_mode_hide_ecoscore_title": "Eco-Score ausschließen",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Verwenden Sie eine Rechtschreibprüfung für OCR-Bildschirme",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Zutaten und Verpackung)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Diese Suche wiederverwenden und bearbeiten",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Mein Preise",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Meine Belege",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "Meine Nachweise",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Preise der Mitwirkenden",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Neueste Preise hinzugefügt",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Aktivste Preis-Mitwirkende",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Läden mit den meisten Preisen",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Produkte mit den meisten Preisen",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Alle „noch zu vervollständigenden” Produkte",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "Der Preis wird schnellstmöglich an den Server übermittelt.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Aktualisierung aller lokal gespeicherten Produkte wird gestartet",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Wählen Sie Ihre Währung:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Sprache auswählen:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (neue Berechnung)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (neue Berechnung)",
"nutriscore_unknown": "Unbekannter Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unbekannter Nutri-Score (neue Berechnung)",
"nutriscore_not_applicable": "Nutri-Score nicht zutreffend",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score ist nicht anwendbar (neue Berechnung)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Installieren Sie Open Beauty Facts, um eine Kosmetikdatenbank zu erstellen",
"faq_title_install_pet": "Installieren Sie Open Pet Food Facts, um eine Tierfutterdatenbank zu erstellen",
"faq_title_install_product": "Installieren Sie Open Products Facts, um eine Produktdatenbank zur Verlängerung der Lebensdauer von Objekten zu erstellen",
+ "faq_nutriscore_nutriscore": "Neue Berechnung des Nutri-Score: Was ist neu?",
"contact_title_pro_page": "Pro? Importieren Sie Ihre Produkte in Open Food Facts",
"contact_title_pro_email": "Kontakt zum Produzenten",
"contact_title_press_page": "Pressemappe",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Dieser Link kann auf Ihrem Gerät nicht geöffnet werden. Bitte überprüfen Sie, ob ein Browser installiert ist.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details für {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details für {pageName} mit {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Anleitung",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Teilen",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Der Nutri-Score entwickelt sich weiter: Erklärungen!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "de",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Was ist der Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Der Nutri-Score ist eine Kennzeichnung, die Sie über die **Nährwertqualität von Lebensmitteln** informieren soll.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Der Farbcode reicht von dunkelgrün (**A**) für die **gesündesten** Produkte bis dunkelrot (**E**) für die **weniger gesunden** Produkte.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Das Nutri-Score A-Logo",
+ "guide_nutriscore_v2_why_v2_title": "Warum wird Nutri-Score weiterentwickelt?",
+ "guide_nutriscore_v2_why_v2_intro": "Die Nutri-Score-Formel wird **weiterentwickelt**, um bessere Empfehlungen geben zu können:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Alle Getränke besser bewerten",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Die Vergleichsnoten für **Milch**, **Milchgetränke** mit Zuckerzusatz und **Gemüsegetränke** wurden in dem neuen Algorithmus besser unterschieden.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Bessere Einstufung von Getränken",
+ "guide_nutriscore_v2_why_v2_arg2_text": "Der **Zuckergehalt** wird besser berücksichtigt und begünstigt **wenig gesüßte** Getränke.\\n**Süßstoffe werden ebenfalls abgewertet**: Diät-Limonaden werden von einer B-Bewertung auf eine Bewertung zwischen C und E herabgestuft. Wasser bleibt das empfohlene Getränk.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salz und Zucker werden abgewertet",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Bei Produkten, die **zu süß** oder **zu salzig** sind, wird die **Bewertung weiter herabgestuft**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchie bei Ölen und Fischen",
+ "guide_nutriscore_v2_why_v2_arg4_text": "Die Bewertung von bestimmten **fetten Fischen** und **fettreichen Ölen** wird sich verbessern.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Die Bewertung von bestimmten **fetten Fischen** und **fettreichen Ölen** wird sich verbessern",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Der Verzehr von **rotem Fleisch sollte eingeschränkt werden**. Aus diesem Grund wird **Geflügel vergleichsweise besser bewertet**.",
+ "guide_nutriscore_v2_new_logo_title": "Wie unterscheidet sich der alte Nutri-Score durch die neue Berechnung?",
+ "guide_nutriscore_v2_new_logo_text": "Von nun an kann das Logo einen Hinweis \"**Neue Berechnung**\" enthalten, um zu verdeutlichen, dass es sich tatsächlich um die neue Berechnung handelt.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Das Logo des neuen Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Wo finde ich die neue Nutri-Score-Berechnung?",
+ "guide_nutriscore_v2_where_paragraph1": "Der Nutri-Score wird in mehreren Ländern angewendet: Deutschland, Belgien, Spanien, Frankreich, Luxemburg, die Niederlande und die Schweiz.",
+ "guide_nutriscore_v2_where_paragraph2": "Die Hersteller haben bis spätestens **2026** Zeit, **die alte Berechnung durch die neue zu ersetzen**.",
+ "guide_nutriscore_v2_where_paragraph3": "Ohne zu warten, **finden Sie bereits in der OpenFoodFacts-Anwendung** die neue Berechnung, auch wenn die Hersteller die Punktzahl noch nicht aktualisiert haben.",
+ "guide_nutriscore_v2_unchanged_title": "Was sich nicht ändert",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Der Nutri-Score ist ein Punktesystem zur **Bewertung der Nährwertqualität**. Er ist eine **Ergänzung zur NOVA-Gruppe** für **hochverarbeitete Lebensmittel** (ebenfalls in der App enthalten).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Für die Hersteller ist die Angabe des Nutri-Score **weiterhin optional**.",
+ "guide_nutriscore_v2_share_link": "https://de.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Vorschau",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_el.arb b/packages/smooth_app/lib/l10n/app_el.arb
index b218c315a52..5a60a511338 100644
--- a/packages/smooth_app/lib/l10n/app_el.arb
+++ b/packages/smooth_app/lib/l10n/app_el.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Μπροστινή φωτογραφία προϊόντος",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Επιβεβαίωση μεταφόρτωσης μπροστινής φωτογραφίας προϊόντος",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Φωτογραφία συστατικών",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Φωτογραφία ανακύκλωσης",
+ "take_photo_title": "Τραβήξτε μια φωτογραφία",
"take_more_photo_title": "Τραβήξτε περισσότερες φωτογραφίες",
"front_photo_uploaded": "Η μπροστινή φωτογραφία μεταφορτώθηκε",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Δεν βρέθηκε προϊόν",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "δεν βρέθηκε:",
- "searchPanelHeader": "Αναζητήστε ή σαρώστε το πρώτο σας προϊόν",
- "@Product query status": {},
"refreshing_product": "Ανανέωση προϊόντος",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Η ανάκτηση πληροφοριών για αυτό το προϊόν ήταν αδύνατη λόγω σφάλματος δικτύου.",
"cached_results_from": "Εμφάνιση αποτελεσμάτων από:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Σχεδιάσαμε\nτη συλλογική εφαρμογή σάρωσης\nτο 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Καθώς κλείνουμε τα 10, επανασχεδιάζουμε την εφαρμογή ξανά\nαπό την αρχή!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Φόρτωση του πρώτου παραδείγματος προϊόντος σας",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Συμπληρώστε τις βασικές λεπτομέρειες",
"not_implemented_snackbar_text": "Δεν έχει υλοποιηθεί ακόμη",
"category_picker_page_appbar_text": "Κατηγορίες",
- "edit_ingredients_extrait_ingredients_btn_text": "Εξαγωγή συστατικών",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Ανανέωση φωτογραφίας",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Ανανέωση φωτογραφίας",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Δεδομένα",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Κοινοποίηση",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_en.arb b/packages/smooth_app/lib/l10n/app_en.arb
index 0582593abcc..72f4d0ceced 100644
--- a/packages/smooth_app/lib/l10n/app_en.arb
+++ b/packages/smooth_app/lib/l10n/app_en.arb
@@ -129,10 +129,6 @@
"@whatIsOff": {
"description": "Description of Open Food Facts organization."
},
- "offUtility": "Choose food that is good for you and the planet.",
- "@offUtility": {
- "description": "Description of what a user can use Open Food Facts for."
- },
"productDataUtility": "See the food data relevant to your preferences.",
"@productDataUtility": {
"description": "Description of what a user can use the product data for."
@@ -566,6 +562,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +624,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +736,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +746,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +799,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +849,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1115,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1231,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1475,50 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
+ "edit_ingredients_loading_photo_help_dialog_title": "Why do I see this message?",
+ "@edit_ingredients_loading_photo_help_dialog_title": {
+ "description": "Ingredients edition - Dialog explaining why the photo is loading - Title"
+ },
+ "edit_ingredients_loading_photo_help_dialog_body": "To use the \"Extract ingredients\" feature, the photo needs to be uploaded first.\n\nPlease wait a few seconds or enter them manually.",
+ "@edit_ingredients_loading_photo_help_dialog_body": {
+ "description": "Ingredients edition - Dialog explaining why the photo is loading - Content"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
+ "edit_packaging_loading_photo_help_dialog_title": "Why do I see this message?",
+ "@edit_packaging_loading_photo_help_dialog_title": {
+ "description": "Packaging edition - Dialog explaining why the photo is loading - Title"
+ },
+ "edit_packaging_loading_photo_help_dialog_body": "To use the \"Extract packaging\" feature, the photo needs to be uploaded first.\n\nPlease wait a few seconds or enter them manually.",
+ "@edit_packaging_loading_photo_help_dialog_body": {
+ "description": "Packaging edition - Dialog explaining why the photo is loading - Content"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1621,16 +1728,199 @@
"@dev_preferences_import_history_subtitle": {
"description": "User dev preferences - Import history - Subtitle"
},
+ "dev_preferences_news_custom_url_title": "Custom URL for news",
+ "@dev_preferences_news_custom_url_title": {
+ "description": "News dev preferences - Custom URL for news - Title"
+ },
+ "dev_preferences_news_custom_url_subtitle": "URL of the JSON file:",
+ "@dev_preferences_news_custom_url_subtitle": {
+ "description": "News dev preferences - Custom URL for news - Title"
+ },
+ "dev_preferences_news_custom_url_empty_value": "Not set",
+ "@dev_preferences_news_custom_url_empty_value": {
+ "description": "Message to show when the custom news URL is not set"
+ },
+ "dev_preferences_news_provider_status_title": "Status",
+ "@dev_preferences_news_provider_status_title": {
+ "description": "News dev preferences - Status - Title"
+ },
+ "dev_preferences_news_provider_status_subtitle": "Last refresh: {date}",
+ "@dev_preferences_news_provider_status_subtitle": {
+ "description": "News dev preferences - Custom URL for news - Subtitle",
+ "placeholders": {
+ "date": {
+ "type": "String"
+ }
+ }
+ },
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_product_accessibility_summary": "{count,plural, =1{1 price} other{{count} prices}} for {product}",
+ "@prices_product_accessibility_summary": {
+ "description": "A card summarizing the number of prices for a product",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ },
+ "product": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_entry_accessibility_label": "Price: {price} / Store: \"{location}\" / Published on {date} by \"{user}\"",
+ "@prices_entry_accessibility_label": {
+ "description": "Accessibility label for a price entry",
+ "placeholders": {
+ "price": {
+ "type": "String"
+ },
+ "location": {
+ "type": "String"
+ },
+ "date": {
+ "type": "String"
+ },
+ "user": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_open_user_proofs": "Open proofs of \"{user}\"",
+ "@prices_open_user_proofs": {
+ "description": "Button to open the proofs of a user",
+ "placeholders": {
+ "user": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_open_proof": "Open price proof",
+ "@prices_open_proof": {
+ "description": "Button to open a proof"
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_news": "News provider configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1972,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1936,9 +2258,13 @@
}
}
},
- "capture": "Capture New",
+ "capture": "Take a new picture",
"@capture": {
- "description": "Button label for taking a photo"
+ "description": "Button label for taking a new photo (= there's already one)"
+ },
+ "capture_new_picture": "Take a picture",
+ "@capture_new_picture": {
+ "description": "Button label for taking a new photo (= the first one)"
},
"choose_from_gallery": "Choose from gallery",
"@choose_from_gallery": {
@@ -1948,6 +2274,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2792,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2822,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2856,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2873,88 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
+ },
+ "prices_feedback_form": "Click here to send us your feedback about this new feature!",
+ "@prices_feedback_form": {
+ "description": "A button to send feedback about the prices feature"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_eo.arb b/packages/smooth_app/lib/l10n/app_eo.arb
index ac008dfd099..4b83b9f54aa 100644
--- a/packages/smooth_app/lib/l10n/app_eo.arb
+++ b/packages/smooth_app/lib/l10n/app_eo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorioj",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_es.arb b/packages/smooth_app/lib/l10n/app_es.arb
index a8668beb4b3..83aba39111e 100644
--- a/packages/smooth_app/lib/l10n/app_es.arb
+++ b/packages/smooth_app/lib/l10n/app_es.arb
@@ -371,7 +371,7 @@
},
"contribute_improve_text": "La base de datos es el núcleo del proyecto. Puedes ayudar de manera fácil y muy rápido. Descarga la aplicación en tu teléfono móvil y empieza a añadir productos o a mejorar los que ya están.\n\nPor otro lado, el sitio web de Open Food Facts ofrece muchas maneras de colaborar: ",
"@contribute_improve_text": {},
- "contribute_translate_header": "Traducir",
+ "contribute_translate_header": "Traduce",
"@contribute_translate_header": {
"description": "Button label + pop up window title: Shows information about helping by translating"
},
@@ -481,7 +481,7 @@
"description": "Top meta-entry on a category filter"
},
"category_search": "(búsqueda de categorías)",
- "filter": "Filtros",
+ "filter": "Filtro",
"@filter": {
"description": "A button that opens a menu where you can filter within categories. Juices => Apple juices/Orange juices"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Una ilustración con Nutri-Score y Eco-Score desconocidos",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto frontal del producto",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirmar el envío de la foto frontal del producto",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto de los ingredientes",
"nutritional_facts_photo_title": "Foto de la información nutricional",
"recycling_photo_title": "Foto sobre el reciclaje",
+ "take_photo_title": "Saca una foto",
"take_more_photo_title": "Haz más fotos",
"front_photo_uploaded": "Foto frontal subida",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No se ha encontrado ningún producto",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "no se ha encontrado:",
- "searchPanelHeader": "Busca o escanea tu primer producto",
- "@Product query status": {},
"refreshing_product": "Actualizando producto",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Bienvenida a Open Food Facts∫",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Escanee** un código de barras o\n**busque** un producto",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Buscar un producto",
+ "homepage_main_card_search_field_tooltip": "Iniciar búsqueda",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "¿Te gusta la aplicación?",
"tagline_app_review_button_positive": "¡Me encanta! 😍",
"tagline_app_review_button_negative": "No mucho…",
"tagline_app_review_button_later": "Pregúntame más tarde",
+ "tagline_feed_news_button": "Más información",
"app_review_negative_modal_title": "¿No te gusta nuestra aplicación?",
"app_review_negative_modal_text": "¿Nos podrías explicar por qué?",
"app_review_negative_modal_positive_button": "¡Sí, por supuesto!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Imposible obtener información sobre este producto debido a un error de red.",
"cached_results_from": "Mostrar resultados de:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Por favor, elija una moneda",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Por favor, elige un país:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Inventamos\nla aplicación de escaneo\ncolaborativa en 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Hemos cumplido 10 años\ny nos estamos reinventando\n¡por completo!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continuar",
"onboarding_welcome_loading_dialog_title": "Cargando tu primer producto de ejemplo",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibración y respuesta táctil",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Completa los detalles básicos",
"not_implemented_snackbar_text": "Aún sin implementar",
"category_picker_page_appbar_text": "Categorías",
- "edit_ingredients_extrait_ingredients_btn_text": "Extraer ingredientes",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Actualizar foto",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extraer el envase",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Actualizar foto",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1586,7 +1681,7 @@
"@dev_preferences_export_history_progress_found": {
"description": "User dev preferences - Export history - Item - Found"
},
- "dev_preferences_export_history_progress_not_found": "producto NO encontrado",
+ "dev_preferences_export_history_progress_not_found": "producto no encontrado",
"@dev_preferences_export_history_progress_not_found": {
"description": "User dev preferences - Export history - Item - Not found"
},
@@ -1623,19 +1718,133 @@
},
"prices_app_dev_mode_flag": "Acceso directo a la aplicación Prices en la página del producto",
"prices_app_button": "Ir a la aplicación Prices",
+ "prices_generic_title": "Precios",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Añadir un precio",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Producto no encontrado",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Búsqueda de producto",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Precio",
+ "prices_amount_price_discounted": "Precio con descuento",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Moneda",
+ "prices_date_subtitle": "Fecha",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Comprobante",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Ticket",
+ "prices_proof_price_tag": "Etiqueta de precio",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Producto desconocido",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Hecho",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Datos",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Excluir Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reutilizar y editar esta búsqueda",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
},
- "product_search_no_more_results": "Has descargado los {totalSize} productos.",
+ "product_search_no_more_results": "Has descargado todos los {totalSize} productos.",
"@product_search_no_more_results": {
"description": "Product search list - No more results available",
"placeholders": {
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Mis precios",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Mis pruebas",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Todos los productos por completar",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Iniciando la actualización de todos los productos almacenados localmente",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2246,7 +2491,7 @@
"background_task_error_no_internet": "Error de conexión a Internet. Inténtalo más tarde.",
"background_task_operation_unknown": "tipo de operación desconocida",
"background_task_operation_details": "cambios detallados",
- "background_task_operation_image": "carga de fotos",
+ "background_task_operation_image": "subir foto",
"background_task_operation_refresh": "actualización retrasada después de cargar la foto",
"background_task_run_started": "iniciado",
"background_task_run_not_started": "todavía no se ha iniciado",
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Seleccione su moneda:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Selecciona tu idioma:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Nutri-Score desconocido",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "No es posible aplicar el Nutri-Score",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Instala Open Beauty Facts para crear una base de datos sobre cosmética",
"faq_title_install_pet": "Instala Open Pet Food Facts para crear una base de datos sobre alimentación para mascotas",
"faq_title_install_product": "Instala Open Products Facts para crear una base de datos sobre productos del día a día",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "¿Eres profesional? Importa tus productos a Open Food Facts",
"contact_title_pro_email": "Contacto para productores",
"contact_title_press_page": "Página de prensa",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Este enlace no se puede abrir en tu dispositivo. Comprueba que tienes un navegador instalado.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Compartir",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "¿Qué es el Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "¿Dónde encontrar el nuevo cálculo Nutri-Score?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/guide/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_et.arb b/packages/smooth_app/lib/l10n/app_et.arb
index 757f9641b74..050e4ce7d3c 100644
--- a/packages/smooth_app/lib/l10n/app_et.arb
+++ b/packages/smooth_app/lib/l10n/app_et.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Tehke foto",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategooriad",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Andmed",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_eu.arb b/packages/smooth_app/lib/l10n/app_eu.arb
index b7a2b3732ff..594021bf777 100644
--- a/packages/smooth_app/lib/l10n/app_eu.arb
+++ b/packages/smooth_app/lib/l10n/app_eu.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Produktuaren aurreko aldeko argazkia",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Osagaien argazkia",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Birziklapenaren argazkia",
+ "take_photo_title": "Atera argazki bat",
"take_more_photo_title": "Atera argazki gehiago",
"front_photo_uploaded": "Aurrealdeko argazkia igo da",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Ez da produkturik aurkitu",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "ez da aurkitu:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Aplikazioa gustatzen zaizu?",
"tagline_app_review_button_positive": "Datsegit! 😍",
"tagline_app_review_button_negative": "Egia esan ez…",
"tagline_app_review_button_later": "Galdetu geroago",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Ez zaizu gure aplikazioa gustatzen?",
"app_review_negative_modal_text": "Segundo batzuk har zenezake arrazoia azaltzeko?",
"app_review_negative_modal_positive_button": "Bai, jakina!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategoriak",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Prezioak aplikazioko produktuaren orrirako laster-bidea",
"prices_app_button": "Joan Prezioak aplikaziora",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Deskontua egindako prezioa",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Datuak",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Berrerabili eta editatu bilaketa hau",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Bertan gordeta dauden produktu guztiak freskatzeari ekiten",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Hautatu zure hizkuntza:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Ezin da ireki esteka gailuan. Egiaztatu arakatzaile bat instalatuta duzula.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Partekatu",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "eu",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_fa.arb b/packages/smooth_app/lib/l10n/app_fa.arb
index 65c25f3fb75..389afe3a5b9 100644
--- a/packages/smooth_app/lib/l10n/app_fa.arb
+++ b/packages/smooth_app/lib/l10n/app_fa.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "یک عکس بگیرید",
"take_more_photo_title": "ثبت تصاویر بیشتر",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "هیچ محصولی یافت نشد",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "یافت نشد:",
- "searchPanelHeader": "اولین محصول خود را جستجو یا اسکن کنید",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "دستهبندیها",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "اشتراک",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_fi.arb b/packages/smooth_app/lib/l10n/app_fi.arb
index 0dcc15c71de..26cf7e07dbf 100644
--- a/packages/smooth_app/lib/l10n/app_fi.arb
+++ b/packages/smooth_app/lib/l10n/app_fi.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Kuva edestä",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Vahvista edestäpäin otetun kuvan lataaminen",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Sisältöluettelon kuva",
"nutritional_facts_photo_title": "Ravintosisältökuva",
"recycling_photo_title": "Kierrätyksen kuva",
+ "take_photo_title": "Ota kuva",
"take_more_photo_title": "Ota lisää kuvia",
"front_photo_uploaded": "Etukuva ladattu",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Tuotetta ei löytynyt",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "ei löytynyt:",
- "searchPanelHeader": "Hae tai skannaa ensimmäinen tuotteesi",
- "@Product query status": {},
"refreshing_product": "Päivitetään tuotetta",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Etsi tuote",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Pidätkö sovelluksesta?",
"tagline_app_review_button_positive": "Rakastan sitä! 😍",
"tagline_app_review_button_negative": "En juurikaan…",
"tagline_app_review_button_later": "Kysy myöhemmin",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Etkö pidä sovelluksestamme?",
"app_review_negative_modal_text": "Voisitko käyttää muutaman sekunnin kertoaksesi meille miksi?",
"app_review_negative_modal_positive_button": "Kyllä, ehdottomasti!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Tietojen lataus epäonnistui verkkovirheen vuoksi.",
"cached_results_from": "Näytä tulokset ajalta:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Valitse valuutta",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Valitse maa:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Teimme\nyhteisöllisen\nlukijasovelluksen vuonna 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Täyttäessämme 10\nuudistamme sitä\nalusta alkaen.",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Jatka",
"onboarding_welcome_loading_dialog_title": "Ladataan ensimmäistä esimerkkituotettasi",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Värinä ja haptiikka",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Täytä perustiedot",
"not_implemented_snackbar_text": "Ei vielä käytössä",
"category_picker_page_appbar_text": "Tuoteluokat",
- "edit_ingredients_extrait_ingredients_btn_text": "Poimi ainesosat",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Päivitä kuva",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Pura pakkaus",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Päivitä kuva",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Pikakuvake Hinnat-sovellukseen tuotesivulla",
"prices_app_button": "Siirry Hinnat-sovellukseen",
+ "prices_generic_title": "Hinnat",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Lisää hinta",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Tuotetta ei löytynyt",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Tuotehaku",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Hinta",
+ "prices_amount_price_discounted": "Alennettu hinta",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Valuutta",
+ "prices_date_subtitle": "Päivämäärä",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Todiste",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Kuitti",
+ "prices_proof_price_tag": "Hintalappu",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Tuntematon tuote",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Valmis",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Tiedot",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Jätä ympäristöystävällisyyspisteytys huomiotta",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Käytä ja muokkaa tätä hakua uudelleen",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Minun hinnat",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Minun todisteeni",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Kaikki tehtävälistan tuotteet",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Aloitetaan kaikkien paikallisesti tallennettujen tuotteiden päivitys",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Valitse valuutta:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Valitse kieli:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Tuntematon Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score ei sovellu",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Luo kosmeettinen tietokanta asentamalla Open Beauty Facts",
"faq_title_install_pet": "Luo lemmikkieläinten ruokatietokanta asentamalla Open Pet Food Facts",
"faq_title_install_product": "Asenna Open Products Facts luodaksesi tuotetietokannan objektien käyttöiän pidentämiseksi",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Tuo tuotteesi Open Food Factsiin",
"contact_title_pro_email": "Tuottajan yhteystiedot",
"contact_title_press_page": "Lehdistösivu",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Tätä linkkiä ei voi avata laitteellasi. Tarkista, että sinulla on selain asennettuna.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Jaa",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "fi",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Mikä on Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_fo.arb b/packages/smooth_app/lib/l10n/app_fo.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_fo.arb
+++ b/packages/smooth_app/lib/l10n/app_fo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_fr.arb b/packages/smooth_app/lib/l10n/app_fr.arb
index 6921f0feeb3..4e9ae8dd5b9 100644
--- a/packages/smooth_app/lib/l10n/app_fr.arb
+++ b/packages/smooth_app/lib/l10n/app_fr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Une illustration avec un Nutri-Score et un Eco-Score inconnus",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Photo frontale du produit",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirmer le téleversement de la photo frontale du produit",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Photo des ingrédients",
"nutritional_facts_photo_title": "Photo des valeurs nutritionnelles",
"recycling_photo_title": "Photo du recyclage",
+ "take_photo_title": "Prendre une photo",
"take_more_photo_title": "Prendre plus de photos",
"front_photo_uploaded": "Photo de la face avant téléchargée",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Aucun produit trouvé",
"@no_product_found": {},
+ "no_location_found": "Aucun magasin trouvé",
"not_found": "non trouvé :",
- "searchPanelHeader": "Recherchez ou scannez votre premier produit",
- "@Product query status": {},
"refreshing_product": "Actualisation du produit",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image prise le {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image prise le {date}. Cette image est peut-être obsolète",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Bienvenue sur Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scannez** un code-barres ou\n**recherchez** un produit",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Chercher un produit",
+ "homepage_main_card_search_field_tooltip": "Démarrer la recherche",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Aimez-vous cette appli ?",
"tagline_app_review_button_positive": "Je l'adore! 😍",
"tagline_app_review_button_negative": "Pas vraiment…",
"tagline_app_review_button_later": "Me demander plus tard",
+ "tagline_feed_news_button": "En savoir plus",
"app_review_negative_modal_title": "Vous n'aimez pas notre application ?",
"app_review_negative_modal_text": "Pourriez-vous prendre quelques secondes pour nous dire pourquoi ?",
"app_review_negative_modal_positive_button": "Oui, absolument !",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Une erreur est survenue !",
+ "product_internet_error_modal_message": "Nous ne parvenons pas à récupérer des informations sur ce produit en raison d'une erreur réseau. Veuillez vérifier votre connexion internet et réessayer.\n\nErreur interne :\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible de récupérer les informations sur ce produit en raison d'une erreur réseau.",
"cached_results_from": "Résultats mis en cache depuis :",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Veuillez choisir une devise",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Vous venez de changer de pays.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Voulez-vous changer la devise de {previousCurrency} à {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Veuillez sélectionner un pays :",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Nous avons inventé\nl'appli de scan\ncollaborative en 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "10 ans après,\nnous la réinventons\ncomplètement !",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Bienvenue !",
+ "onboarding_home_welcome_text2": "L'application qui vous aide à choisir de la nourriture qui est bonne pour **vous** et la **planète** !",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continuer",
"onboarding_welcome_loading_dialog_title": "Chargement de votre premier exemple de produit",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration et retours tactiles",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,10 +1479,18 @@
"completed_basic_details_btn_text": "Compléter les informations de base",
"not_implemented_snackbar_text": "Pas encore disponible",
"category_picker_page_appbar_text": "Catégories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extraire les ingrédients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extraire les ingrédients à partir de la photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extraction des ingrédients à partir de la photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Chargement de la photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Mettre à jour la photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
@@ -1412,6 +1499,14 @@
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extraction de l'emballage à partir de la photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Chargement de la photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Mettre à jour la photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Raccourci vers l'application Prix sur la page produit",
"prices_app_button": "Accéder à l'application Prix",
+ "prices_generic_title": "Prix",
+ "prices_add_n_prices": "{count,plural, =1{Ajouter un prix} other{Ajouter {count} prix}}",
+ "prices_send_n_prices": "{count,plural, =1{Envoyer le prix} other{Envoyer {count} prix}}",
+ "prices_add_an_item": "Ajouter un article",
+ "prices_add_a_price": "Ajouter un prix",
+ "prices_add_a_receipt": "Ajouter un ticket de caisse",
+ "prices_add_price_tags": "Ajouter des étiquettes de prix",
+ "prices_barcode_search_not_found": "Produit non trouvé",
+ "prices_barcode_search_none_yet": "Pas encore de produit",
+ "prices_barcode_search_question": "Voulez-vous chercher ce produit ?",
+ "prices_barcode_search_title": "Recherche de produit",
+ "prices_barcode_search_running": "À la recherche de {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Lecteur de code-barres",
+ "prices_view_prices": "Voir les prix",
+ "prices_list_length_one_page": "{count,plural, =0{Aucun prix} =1{Un seul prix} other{Tous les {count} prix}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "{pageSize} prix les plus récents (total : {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{Aucune preuve} =1{Une seule preuve} other{Toutes les {count} preuves}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "{pageSize} preuves les plus récentes (total : {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributeurs (total : {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Montant",
+ "prices_amount_is_discounted": "En promotion ?",
+ "prices_amount_price_normal": "Prix",
+ "prices_amount_price_discounted": "Prix en promo",
+ "prices_amount_price_not_discounted": "Prix d'origine",
+ "prices_amount_no_product": "Il manque un produit !",
+ "prices_amount_price_incorrect": "Valeur incorrecte",
+ "prices_amount_price_mandatory": "Valeur obligatoire",
+ "prices_currency_subtitle": "Devise",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Magasin",
+ "prices_location_find": "Chercher un magasin",
+ "prices_location_mandatory": "Vous devez choisir un magasin !",
+ "prices_proof_subtitle": "Preuve",
+ "prices_proof_find": "Choisir une preuve",
+ "prices_proof_receipt": "Ticket de caisse",
+ "prices_proof_price_tag": "Étiquette de prix",
+ "prices_proof_mandatory": "Vous devez choisir une preuve !",
+ "prices_add_validation_error": "Erreur de validation",
+ "prices_privacy_warning_title": "Avertissement de confidentialité",
+ "prices_privacy_warning_message": "Les prix seront publics, ainsi que le magasin auquel ils font référence.\nCela pourrait permettre aux personnes qui connaissent votre pseudonyme Open Food Facts de :\n* déduire dans quelle région vous habitez\n* savoir ce que vous achetez\nSi vous êtes pas à l'aise avec cela, veuillez changer votre pseudonyme ou créer un nouveau compte Open Food Facts et vous connecter à l'application avec celui-ci.",
+ "prices_unknown_product": "Produit inconnu",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Fait",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Configuration du serveur",
+ "dev_mode_section_product_page": "Page produit",
+ "dev_mode_section_ui": "Interface utilisateur",
+ "dev_mode_section_data": "Données",
+ "dev_mode_section_experimental_features": "Fonctionnalités expérimentales",
"dev_mode_hide_ecoscore_title": "Exclure l'éco-score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Réutiliser et modifier cette recherche",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Mes prix",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Mes preuves",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "Ma preuve",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Prix d'un contributeur",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Derniers prix ajoutés",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top contributeurs",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Top lieux",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Top produits",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Tous les produits à compléter",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "Le prix sera envoyé en arrière-plan dès que possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Démarrage de la mise à jour de tous les produits stockés localement",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Sélectionnez votre devise:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Sélectionnez votre langue :",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Nouveau calcul)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (nouveau calcul)",
"nutriscore_unknown": "Nutri-Score inconnu",
+ "nutriscore_unknown_new_formula": "Nutri-Score inconnu (Nouveau calcul)",
"nutriscore_not_applicable": "Nutri-Score non applicable",
+ "nutriscore_not_applicable_new_formula": "Le Nutri-Score n'est pas applicable (Nouveau calcul)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Éco-Score A",
"ecoscore_b": "Éco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Installez Open Beauty Facts pour créer une base de données cosmétiques",
"faq_title_install_pet": "Installez Open Pet Food Facts pour créer une base de données sur les aliments pour animaux de compagnie",
"faq_title_install_product": "Installez Open Products Facts pour créer une base de données de produits afin de prolonger la durée de vie des objets",
+ "faq_nutriscore_nutriscore": "Nouveau calcul du Nutri-Score : qu'est-ce qui a changé ?",
"contact_title_pro_page": "Pro? Importez vos produits dans Open Food Facts",
"contact_title_pro_email": "Contact producteur",
"contact_title_press_page": "Page de presse",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Ce lien ne peut pas être ouvert sur votre appareil. Veuillez vérifier qu'un navigateur est installé.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Détails pour {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Détails pour {pageName} avec {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Partager",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Le Nutri-Score change : explications !",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "fr",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Qu'est ce que le Nutri-Score ?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Le Nutri-Score est un logo qui a pour objectif de vous informer sur la **qualité nutritionnelle des aliments**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Le code couleur varie en allant du vert foncé (**A**) pour les produits les **plus sains** au rouge foncé (**E**) pour les **moins sains**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Le logo Nutri-Score A",
+ "guide_nutriscore_v2_why_v2_title": "Pourquoi le Nutri-Score change-t-il ?",
+ "guide_nutriscore_v2_why_v2_intro": "La formule du Nutri-Score **évolue** pour fournir de meilleures recommandations :",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Mieux évaluer l'ensemble des boissons",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Les notes comparées du **lait**, les **boissons lactées** avec ajout de sucre et **végétales** ont été mieux différenciées dans le nouvel algorithme.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Un meilleur classement des boissons",
+ "guide_nutriscore_v2_why_v2_arg2_text": "La **teneur en sucres** est mieux prise en compte et avantage les boissons **faiblement sucrées**.\\nLes **édulcorants seront également pénalisés** : les sodas light vont être déclassés pour passer d’une note B à entre C et E. L’eau reste la boisson recommandée.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Le sel et sucre pénalisés",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Les produits **trop sucrés** ou **trop salés** verront leur **note encore dégradée**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hiérarchisation des huiles et poissons",
+ "guide_nutriscore_v2_why_v2_arg4_text": "La note de certains **poissons gras** et des **huiles riches en bonnes graisses** va s’améliorer.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limiter la viande rouge",
+ "guide_nutriscore_v2_why_v2_arg5_text": "La consommation de **viande rouge est à limiter**. C’est pourquoi la **volaille sera comparativement mieux classée**.",
+ "guide_nutriscore_v2_new_logo_title": "Comment différencier ancien Nutri-Score et nouveau calcul ?",
+ "guide_nutriscore_v2_new_logo_text": "Désormais le logo peut arborer une mention \"**Nouveau calcul**\" pour clarifier qu'il s'agit bien du nouveau calcul.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Le logo du nouveau Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Où trouver le nouveau calcul du Nutri-Score ?",
+ "guide_nutriscore_v2_where_paragraph1": "Le Nutri-Score est en application dans plusieurs pays : l'Allemagne, la Belgique, l'Espagne, la France, le Luxembourg, les Pays-Bas et la Suisse.",
+ "guide_nutriscore_v2_where_paragraph2": "Les fabricants ont jusqu'en **2026** au plus tard **pour remplacer** l'ancien calcul par le nouveau.",
+ "guide_nutriscore_v2_where_paragraph3": "Sans attendre, vous **retrouvez déjà dans l'application Open Food Facts**, le nouveau calcul, y compris si les fabriquants n’ont pas mis à jour le score.",
+ "guide_nutriscore_v2_unchanged_title": "Ce qui ne change pas",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Le Nutri-Score est un score conçu pour **mesurer la qualité nutritionnelle**. Il est **complémentaire au groupe NOVA** sur les **aliments ultra-transformés** (également présent dans l'application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Pour les fabricants, l'affichage du Nutri-Score **reste optionnel**.",
+ "guide_nutriscore_v2_share_link": "https://fr.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Aperçu",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ga.arb b/packages/smooth_app/lib/l10n/app_ga.arb
index 9578c2b338b..326ba962b9a 100644
--- a/packages/smooth_app/lib/l10n/app_ga.arb
+++ b/packages/smooth_app/lib/l10n/app_ga.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Tóg pictiúr",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Catagóirí",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Comhroinn",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_gd.arb b/packages/smooth_app/lib/l10n/app_gd.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_gd.arb
+++ b/packages/smooth_app/lib/l10n/app_gd.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_gl.arb b/packages/smooth_app/lib/l10n/app_gl.arb
index 9411e2c8ff6..820ec0df6e8 100644
--- a/packages/smooth_app/lib/l10n/app_gl.arb
+++ b/packages/smooth_app/lib/l10n/app_gl.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Tirar unha foto",
"take_more_photo_title": "Tomar máis fotografías",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categorías",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Datos",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Compartir",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_gu.arb b/packages/smooth_app/lib/l10n/app_gu.arb
index 403a45828b1..1ab5d8c7a32 100644
--- a/packages/smooth_app/lib/l10n/app_gu.arb
+++ b/packages/smooth_app/lib/l10n/app_gu.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "ફોટો પાડો",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "શ્રેણીઓ",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "માહિતી",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ha.arb b/packages/smooth_app/lib/l10n/app_ha.arb
index 837806e0462..26d87af487c 100644
--- a/packages/smooth_app/lib/l10n/app_ha.arb
+++ b/packages/smooth_app/lib/l10n/app_ha.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_he.arb b/packages/smooth_app/lib/l10n/app_he.arb
index 802b06c8441..c4ea97f5154 100644
--- a/packages/smooth_app/lib/l10n/app_he.arb
+++ b/packages/smooth_app/lib/l10n/app_he.arb
@@ -332,7 +332,7 @@
"@legalNotices": {
"description": "A link to open the legal notices on the website"
},
- "privacy_policy": "Privacy policy",
+ "privacy_policy": "מדיניות פרטיות",
"@privacy_policy": {
"description": "A link to open the privacy policy on the website"
},
@@ -485,7 +485,7 @@
"@filter": {
"description": "A button that opens a menu where you can filter within categories. Juices => Apple juices/Orange juices"
},
- "scan": "Products from the Scan screen",
+ "scan": "מוצרים ממסך הסריקה",
"@scan": {
"description": "Page title: List type: Products in the scan session"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "איור עם ציוני Nutri-Score ו־Eco-Score לא ידועים",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "תמונת החזית של המוצר",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "לאשר את העלאת תמונת החזית של המוצר",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "תמונת רכיבים",
"nutritional_facts_photo_title": "תמונת פירוט תזונתי",
"recycling_photo_title": "תמונת מיחזור",
+ "take_photo_title": "צילום תמונה",
"take_more_photo_title": "צילום תמונות נוספות",
"front_photo_uploaded": "תמונת החזית נשלחה",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "לא נמצאו מוצרים",
"@no_product_found": {},
+ "no_location_found": "לא נמצא מקום",
"not_found": "לא נמצאו:",
- "searchPanelHeader": "כדאי לך לחפש או לסרוק את המוצר הראשון שלך",
- "@Product query status": {},
"refreshing_product": "המוצר מתרענן",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "התמונה צולמה ב־{date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "התמונה צולמה ב־{date}. היא כנראה לא עדכנית",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "ברוך בואך ל־Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "ניתן **לסרוק** ברקוד או\n**לחפש** מוצר",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "חיפוש מוצר",
+ "homepage_main_card_search_field_tooltip": "התחלת חיפוש",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "איך היישומון שלנו?",
"tagline_app_review_button_positive": "הוא מעולה! 😍",
"tagline_app_review_button_negative": "ככה ככה…",
"tagline_app_review_button_later": "אחר כך",
+ "tagline_feed_news_button": "מידע נוסף",
"app_review_negative_modal_title": "לא אהבת את היישומון שלנו?",
"app_review_negative_modal_text": "נוכל לבקש ממך להקדיש מספר שניות ולספר לנו למה?",
"app_review_negative_modal_positive_button": "כן, כמובן!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "לא ניתן למשוך מידע על המוצר הזה עקב שגיאת רשת.",
"cached_results_from": "להציג תוצאות מ־:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "נא לבחור מטבע",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "הרגע החלפת בין מדינות.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "להחליף מהמטבע {previousCurrency} למטבע {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "נא לבחור מדינה:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "המצאנו\nאת יישומון\nהסריקה השיתופי ב־2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "לרגל יום ההולדת\nהעשירי אנחנו מחדשים\nאותו לגמרי מאפס!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "להמשיך",
"onboarding_welcome_loading_dialog_title": "מוצר ההדגמה הראשוני שלך נטען",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "רטט ומשוב פיזי",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "השלמת הפרטים הבסיסיים",
"not_implemented_snackbar_text": "לא מיושם עדיין",
"category_picker_page_appbar_text": "קטגוריות",
- "edit_ingredients_extrait_ingredients_btn_text": "חילוץ רכיבים",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "רענון תמונה",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "חילוץ אריזה",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "רענון תמונה",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "קיצור דרך ליישומון מחירים בעמוד המוצר",
"prices_app_button": "מעבר ליישומון המחירים",
+ "prices_generic_title": "מחירים",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "הוספת מחיר",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "המוצר לא נמצא",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "חיפוש מוצרים",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, two {כל {count} המחירים} many {כל {count} המחירים}=0{אין מחיר עדיין} =1{מחיר אחד בלבד} other{כל {count} המחירים}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "{pageSize} המחירים העדכניים ביותר (סך הכול: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "{pageSize} המתנדבים המובילים (בסך הכול: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "סכום",
+ "prices_amount_is_discounted": "בהנחה?",
+ "prices_amount_price_normal": "מחיר",
+ "prices_amount_price_discounted": "מחיר מוזל",
+ "prices_amount_price_not_discounted": "מחיר מקורי",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "ערך שגוי",
+ "prices_amount_price_mandatory": "ערך חובה",
+ "prices_currency_subtitle": "מטבע",
+ "prices_date_subtitle": "תאריך",
+ "prices_location_subtitle": "חנות",
+ "prices_location_find": "איתור חנות",
+ "prices_location_mandatory": "חובה לבחור חנות!",
+ "prices_proof_subtitle": "הוכחה",
+ "prices_proof_find": "בחירת הוכחה",
+ "prices_proof_receipt": "קבלה",
+ "prices_proof_price_tag": "תווית מחיר",
+ "prices_proof_mandatory": "חובה לבחור הוכחה!",
+ "prices_add_validation_error": "שגיאת אימות",
+ "prices_privacy_warning_title": "אזהרת פרטיות",
+ "prices_privacy_warning_message": "המחירים יהיו גלויים לציבור, לצד החנויות שקשורות אליהם.\nכך יכולים אנשים שמכירים את הכינוי שלך ב־Open Food Facts:\n* להסיק מה אזור המגורים שלך\n* לדעת מה בסל הקניות שלך\nאם לא נוח לך לחשוף מידע שכזה, נא לשנות את הכינוי שלך או ליצור חשבון חדש ב־Open Food Facts ולהיכנס אליו ביישומון.",
+ "prices_unknown_product": "מוצר לא ידוע",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "בוצע",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "נתונים",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "להחריג Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "שימוש בחיפוש ועריכתו",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "המחירים שלי",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "ההוכחות שלי",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "מחירי מתנדבים",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "המחירים האחרים שנוספו",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "תורמי המחירים המובילים",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "חנויות עם הכי הרבה מחירים",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "מוצרים עם הכי הרבה מחירים",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "כל המוצרים להשלמה",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "המחיר יישלח לשרת במהירות האפשרית.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "מתחיל רענון של כל המוצרים שמאוחסנים מקומית",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "בחירת המטבע שלך:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "נא לבחור את השפה שלך:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (נוסחה חדשה)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (נוסחה חדשה)",
"nutriscore_unknown": "Nutri-Score לא ידוע",
+ "nutriscore_unknown_new_formula": "Nutri-Score לא ידוע (נוסחה חדשה)",
"nutriscore_not_applicable": "Nutri-Score לא ניתן ליישום",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score לא תקף (נוסחה חדשה)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,12 +2771,13 @@
"faq_title_install_beauty": "אפשר להתקין את Open Beauty Facts כדי ליצור מסד נתונים קוסמטי",
"faq_title_install_pet": "אפשר להתקין את Open Pet Food Facts כדי ליצור מסד נתוני מזון לחיות מחמד",
"faq_title_install_product": "אפשר להתקין את Open Products Facts כדי ליצור מסד נתונים של מוצרים להארכת חיי הפריטים",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "יצרנים? אפשר לייבא את המוצרים שלכם ל־Open Food Facts",
"contact_title_pro_email": "איש קשר ליצרנים",
"contact_title_press_page": "עמוד לעיתונאים",
"contact_title_press_email": "יצירת קשר לעיתונאים",
"contact_title_newsletter": "הרשמה לרשימת התפוצה שלנו",
- "hunger_games_loading_line1": "Please give us a few seconds…",
+ "hunger_games_loading_line1": "נא להמתין מספר שניות…",
"hunger_games_loading_line2": "אנו מורידים את השאלות!",
"hunger_games_error_label": "געוואלד! משהו השתבש… לא הצלחנו לטעון את השאלות.",
"hunger_games_error_retry_button": "מומלץ לנסות שוב!",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "אי אפשר לפתוח את הקישור הזה במכשיר שלך. נא לבדוק שיש לך דפדפן מותקן.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "פרטים על {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "פרטים על {pageName} עם {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "מדריך",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "שיתוף",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Nutri-Score מתפתח: הסברים!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "he",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "מה זה Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "ה־Nutri-Score הוא לוגו שמטרתו ליידע אותך על **האיכות התזונתית של מוצרי המזון**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "קוד הצבע משתנה מירוק כהה (**A**) למוצרים **הבריאים** ביותר ועד אדום כהה (**E**) לאלו **שפחות בריאים**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "הלוגו Nutri-Score A",
+ "guide_nutriscore_v2_why_v2_title": "למה Nutri-Score מתפתח?",
+ "guide_nutriscore_v2_why_v2_intro": "נוסחת Nutri-Score **מתפתחת** כדי לספק המלצות טובות יותר:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "הערכה טובה יותר של משקאות",
+ "guide_nutriscore_v2_why_v2_arg1_text": "הערות ההשוואה של **חלב**, **משקאות חלב** בתוספת סוכר ומשקאות **צמחיים** יהיו ברורים יותר באלגוריתם החדש.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "דירוג טוב יותר של משקאות",
+ "guide_nutriscore_v2_why_v2_arg2_text": "**תכולת הסוכר** תילקח בחשבון בצורה יותר משמעותית ותינתן העדפה למשקאות **פחות ממותקים**.\\n**ענישה לממתיקים מלאכותיים**: משקאות דיאטטים מוגזים שונמכו מדירוג B לאיפשהו בין C ל־E. מים הם עדיין המשקה המומלץ.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "מלח וסוכר נענשים",
+ "guide_nutriscore_v2_why_v2_arg3_text": "מוצרים **מתוקים מדי** או **מלוחים מדי** יזכו **לדירוג נחות עוד יותר**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "היררכיה בתוך שמנים ודגים",
+ "guide_nutriscore_v2_why_v2_arg4_text": "דירוג סוגים מסוימים של **דגים שמנים** ו**שמנים עשירים בשומנים טובים** ישתפר.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "הגבלת בשר אדום",
+ "guide_nutriscore_v2_why_v2_arg5_text": "צריכת **בשר אדום אמורה להיות מוגבלת**. לכן **עוף יזכה לדירוג טוב יותר בהשוואה**.",
+ "guide_nutriscore_v2_new_logo_title": "כיצד להבדיל בין Nutri-Score הישן לבין הנוסחה החדשה?",
+ "guide_nutriscore_v2_new_logo_text": "מעתה, הלוגו יציג אזכור „**נוסחה חדשה**” (New calculation) כדי להבהיר שאכן זו הנוסחה החדשה.",
+ "guide_nutriscore_v2_new_logo_image_caption": "הלוגו של Nutri-Score החדש",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "Nutri-Score מיושם במספר מדינות: גרמניה, בלגיה, ספרד, צרפת, לוקסמבורג, הולנד ושווייץ.",
+ "guide_nutriscore_v2_where_paragraph2": "ליצרנים יש עד **2026** לכל המאוחר **להחליף** את החישוב הישן בחדש.",
+ "guide_nutriscore_v2_where_paragraph3": "מבלי להמתין, כבר אפשר למצוא את הנוסחה החדשה ב**יישומון של Open Food Facts**ֿ גם אם היצרנים טרם עדכנו את הניקוד.",
+ "guide_nutriscore_v2_unchanged_title": "מה לא משתנה",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Nutri-Score הוא ציון שנועד **למדוד איכות תזונתית**. הוא **משלים לקבוצת NOVA** על **מזון אולטרה מעובד** (קיים גם ביישום).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "ליצרנים, התצוגה של Nutri-Score **נותרת בגדר רשות**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_hi.arb b/packages/smooth_app/lib/l10n/app_hi.arb
index 4235aa0e298..a1f35fb3f93 100644
--- a/packages/smooth_app/lib/l10n/app_hi.arb
+++ b/packages/smooth_app/lib/l10n/app_hi.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "एक तस्वीर ले लो",
"take_more_photo_title": "और तस्वीरें लें",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "श्रेणियाँ",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "एक मूल्य जोड़े",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "कीमत",
+ "prices_amount_price_discounted": "छूट की दर",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "सबूत",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "रसीद",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "जानकारी",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "शेयर",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_hr.arb b/packages/smooth_app/lib/l10n/app_hr.arb
index 7c42b22244b..0c4bb37ef9e 100644
--- a/packages/smooth_app/lib/l10n/app_hr.arb
+++ b/packages/smooth_app/lib/l10n/app_hr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Uslikaj",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorije",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Podaci",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ht.arb b/packages/smooth_app/lib/l10n/app_ht.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ht.arb
+++ b/packages/smooth_app/lib/l10n/app_ht.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_hu.arb b/packages/smooth_app/lib/l10n/app_hu.arb
index d3946153c66..9854b5b93cb 100644
--- a/packages/smooth_app/lib/l10n/app_hu.arb
+++ b/packages/smooth_app/lib/l10n/app_hu.arb
@@ -199,7 +199,7 @@
"description": "Forgot password page title"
},
"reset_password_explanation_text": "Elfelejtett jelszó esetén adja meg felhasználónevét vagy e-mail címét, hogy megkapja a jelszó visszaállítására vonatkozó utasításokat. Ne felejtse el ellenőrizni a Spam mappát is.",
- "username_or_email": "Felhasználónév vagy e-mail",
+ "username_or_email": "Felhasználónév vagy e-mail cím",
"@username_or_email": {
"description": "Text field hint for password reset"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Készítsen képet",
"take_more_photo_title": "Készítsen további képeket",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nem található termék",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "nem található:",
- "searchPanelHeader": "Keresse meg vagy szkennelje első termékét",
- "@Product query status": {},
"refreshing_product": "Termék frissítése",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Hálózati hiba miatt nem lehet információkat lekérni erről a termékről.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1070,7 +1145,7 @@
"@product_list_empty_title": {
"description": "When the history list is empty, title of the message explaining to start scanning"
},
- "product_list_empty_message": "Scanned products will appear here and you can check detailed information about them",
+ "product_list_empty_message": "A beolvasott termékek itt fognak megjelenni és megtekintheti a velük kapcsolatos részleteket",
"@product_list_empty_message": {
"description": "When the history list is empty, body of the message explaining to start scanning"
},
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategóriák",
- "edit_ingredients_extrait_ingredients_btn_text": "Összetevők kiolvasása",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1424,7 +1519,7 @@
"@user_list_dialog_new_title": {
"description": "Title of the 'new user list' dialog"
},
- "user_list_dialog_rename_title": "Rename list",
+ "user_list_dialog_rename_title": "Lista átnevezése",
"@user_list_dialog_rename_title": {
"description": "Title of the 'rename user list' dialog"
},
@@ -1594,7 +1689,7 @@
"@dev_preferences_export_history_dialog_title": {
"description": "User dev preferences - Export history - Dialog title"
},
- "dev_preferences_button_positive": "OK",
+ "dev_preferences_button_positive": "Ok",
"@dev_preferences_button_positive": {
"description": "User dev preferences - Positive button label"
},
@@ -1614,7 +1709,7 @@
"dev_preferences_migration_status_already_done": "success or fresh install",
"dev_preferences_migration_status_success": "success",
"dev_preferences_migration_status_error": "error",
- "dev_preferences_migration_status_in_progress": "in progress",
+ "dev_preferences_migration_status_in_progress": "folyamatban",
"dev_preferences_migration_status_required": "required (click to start)",
"dev_preferences_migration_status_not_started": "unknown",
"dev_preferences_import_history_subtitle": "Will clear history and put 3 products in there",
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Kész",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Adatok",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1814,7 +2055,7 @@
}
}
},
- "confirm_delete_user_list_title": "Delete the list?",
+ "confirm_delete_user_list_title": "Törli a listát?",
"@confirm_delete_user_list_title": {
"description": "Title when asking about whether to delete the list or not"
},
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -1986,7 +2231,7 @@
"@paste_from_clipboard": {
"description": "Paste the content of the clipboard"
},
- "no_data_available_in_clipboard": "No data available in your clipboard",
+ "no_data_available_in_clipboard": "Nincs adat a vágólapon",
"@no_data_available_in_clipboard": {
"description": "No data available in your clipboard"
},
@@ -2106,11 +2351,11 @@
"@offline_data": {
"description": "App bar title for the offline data page"
},
- "ocr_image_upload_instruction": "Upload an image to automatically extract the information it contains.",
+ "ocr_image_upload_instruction": "Töltsön fel egy képet, hogy automatikusan kinyerje a benne lévő információt.",
"@ocr_image_upload_instruction": {
"description": "Message shown when there is no image on the OCR extraction page for ingredients or recycling instructions"
},
- "upload_image": "Upload Photo",
+ "upload_image": "Fénykép feltöltése",
"@upload_image": {
"description": "Message shown on asking to upload image"
},
@@ -2243,7 +2488,7 @@
"background_task_subtitle": "Your contributions are automatically saved to our server, but not always in real-time.",
"background_task_list_empty": "No Pending Background Tasks",
"background_task_error_server_time_out": "Server timeout",
- "background_task_error_no_internet": "Internet connection error. Try later.",
+ "background_task_error_no_internet": "Internetkapcsolati hiba. Próbálja újra.",
"background_task_operation_unknown": "unknown operation type",
"background_task_operation_details": "detailed changes",
"background_task_operation_image": "photo upload",
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Megosztás",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_hy.arb b/packages/smooth_app/lib/l10n/app_hy.arb
index bae0260c872..d7770356fdc 100644
--- a/packages/smooth_app/lib/l10n/app_hy.arb
+++ b/packages/smooth_app/lib/l10n/app_hy.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Կիսվել",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_id.arb b/packages/smooth_app/lib/l10n/app_id.arb
index 00746f08879..96d58d02f4d 100644
--- a/packages/smooth_app/lib/l10n/app_id.arb
+++ b/packages/smooth_app/lib/l10n/app_id.arb
@@ -332,7 +332,7 @@
"@legalNotices": {
"description": "A link to open the legal notices on the website"
},
- "privacy_policy": "Privacy policy",
+ "privacy_policy": "Kebijakan privasi",
"@privacy_policy": {
"description": "A link to open the privacy policy on the website"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Ilustrasi untuk Nutri-Score dan Eco-Score yang tidak diketahui",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto depan produk",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Konfirmasi pengunggahan foto depan produk",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto Komposisi",
"nutritional_facts_photo_title": "Foto Informasi Nilai Gizi",
"recycling_photo_title": "Foto daur ulang",
+ "take_photo_title": "Ambil gambar",
"take_more_photo_title": "Ambil lebih banyak foto",
"front_photo_uploaded": "Foto depan diunggah",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Produk tidak ditemukan",
"@no_product_found": {},
+ "no_location_found": "Lokasi tidak ditemukan",
"not_found": "tidak ditemukan:",
- "searchPanelHeader": "Cari atau pindai produk pertama Anda",
- "@Product query status": {},
"refreshing_product": "Muat ulang produk",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Cari produk",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Suka dengan aplikasinya?",
"tagline_app_review_button_positive": "Saya suka sekali! 😍",
"tagline_app_review_button_negative": "Tidak begitu…",
"tagline_app_review_button_later": "Tanya lagi nanti",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Anda tidak menyukai aplikasi kami?",
"app_review_negative_modal_text": "Bisakah Anda meluangkan waktu beberapa detik untuk memberi tahu kami alasannya?",
"app_review_negative_modal_positive_button": "Ya, tentu saja!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Terjadi kesalahan!",
+ "product_internet_error_modal_message": "Kami tidak dapat memperoleh informasi terkait produk ini karena kesalahan jaringan. Silakan periksa koneksi internet Anda dan coba lagi.\n\nKesalahan internal:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Pengambilan informasi tentang produk ini gagal karena kesalahan jaringan.",
"cached_results_from": "Menampilkan hasil dari:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Silahkan pilih mata uang",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Anda baru saja mengganti negara.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Apakah Anda ingin mengganti mata uang dari {previousCurrency} ke {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Silakan pilih negara:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Kami membuat\naplikasi pemindaian\nkolaboratif ini pada tahun 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Saat kami berusia 10 tahun,\nkami menciptakannya lagi\ndari awal!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Selanjutnya",
"onboarding_welcome_loading_dialog_title": "Memuat produk contoh pertama Anda",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Getaran & Haptik",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Lengkapi informasi dasar",
"not_implemented_snackbar_text": "Belum diimplementasi",
"category_picker_page_appbar_text": "Kategori",
- "edit_ingredients_extrait_ingredients_btn_text": "Ekstrak kandungan bahan",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Muat ulang foto",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Kemasan ekstrak",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Muat ulang foto",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Pintasan ke aplikasi Harga di halaman produk",
"prices_app_button": "Buka aplikasi Harga",
+ "prices_generic_title": "Harga",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Tambahkan harga",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produk tidak ditemukan",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Pencarian produk",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "Lihat harga",
+ "prices_list_length_one_page": "{count,plural, =0{Belum ada harga} =1{Hanya satu harga} other{Semua {count} harga}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Harga {pageSize} terbaru (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Jumlah",
+ "prices_amount_is_discounted": "Apakah didiskon?",
+ "prices_amount_price_normal": "Harga",
+ "prices_amount_price_discounted": "Harga sesudah diskon",
+ "prices_amount_price_not_discounted": "Harga asli",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Nilai tidak valid",
+ "prices_amount_price_mandatory": "Nilai wajib",
+ "prices_currency_subtitle": "Mata uang",
+ "prices_date_subtitle": "Tanggal",
+ "prices_location_subtitle": "Toko",
+ "prices_location_find": "Temukan toko",
+ "prices_location_mandatory": "Anda harus memilih toko!",
+ "prices_proof_subtitle": "Bukti",
+ "prices_proof_find": "Pilih bukti",
+ "prices_proof_receipt": "Resi",
+ "prices_proof_price_tag": "Label harga",
+ "prices_proof_mandatory": "Anda harus memilih bukti!",
+ "prices_add_validation_error": "Kesalahan validasi",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Produk tidak diketahui",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Selesai",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Kecualikan Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Gunakan kembali dan sunting pencarian ini",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Harga saya",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Bukti saya",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Semua produk yang akan diselesaikan",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "Harga akan dikirim ke server sesegera mungkin.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Memulai penyegaran semua produk yang disimpan secara lokal",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Pilih mata uang Anda:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Pilih bahasa:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Perhitungan baru)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (Perhitungan baru)",
"nutriscore_unknown": "Nutri-Score tidak diketahui",
+ "nutriscore_unknown_new_formula": "Nutri-Score tidak diketahui (Perhitungan baru)",
"nutriscore_not_applicable": "Nutri-Score tidak dapat diterapkan",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score tidak bisa diterapkan (Perhitungan baru)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Instal Open Beauty Facts untuk membuat basis data kosmetik",
"faq_title_install_pet": "Instal Open Pet Food Facts untuk membuat basis data makanan hewan peliharaan",
"faq_title_install_product": "Instal Open Products Facts untuk membuat basis data produk guna memperpanjang masa pakai objek",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Impor produk Anda di Open Food Facts",
"contact_title_pro_email": "Kontak Produser",
"contact_title_press_page": "Halaman Pers",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Tautan ini tidak dapat dibuka di perangkat Anda. Pastikan Anda telah menginstal browser.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Rincian untuk {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Rincian untuk {pageName} dengan {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Panduan",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Bagikan",
+ "guide_nutriscore_v2_enabled": "benar",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Nutri-Score terus berkembang: penjelasan!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Apa itu Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Nutri-Score merupakan sebuah logo yang bertujuan untuk memberikan informasi kepada Anda tentang **kualitas nutrisi makanan**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Kode warna bervariasi mulai dari hijau tua (**A**) untuk produk **tersehat** hingga merah tua (**E**) untuk produk *kurang sehat**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Logo Nutri-Score A",
+ "guide_nutriscore_v2_why_v2_title": "Mengapa Nutri-Score terus berkembang?",
+ "guide_nutriscore_v2_why_v2_intro": "Formula Nutri-Score **berkembang** agar bisa memberikan rekomendasi yang lebih baik:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Lebih baik dalam mengevaluasi semua minuman",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Catatan perbandingan antara **susu**, **minuman susu* dengan gula tambahan, dan minuman berbasis **sayuran** dibedakan secara lebih baik dengan algoritma baru.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Pemeringkatan minuman lebih baik",
+ "guide_nutriscore_v2_why_v2_arg2_text": "**Kandungan gula** diperhitungan dengan lebih baik dan mengutamakan minuman **rendah pemanis**. \\n**Pemanis juga akan dikenakan sanksi**: soda diet akan diturunkan peringkatnya dari B ke antara C dan E. Air tetap minuman yang direkomendasikan.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Garam dan gula dikenai sanksi",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Produk yang **terlalu manis** atau **terlalu asin** akan makin mengalami *penurunan peringkat**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarki minyak dan ikan",
+ "guide_nutriscore_v2_why_v2_arg4_text": "Peringkat **ikan berlemak** tertentu dan **minyak kaya lemak baik** akan diperbaiki.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Pembatasan daging merah",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Konsumsi **daging merah sebaiknya dibatasi**. Oleh karena itu, **unggas akan diberi peringkat yang relatif lebih baik**.",
+ "guide_nutriscore_v2_new_logo_title": "Bagaimana membedakan perhitungan Nutri-Score lama dan baru?",
+ "guide_nutriscore_v2_new_logo_text": "Mulai saat ini, logo dapat menampilkan penyebutan \"**Perhitungan baru**\" untuk memperjelas bahwa ini merupakan perhitungan baru.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Logo baru Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "Nutri-Score diterapkan di beberapa negara: Jerman, Belgia, Spanyol, Prancis, Luksemburg, Belanda, dan Swiss.",
+ "guide_nutriscore_v2_where_paragraph2": "Produsen memiliki waktu paling lambat hingga **2026** **untuk mengganti** perhitungan lama dengan yang baru.",
+ "guide_nutriscore_v2_where_paragraph3": "Tanpa perlu menunggu, Anda **akan langsung menemukan di dalam aplikasi OpenFoodFacts**, perhitungan baru, termasuk jika produsen belum memperbarui skor.",
+ "guide_nutriscore_v2_unchanged_title": "Apa yang tidak berubah",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Nutri-Score merupakan skor yang dirancang untuk **mengukur kualitas nutrisi**. Ini **melengkapi klasifikasi grup NOVA** untuk **makanan ultra proses** (yang juga ada di dalam aplikasi).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Bagi produsen, tampilan Nutri-Score **tetap opsional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ii.arb b/packages/smooth_app/lib/l10n/app_ii.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ii.arb
+++ b/packages/smooth_app/lib/l10n/app_ii.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_is.arb b/packages/smooth_app/lib/l10n/app_is.arb
index 1683fc34477..9fe368ece44 100644
--- a/packages/smooth_app/lib/l10n/app_is.arb
+++ b/packages/smooth_app/lib/l10n/app_is.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_it.arb b/packages/smooth_app/lib/l10n/app_it.arb
index 6ea7a98ca48..2492bb195b3 100644
--- a/packages/smooth_app/lib/l10n/app_it.arb
+++ b/packages/smooth_app/lib/l10n/app_it.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Un'illustrazione con Nutri-Score e Eco-Score sconosciuti",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto frontale del prodotto",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Conferma il caricamento della foto frontale del Prodotto",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto degli Ingredienti",
"nutritional_facts_photo_title": "Foto valori nutrizionali",
"recycling_photo_title": "Foto delle istruzioni di riciclaggio",
+ "take_photo_title": "Scatta una foto",
"take_more_photo_title": "Scatta più foto",
"front_photo_uploaded": "Foto frontale caricata",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nessun prodotto trovato",
"@no_product_found": {},
+ "no_location_found": "Nessuna posizione individuata",
"not_found": "non trovato:",
- "searchPanelHeader": "Cerca o scansiona il tuo primo prodotto",
- "@Product query status": {},
"refreshing_product": "Aggiornamento prodotto",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Immagine acquisita in data {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Immagine acquisita in data {date}. Questa immagine potrebbe essere obsoleta",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Benvenuti in Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scansiona** un codice a barre o\n**cerca** un prodotto",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Cerca un prodotto",
+ "homepage_main_card_search_field_tooltip": "Inizia la ricerca",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Ti piace l'app?",
"tagline_app_review_button_positive": "La adoro! 😍",
"tagline_app_review_button_negative": "Non proprio…",
"tagline_app_review_button_later": "Chiedimelo più tardi",
+ "tagline_feed_news_button": "Scopri di più",
"app_review_negative_modal_title": "Non ti piace la nostra app?",
"app_review_negative_modal_text": "Potrebbe dedicarci qualche secondo per dirci perché?",
"app_review_negative_modal_positive_button": "Sì, assolutamente!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Si è verificato un errore!",
+ "product_internet_error_modal_message": "Non siamo in grado di recuperare informazioni su questo prodotto a causa di un errore di rete. Controlla la tua connessione internet e riprova.\n\nErrore interno:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossibile recuperare le informazioni su questo prodotto a causa di un errore di rete.",
"cached_results_from": "Mostra i risultati da:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Scegli una valuta",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Hai appena cambiato Paese.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Vuoi cambiare la valuta da {previousCurrency} a {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Ti preghiamo di scegliere un paese:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -897,11 +974,11 @@
"count": {}
}
},
- "compare_products_mode": "Compara prodotti",
+ "compare_products_mode": "Compara i prodotti",
"@compare_products_mode": {
"description": "Button to switch to 'compare products mode'"
},
- "compare_products_appbar_title": "Compara prodotti",
+ "compare_products_appbar_title": "Compara i prodotti",
"@compare_products_appbar_title": {
"description": "AppBar title when in comparison mode "
},
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Abbiamo inventato\nl'app di scansione collaborativa\nnel 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Mentre giriamo 10,\nlo stiamo reinventando\nda zero!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Benvenuto !",
+ "onboarding_home_welcome_text2": "L'app che ti aiuta a scegliere il cibo che fa bene a **te** e al **pianeta**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continua",
"onboarding_welcome_loading_dialog_title": "Caricamento del tuo primo prodotto d'esempio",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibrazione e Tatto",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Completa i dettagli di base",
"not_implemented_snackbar_text": "Non ancora implementato",
"category_picker_page_appbar_text": "Categorie",
- "edit_ingredients_extrait_ingredients_btn_text": "Estrai ingredienti",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Estrai gli ingredienti dalla foto",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Estrazione degli ingredienti\ndalla foto",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Caricamento della foto…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Aggiorna foto",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Estrarre la confezione",
+ "edit_packaging_extract_btn_text": "Estrai la confezione\ndalla foto",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Estrazione della confezione dalla foto",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Caricamento della foto…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Aggiorna foto",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Collegamento all'app Prezzi sulla pagina del prodotto",
"prices_app_button": "Vai all'app Prezzi",
+ "prices_generic_title": "Prezzi",
+ "prices_add_n_prices": "{count,plural, one {}=1{Aggiungi un prezzo} other{Aggiungi {count} prezzi}}",
+ "prices_send_n_prices": "{count,plural, =1{Invia il prezzo} other{Invia {count} prezzi}}",
+ "prices_add_an_item": "Aggiungi un elemento",
+ "prices_add_a_price": "Aggiungi un prezzo",
+ "prices_add_a_receipt": "Aggiungi una ricevuta",
+ "prices_add_price_tags": "Aggiungi prezzi",
+ "prices_barcode_search_not_found": "Prodotto non trovato",
+ "prices_barcode_search_none_yet": "Ancora nessun prodotto",
+ "prices_barcode_search_question": "Vuoi cercare questo prodotto?",
+ "prices_barcode_search_title": "Ricerca prodotti",
+ "prices_barcode_search_running": "Ricerca del codice a barre {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Lettore del codice a barre",
+ "prices_view_prices": "Guarda i prezzi",
+ "prices_list_length_one_page": "{count,plural, =0{Ancora nessun prezzo} =1{Solo un prezzo} other{Tutti e {count} i prezzi}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Ultimi {pageSize} prezzi (totale: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{Ancora nessuna prova} =1{Solo una prova} other{Tutte e {count} le prove}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Ultime {pageSize} prove (totale: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Principali {pageSize} contributori (totali: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Quantità",
+ "prices_amount_is_discounted": "È scontato?",
+ "prices_amount_price_normal": "Prezzo",
+ "prices_amount_price_discounted": "Prezzo scontato",
+ "prices_amount_price_not_discounted": "Prezzo originale",
+ "prices_amount_no_product": "Manca un prodotto!",
+ "prices_amount_price_incorrect": "Valore non corretto",
+ "prices_amount_price_mandatory": "Valore obbligatorio",
+ "prices_currency_subtitle": "Moneta",
+ "prices_date_subtitle": "Data",
+ "prices_location_subtitle": "Negozio",
+ "prices_location_find": "Trova un negozio",
+ "prices_location_mandatory": "Devi selezionare un negozio!",
+ "prices_proof_subtitle": "Prova",
+ "prices_proof_find": "Seleziona una prova",
+ "prices_proof_receipt": "Ricevuta",
+ "prices_proof_price_tag": "Etichetta del prezzo",
+ "prices_proof_mandatory": "Devi selezionare una prova!",
+ "prices_add_validation_error": "Errore di validazione",
+ "prices_privacy_warning_title": "Avviso sulla privacy",
+ "prices_privacy_warning_message": "I prezzi saranno pubblici, insieme al negozio a cui si riferiscono.\nQuesto potrebbe permettere alle persone che conoscono il tuo pseudonimo di Open Food Facts di:\n* dedurre in quale zona vivi\n* sapere cosa stai comprando\nSe ti senti a disagio con ciò, cambia il tuo pseudonimo, oppure crea un nuovo account di Open Food Facts e accedi all'app con esso.",
+ "prices_unknown_product": "Prodotto sconosciuto",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Fatto",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Configurazione del server",
+ "dev_mode_section_product_page": "Pagina del prodotto",
+ "dev_mode_section_ui": "Interfaccia utente",
+ "dev_mode_section_data": "Dati",
+ "dev_mode_section_experimental_features": "Funzionalità sperimentali",
"dev_mode_hide_ecoscore_title": "Escludi Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Riutilzza e modifica questa ricerca",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,11 +1891,43 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "I miei prezzi",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Le mie prove",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "La mia prova",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Prezzi dei contributori",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Ultimi prezzi aggiunti",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Collaboratori principali prezzi",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Negozi con più prezzi",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Prodotti con più prezzi",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Tutti i prodotti da completare",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
},
- "categorize_products_country_title": "Help categorize products in your country",
+ "categorize_products_country_title": "Aiuta a categorizzare i prodotti nel tuo paese",
"@categorize_products_country_title": {
"description": "Help categorize products in your country: list tile title"
},
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "Il prezzo verrà inviato al server il prima possibile.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Avviando il ricaricamento di tutti i prodotti memorizzati localmente",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Seleziona la tua valuta:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Seleziona la tua lingua:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Nuovo calcolo)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (Nuovo calcolo)",
"nutriscore_unknown": "Nutri-Score Sconosciuto",
+ "nutriscore_unknown_new_formula": "Nutri-Score sconosciuto (Nuovo calcolo)",
"nutriscore_not_applicable": "Nutri-Score non applicabile",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score non è applicabile (Nuovo calcolo)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Installa Open Beauty Facts per creare un database cosmetico",
"faq_title_install_pet": "Installa Open Pet Food Facts per creare un database di alimenti per animali domestici",
"faq_title_install_product": "Installa Open Products Facts per creare un database di prodotti per prolungare la vita degli oggetti",
+ "faq_nutriscore_nutriscore": "Nuovo calcolo del Nutri-Score: cosa c'è di nuovo?",
"contact_title_pro_page": "Pro? Importa i tuoi prodotti in Open Food Facts",
"contact_title_pro_email": "Contatto Produttore",
"contact_title_press_page": "Pagina ufficio stampa",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Questo collegamento non può essere aperto sul tuo dispositivo. Verifica di avere un browser installato.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Dettagli per {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Dettagli per {pageName} con {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guida",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Condividi",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Il Nutri-Score è in evoluzione: spiegazioni!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "it",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Cos'è il Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Il Nutri-Score è un logo che ha lo scopo d'informarti sulla **qualità nutrizionale degli alimenti**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Il codice colore varia dal verde scuro (**A**) per i prodotti **più salutari** al rosso scuro (**E**) per quelli **meno salutari**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Il logo A del Nutri-Score",
+ "guide_nutriscore_v2_why_v2_title": "Perché il Nutri-Score si sta evolvendo?",
+ "guide_nutriscore_v2_why_v2_intro": "La formula del Nutri-Score **sta evolvendo** per fornire raccomandazioni migliori:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Valutazione migliore di tutte le bevande",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Le note comparative di **latte**, **bevande lattiero-casearie** con zucchero aggiunto e **bevande vegetali** sono stati meglio differenziate nel nuovo algoritmo.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Migliore classificazione delle bevande",
+ "guide_nutriscore_v2_why_v2_arg2_text": "Il **contenuto di zucchero** viene meglio preso in considerazione e favorisce le bevande **poco zuccherate**.\\n**I dolcificanti verranno anch'essi penalizzati**: le bibite dietetiche passeranno da un punteggio B a uno compreso tra C ed E. L'acqua rimane la bevanda consigliata.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Il sale e lo zucchero penalizzati",
+ "guide_nutriscore_v2_why_v2_arg3_text": "I prodotti **troppo dolci** o **troppo salati** vedranno la loro **valutazione ulteriormente declassata**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "La gerarchia negli oli e nei pesci",
+ "guide_nutriscore_v2_why_v2_arg4_text": "La valutazione di alcuni **pesci grassi** e **oli ricchi in grassi buoni** migliorerà.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limita la carne rossa",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Il consumo di **carne rossa dovrebbe essere limitato**. Ecco perché il **pollame sarà classificato relativamente meglio**.",
+ "guide_nutriscore_v2_new_logo_title": "Come distinguere tra il vecchio e il nuovo calcolo del Nutri-Score?",
+ "guide_nutriscore_v2_new_logo_text": "D'ora in poi, il logo può mostrare la dicitura \"**Nuovo calcolo**\" per chiarire che si tratta effettivamente del nuovo calcolo.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Il logo del nuovo Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Dove trovare il nuovo calcolo del Nutri-Score?",
+ "guide_nutriscore_v2_where_paragraph1": "Il Nutri-Score è in uso in diversi Paesi: Germania, Belgio, Spagna, Francia, Lussemburgo, Paesi Bassi e Svizzera.",
+ "guide_nutriscore_v2_where_paragraph2": "I produttori hanno tempo al massimo fino al **2026** **per sostituire** il vecchio calcolo con quello nuovo.",
+ "guide_nutriscore_v2_where_paragraph3": "Senza dover aspettare, **troverai già nell'applicazione OpenFoodFacts**, il nuovo calcolo, anche se i produttori non hanno aggiornato il punteggio.",
+ "guide_nutriscore_v2_unchanged_title": "Cosa non cambia",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Il Nutri-Score è un punteggio progettato per **misurare la qualità nutrizionale**. È **complementare al gruppo NOVA** sugli **alimenti ultra-trasformati** (anch'esso presente nell'applicazione).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Per i produttori, l'esposizione del Nutri-Score **rimane facoltativa**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Anteprima",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_iu.arb b/packages/smooth_app/lib/l10n/app_iu.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_iu.arb
+++ b/packages/smooth_app/lib/l10n/app_iu.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ja.arb b/packages/smooth_app/lib/l10n/app_ja.arb
index 47eb2a285bc..1bfa02af466 100644
--- a/packages/smooth_app/lib/l10n/app_ja.arb
+++ b/packages/smooth_app/lib/l10n/app_ja.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "製品の正面画像",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "製品の正面画像のアップロードを確認する",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "原材料の画像",
"nutritional_facts_photo_title": "栄養成分表の画像",
"recycling_photo_title": "リサイクル情報の画像",
+ "take_photo_title": "画像を撮る",
"take_more_photo_title": "もっと写真を撮ります",
"front_photo_uploaded": "正面の画像をアップロードしました",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "製品が見つかりません",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "見つかりません:",
- "searchPanelHeader": "最初の製品を検索またはスキャン",
- "@Product query status": {},
"refreshing_product": "製品を更新中",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "商品を検索",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "アプリを気に入っていただけましたか?",
"tagline_app_review_button_positive": "大好きです! 😍",
"tagline_app_review_button_negative": "そうでもないんですが...",
"tagline_app_review_button_later": "あとで",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "このアプリを気に入っていますか?",
"app_review_negative_modal_text": "その理由を少し教えていただけますか?",
"app_review_negative_modal_positive_button": "そのとおり!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "ネットワークエラーのため、この製品に関する情報を取得できません。",
"cached_results_from": "結果の最終更新:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "通貨を選んでください",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "国を変更しました。",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "通貨を {previousCurrency} から {possibleCurrency} に変更しますか?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "国を選択してください",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "2012年に\n協同スキャンアプリを\n開発しました",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "10周年に合わせて\n一からアプリを\n再開発しています!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "続ける",
"onboarding_welcome_loading_dialog_title": "最初の見本となる製品を読み込んでいます",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "振動と触覚フィードバック",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "基本情報を完成させる",
"not_implemented_snackbar_text": "まだ実装されていません",
"category_picker_page_appbar_text": "カテゴリー",
- "edit_ingredients_extrait_ingredients_btn_text": "原材料を抽出",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "画像を更新",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "パッケージ情報を抽出",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "画像を更新",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "製品ページの価格アプリへのショートカット",
"prices_app_button": "価格アプリに移動",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "割引価格",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "領収書",
+ "prices_proof_price_tag": "値札",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "完了",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "サーバー設定",
+ "dev_mode_section_product_page": "製品ページ",
+ "dev_mode_section_ui": "ユーザインタフェース",
+ "dev_mode_section_data": "データ",
+ "dev_mode_section_experimental_features": "試験的な機能",
"dev_mode_hide_ecoscore_title": "Eco-Scoreを無効にする",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "この検索を再利用して編集する",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "私の価格",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "自分の証拠",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "すべての未完成の製品",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "ローカルに保存されているすべての製品の更新を開始します",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "通貨を選択してください。",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "言語を選択してください:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "ニュートリスコア {letter} (新しい計算)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "ニュートリスコア(新しい計算)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "未知の栄養スコア(新しい計算)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "ニュートリスコアは適用されません(新しい計算)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Open Beauty Facts をインストールして化粧品データベースを作成する",
"faq_title_install_pet": "Open Pet Food Facts をインストールしてペットフード データベースを作成する",
"faq_title_install_product": "Open Products Facts をインストールして製品データベースを作成し、オブジェクトの寿命を延ばす",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "プロ? Open Food Facts に製品をインポートします",
"contact_title_pro_email": "プロデューサー連絡先",
"contact_title_press_page": "プレスページ",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "このリンクは、お使いのデバイスでは開けません。ブラウザがインストールされていることを確認してください。",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "共有",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "プレビュー",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_jv.arb b/packages/smooth_app/lib/l10n/app_jv.arb
index 268deed37fb..6c4b65f2656 100644
--- a/packages/smooth_app/lib/l10n/app_jv.arb
+++ b/packages/smooth_app/lib/l10n/app_jv.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ka.arb b/packages/smooth_app/lib/l10n/app_ka.arb
index 973715bf98e..f1dc68c9413 100644
--- a/packages/smooth_app/lib/l10n/app_ka.arb
+++ b/packages/smooth_app/lib/l10n/app_ka.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "მონაცემები",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_kk.arb b/packages/smooth_app/lib/l10n/app_kk.arb
index 49adbb8707e..31602b9438c 100644
--- a/packages/smooth_app/lib/l10n/app_kk.arb
+++ b/packages/smooth_app/lib/l10n/app_kk.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Суретке түсіру",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Санаттар",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Деректер",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Бөлісу",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_km.arb b/packages/smooth_app/lib/l10n/app_km.arb
index 3f2c95108bc..781be4d126e 100644
--- a/packages/smooth_app/lib/l10n/app_km.arb
+++ b/packages/smooth_app/lib/l10n/app_km.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "ចែករំលែក",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_kn.arb b/packages/smooth_app/lib/l10n/app_kn.arb
index 5388053c9b7..e6acc91c335 100644
--- a/packages/smooth_app/lib/l10n/app_kn.arb
+++ b/packages/smooth_app/lib/l10n/app_kn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "ಇನ್ನಷ್ಟು ಚಿತ್ರಗಳನ್ನು ತೆಗೆದುಕೊಳ್ಳಿ",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "ವರ್ಗಗಳು",
- "edit_ingredients_extrait_ingredients_btn_text": "ಪದಾರ್ಥಗಳನ್ನು ಹೊರತೆಗೆಯಿರಿ",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "ಹಂಚಿಕೊಳ್ಳಿ",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ko.arb b/packages/smooth_app/lib/l10n/app_ko.arb
index 57387c14f3d..c0f68d34417 100644
--- a/packages/smooth_app/lib/l10n/app_ko.arb
+++ b/packages/smooth_app/lib/l10n/app_ko.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "상품 전면 사진",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "상품 전면 사진 업로드 확인",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "재료 사진",
"nutritional_facts_photo_title": "영양 성분 사진",
"recycling_photo_title": "재활용 사진",
+ "take_photo_title": "사진을 촬영",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "전면 사진 갱신됨",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "상품 없음",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "찾을 수 없음:",
- "searchPanelHeader": "첫 상품을 검색하거나 스캔",
- "@Product query status": {},
"refreshing_product": "상품 새로고치는 중...",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "이 앱이 마음에 드시나요?",
"tagline_app_review_button_positive": "최고에요! 😍",
"tagline_app_review_button_negative": "별로...",
"tagline_app_review_button_later": "나중에 물어봐 주세요",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "저희 앱이 맘에 안드세요?",
"app_review_negative_modal_text": "잠시 시간을 내어 이유를 말씀해 주실래요?",
"app_review_negative_modal_positive_button": "예, 물론입니다!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "네트워크 오류로 인해 이 제품에 대한 정보를 가져올 수 없습니다.",
"cached_results_from": "결과 보기:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "2012년에\n협업을 위한\n스캔 앱을 개발했습니다",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "10년이 되어감에 따라,\n스캔 앱을 처음부터\n다시 개발해나가고 있습니다!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "계속하기",
"onboarding_welcome_loading_dialog_title": "첫 예시 상품 불러오는 중",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "진동 및 햅틱",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "기본 세부 정보 완성",
"not_implemented_snackbar_text": "아직 구현되지 않았어요",
"category_picker_page_appbar_text": "카테고리",
- "edit_ingredients_extrait_ingredients_btn_text": "성분 추출",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "사진 새로고침",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "포장 사진에서 추출",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "사진 새로고침",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "완료",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "데이터",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "EcoScore 제외",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "모든 미완성 상품",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "친환경 점수",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "공유하기",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "영어",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ku.arb b/packages/smooth_app/lib/l10n/app_ku.arb
index fa965d7d2b1..22cdd3a1ecb 100644
--- a/packages/smooth_app/lib/l10n/app_ku.arb
+++ b/packages/smooth_app/lib/l10n/app_ku.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Bigire a resma",
"take_more_photo_title": "Zev resma bışıkının",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Vebir",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dane",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Re",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_kw.arb b/packages/smooth_app/lib/l10n/app_kw.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_kw.arb
+++ b/packages/smooth_app/lib/l10n/app_kw.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ky.arb b/packages/smooth_app/lib/l10n/app_ky.arb
index cf031173fe2..e25dd64a1fc 100644
--- a/packages/smooth_app/lib/l10n/app_ky.arb
+++ b/packages/smooth_app/lib/l10n/app_ky.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Бөлүшүү",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_la.arb b/packages/smooth_app/lib/l10n/app_la.arb
index b3a8b801738..46f1db800b4 100644
--- a/packages/smooth_app/lib/l10n/app_la.arb
+++ b/packages/smooth_app/lib/l10n/app_la.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_lb.arb b/packages/smooth_app/lib/l10n/app_lb.arb
index ef1d17a9e2a..ccb380f1be2 100644
--- a/packages/smooth_app/lib/l10n/app_lb.arb
+++ b/packages/smooth_app/lib/l10n/app_lb.arb
@@ -4,7 +4,7 @@
"@sep": {
"description": "Separator just before a colon (':'). Probably only populated in French and empty in other languages."
},
- "yes": "Yes",
+ "yes": "Jo",
"@yes": {},
"add": "Bäifügen",
"@add": {},
@@ -31,7 +31,7 @@
"go_back_to_top": "Go back to top",
"save": "Save",
"save_confirmation": "Are you sure you want to save?",
- "skip": "Skip",
+ "skip": "Iwwersprangen",
"cancel": "Cancel",
"@cancel": {},
"ignore": "Ignore",
@@ -40,7 +40,7 @@
},
"close": "Close",
"@close": {},
- "no": "No",
+ "no": "Nee",
"@no": {},
"stop": "Stop",
"@stop": {},
@@ -443,7 +443,7 @@
"@myPersonalizedRanking": {
"description": "When you press this button, all products (in list or category) are sorted according to your preferences."
},
- "ranking_tab_all": "All",
+ "ranking_tab_all": "Alles",
"ranking_subtitle_match_yes": "A great match for you",
"ranking_subtitle_match_no": "Very poor match",
"ranking_subtitle_match_maybe": "Unknown match",
@@ -476,7 +476,7 @@
"@category": {
"description": "From a product list, there's a category filter: this is its title"
},
- "category_all": "All",
+ "category_all": "Alles",
"@category_al": {
"description": "Top meta-entry on a category filter"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Eng Foto maachen",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,18 +750,69 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
- "app_review_negative_modal_negative_button": "No",
+ "app_review_negative_modal_negative_button": "Nee",
"could_not_refresh": "Could not refresh product",
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1267,11 +1346,11 @@
"@edit_product_form_item_labels_subtitle": {
"description": "Product edition - Labels - SubTitle"
},
- "edit_product_form_item_labels_hint": "label",
+ "edit_product_form_item_labels_hint": "Etikett",
"@edit_product_form_item_labels_hint": {
"description": "Product edition - Labels - input textfield hint"
},
- "edit_product_form_item_labels_type": "label",
+ "edit_product_form_item_labels_type": "Etikett",
"@edit_product_form_item_labels_type": {
"description": "Product edition - Labels - input textfield label"
},
@@ -1307,7 +1386,7 @@
"@edit_product_form_item_origins_explainer_2": {
"description": "Product edition - Origins - input explainer, part 2"
},
- "edit_product_form_item_countries_title": "Country",
+ "edit_product_form_item_countries_title": "Land",
"@edit_product_form_item_countries_title": {
"description": "Product edition - Countries - Title"
},
@@ -1385,7 +1464,7 @@
"@edit_product_form_item_nutrition_facts_subtitle": {
"description": "Product edition - Nutrition facts - SubTitle"
},
- "edit_product_form_save": "Edit",
+ "edit_product_form_save": "Änneren",
"@edit_product_form_save": {
"description": "Product edition - Nutrition facts - Save button"
},
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorien",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Daten",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1736,7 +1977,7 @@
"@summary_card_button_add_basic_details": {
"description": "Summary card - Button to add details about the product"
},
- "edit_photo_button_label": "Edit",
+ "edit_photo_button_label": "Änneren",
"@edit_photo_button_label": {
"description": "Edit photo button label"
},
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_lo.arb b/packages/smooth_app/lib/l10n/app_lo.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_lo.arb
+++ b/packages/smooth_app/lib/l10n/app_lo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_lt.arb b/packages/smooth_app/lib/l10n/app_lt.arb
index e251a1772de..bb1e3be0bcf 100644
--- a/packages/smooth_app/lib/l10n/app_lt.arb
+++ b/packages/smooth_app/lib/l10n/app_lt.arb
@@ -68,15 +68,15 @@
"@unknown": {
"description": "Short label for product list view: the compatibility of that product with your preferences is unknown"
},
- "match_very_good": "Labai geras atitikimas",
+ "match_very_good": "Puikus atitikmuo",
"@match_very_good": {
"description": "Label for product page regarding product compatibility with the user preferences: very good match"
},
- "match_good": "Geras atitikimas",
+ "match_good": "Geras atitikmuo",
"@match_good": {
"description": "Label for product page regarding product compatibility with the user preferences: good match"
},
- "match_poor": "Blogas atitikimas",
+ "match_poor": "Prastas atitikmuo",
"@match_poor": {
"description": "Label for product page regarding product compatibility with the user preferences: poor match"
},
@@ -88,19 +88,19 @@
"@match_does_not": {
"description": "Label for product page regarding product compatibility with the user preferences: does not match"
},
- "match_unknown": "Nežinomas pasirinkimas",
+ "match_unknown": "Nežinomas atitikmuo",
"@match_unknown": {
"description": "Label for product page regarding product compatibility with the user preferences: unknown match"
},
- "match_short_very_good": "Labai geras atitikimas",
+ "match_short_very_good": "Puikus atitikmuo",
"@match_short_very_good": {
"description": "Short label for product list view regarding product compatibility with the user preferences: very good match"
},
- "match_short_good": "Geras atitikimas",
+ "match_short_good": "Geras atitikmuo",
"@match_short_good": {
"description": "Short label for product list view regarding product compatibility with the user preferences: good match"
},
- "match_short_poor": "Blogas atitikimas",
+ "match_short_poor": "Prastas atitikmuo",
"@match_short_poor": {
"description": "Short label for product list view regarding product compatibility with the user preferences: poor match"
},
@@ -112,7 +112,7 @@
"@match_short_does_not": {
"description": "Short label for product list view regarding product compatibility with the user preferences: does not match"
},
- "match_short_unknown": "Nežinomas pasirinkimas",
+ "match_short_unknown": "Nežinomas atitikmuo",
"@match_short_unknown": {
"description": "Short label for product list view regarding product compatibility with the user preferences: unknown match"
},
@@ -125,7 +125,7 @@
"@Introduction screen": {},
"welcomeToOpenFoodFacts": "Sveiki atvykę į Open Food Facts",
"@welcomeToOpenFoodFacts": {},
- "whatIsOff": "Open Food Facts is a global non-profit powered by local communities.",
+ "whatIsOff": "„Open Food Facts“ yra pasaulinė ne pelno siekianti organizacija, kurios veiklą skatina vietos bendruomenės.",
"@whatIsOff": {
"description": "Description of Open Food Facts organization."
},
@@ -145,11 +145,11 @@
"@ecoCardUtility": {
"description": "Description of what a user can use the Eco data in a product for."
},
- "server_error_open_new_issue": "No server response! You may open an issue with the following link.",
+ "server_error_open_new_issue": "Serveris nepasiekimas! Galite iškelti problemą naudodami šią nuorodą.",
"@user_management": {},
- "sign_in_text": "Sign in to your Open Food Facts account to save your contributions",
+ "sign_in_text": "Prisijunkite prie „Open Food Facts“ paskyros, kad jūsų įneštas savanoriškas indėlis būtų išsaugotas",
"incorrect_credentials": "Neteisingas prisijungimo vardas arba slaptažodis.",
- "password_lost_incorrect_credentials": "This email or username doesn't exist. Please check your credentials.",
+ "password_lost_incorrect_credentials": "Šis el. pašto adresas arba naudotojo vardas neegzistuoja. Patikrinkite savo prisijungimo duomenis.",
"password_lost_server_unavailable": "We are currently experiencing slowdowns on our servers and we apologise for it. Please try again later.",
"login": "Prisijungti",
"@login": {
@@ -297,7 +297,7 @@
"@darkmode_system_default": {
"description": "Indicator inside the darkmode switch (system default)"
},
- "thanks_for_contributing": "Thanks for contributing!",
+ "thanks_for_contributing": "Ačiū, kad prisidėjote!",
"contributors_label": "Jie kuria programėlę",
"@contributors_label": {
"description": "Button label: Opens a pop up window where all contributors of this app are shown"
@@ -332,7 +332,7 @@
"@legalNotices": {
"description": "A link to open the legal notices on the website"
},
- "privacy_policy": "Privacy policy",
+ "privacy_policy": "Privatumo politika",
"@privacy_policy": {
"description": "A link to open the privacy policy on the website"
},
@@ -349,7 +349,7 @@
"@contribute_sw_development": {
"description": "Button label + page title: Ways to help"
},
- "contribute_develop_text": "The code for every Open Food Facts product is available on GitHub. You are welcome to reuse the code (it's open source) and help us improve it, for everyone, on all the planet.",
+ "contribute_develop_text": "Kiekvieno „Open Food Facts“ produkto kodą galite rasti „GitHub“. Kviečiame pakartotinai naudoti kodą (jis yra atvirojo kodo) ir padėti mums jį tobulinti visiems, visoje planetoje.",
"@contribute_develop_text": {},
"contribute_develop_text_2": "You can join the Open Food Facts Slack chatroom which is the preferred way to ask questions.",
"@contribute_develop_text_2": {},
@@ -429,7 +429,7 @@
"description": "Join which is actually Signup"
},
"myPreferences_profile_title": "Jūsų profilis",
- "myPreferences_profile_subtitle": "Manage your Open Food Facts contributor account.",
+ "myPreferences_profile_subtitle": "Tvarkykite savo „Open Food Facts“ paskyrą.",
"myPreferences_settings_title": "Programos nustatymai",
"myPreferences_settings_subtitle": "Tamsusis režimas; Analizė…",
"myPreferences_food_title": "Maisto pasirinkimai",
@@ -445,8 +445,8 @@
},
"ranking_tab_all": "Visi",
"ranking_subtitle_match_yes": "Puikus pasirinkimas jums",
- "ranking_subtitle_match_no": "Labai prastas pasirinkimas",
- "ranking_subtitle_match_maybe": "Nežinomas pasirinkimas",
+ "ranking_subtitle_match_no": "Itin prastas atitikmuo",
+ "ranking_subtitle_match_maybe": "Nežinomas atitikmuo",
"refresh_with_new_preferences": "Atnaujinkite sąrašą naudodami naujas nuostatas",
"@refresh_with_new_preferences": {
"description": "Action button label: Refresh the list with your new preferences"
@@ -554,7 +554,7 @@
"@new_product_dialog_title": {
"description": "Please keep it short, like 50 characters. Title of the dialog when the user searched for an unknown barcode."
},
- "new_product_leave_title": "Leave this page?",
+ "new_product_leave_title": "Palikti šį puslapį?",
"@new_product_leave_title": {
"description": "Alert dialog title when a user landed on the 'add new product' page, didn't input anything and tried to leave the page."
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Produkto priekinė nuotrauka",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Patvirtinkite gaminio priekinės nuotraukos įkėlimą",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Sudėties Nuotrauka",
"nutritional_facts_photo_title": "Maistingumo duomenų nuotrauka",
"recycling_photo_title": "Perdirbimo Nuotrauka",
+ "take_photo_title": "Fotografuoti",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Priekinė nuotrauka įkelta",
"@front_photo_uploaded": {},
@@ -674,7 +679,7 @@
"@take_more_photo_button_label": {},
"other_photo_uploaded": "Įkelta įvairi nuotrauka",
"@other_photo_uploaded": {},
- "retake_photo_button_label": "Retake",
+ "retake_photo_button_label": "Pakartoti",
"@retake_photo_button_label": {
"description": "Button clicking on which allows users to retake the last photo they took."
},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Prekės nerasta",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "nerastas:",
- "searchPanelHeader": "Ieškokite arba nuskaitykite pirmąjį produktą",
- "@Product query status": {},
"refreshing_product": "Produktas atnaujinamas",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Nuotrauka padaryta {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Nuotrauka padaryta {date}. Ši nuotrauka gali būti pasenusi",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Sveiki atvykę į „Open Food Facts“",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Ieškoti produkto",
+ "homepage_main_card_search_field_tooltip": "Pradėti paiešką",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Ar jums patinka ši programėlė?",
"tagline_app_review_button_positive": "Man ji labai patinka! 😍",
"tagline_app_review_button_negative": "Nelabai…",
"tagline_app_review_button_later": "Paklauskite manęs vėliau",
+ "tagline_feed_news_button": "Sužinoti daugiau",
"app_review_negative_modal_title": "Jums nepatinka mūsų programėlė?",
"app_review_negative_modal_text": "Ar galėtumėte skirti kelias sekundes ir pasakyti kodėl?",
"app_review_negative_modal_positive_button": "Taip, žinoma!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Įvyko klaida!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Neįmanoma gauti informacijos apie šį gaminį dėl tinklo klaidos.",
"cached_results_from": "Rodyti rezultatus iš:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "2012 m. išradome\nbendradarbiavimo\nnuskaitymo programą",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Mums sukankant 10 metų,\nmes jį perkuriame\nnuo pat pradžių!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Tęsti",
"onboarding_welcome_loading_dialog_title": "Įkeliamas jūsų pirmasis produkto pavyzdys",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibracija ir haptika",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Užpildyti pagrindinę informaciją",
"not_implemented_snackbar_text": "Dar neįgyvendinta",
"category_picker_page_appbar_text": "Kategorijos",
- "edit_ingredients_extrait_ingredients_btn_text": "Nuskaityti ingredientus",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Atnaujinti nuotrauką",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Išgauti pakavimą",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Atnaujinti nuotrauką",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Kainos",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Pridėti kainą",
+ "prices_add_a_receipt": "Pridėti kvitą",
+ "prices_add_price_tags": "Pridėti kainų etiketes",
+ "prices_barcode_search_not_found": "Prekė nerasta",
+ "prices_barcode_search_none_yet": "Dar nėra produktų",
+ "prices_barcode_search_question": "Ar norite ieškoti šio produkto?",
+ "prices_barcode_search_title": "Produktų paieška",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Kaina",
+ "prices_amount_price_discounted": "Sumažinta kaina",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "Trūksta vieno produkto!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Valiuta",
+ "prices_date_subtitle": "Data",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Įrodymai",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Čekis",
+ "prices_proof_price_tag": "Kainos etiketė",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Kainos bus skelbiamos viešai, kartu pateikiant informaciją apie parduotuvę, kurioje produktas buvo pirktas.\nTai gali leisti žmonėms, žinantiems jūsų „Open Food Facts“ slapyvardį:\n* padaryti išvadą, kurioje vietovėje gyvenate\n* sužinoti, ką perkate\nJei tai jums nepatinka, galite pakeisti savo slapyvardį arba sukurti naują „Open Food Facts“ paskyrą ir su ja prisijungti prie programėlės.",
+ "prices_unknown_product": "Nežinomas produktas",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Atlikta",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Duomenys",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Neįtraukti Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Naudoti pakartotinai ir redaguoti šią paiešką",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1659,7 +1868,7 @@
}
}
},
- "product_search_loading_message": "Your search of {search} is in progress.\n\nPlease wait a few seconds…",
+ "product_search_loading_message": "Vykdoma jūsų paieška - {search}.\n\nŠiek tiek luktelėkite…",
"@product_search_loading_message": {
"description": "This message will be displayed when a search is in progress.",
"search": {
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Mano kainos",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Mano įrodymai",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Visi baigtini gaminiai",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1902,7 +2143,7 @@
"@gallery_source_label": {
"description": "Label for the gallery image source"
},
- "gallery_source_access_denied_dialog_title": "Access denied",
+ "gallery_source_access_denied_dialog_title": "Prieiga uždrausta",
"@gallery_source_access_denied_dialog_title": {
"description": "On iOS, the user has refused to give the permission (title of the dialog)"
},
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Pasirinkite savo kalbą:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Įdiekite „Open Beauty Facts“, kad sukurtumėte kosmetikos duomenų bazę",
"faq_title_install_pet": "Įdiekite „Open Pet Food Facts“, kad sukurtumėte naminių gyvūnų pašarų duomenų bazę",
"faq_title_install_product": "Įdiekite „Open Products Facts“, kad sukurtumėte produktų duomenų bazę ir pailgintumėte objektų eksploatavimo laiką",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "„Pro“? Importuokite savo produktus į „Open Food Facts“",
"contact_title_pro_email": "Gamintojo kontaktai",
"contact_title_press_page": "Spaudos puslapis",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Šios nuorodos negalima atidaryti jūsų įrenginyje. Patikrinkite, ar įdiegta naršyklė.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Dalintis",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Kas yra „Nutri-Score“?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_lv.arb b/packages/smooth_app/lib/l10n/app_lv.arb
index 44e16c622e0..4ad54b5bc97 100644
--- a/packages/smooth_app/lib/l10n/app_lv.arb
+++ b/packages/smooth_app/lib/l10n/app_lv.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Fotografēt",
"take_more_photo_title": "Uzņemt papildus fotogrāfijas",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorijas",
- "edit_ingredients_extrait_ingredients_btn_text": "Ekstrakta sastāvdaļas",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dati",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Dalīties",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_mg.arb b/packages/smooth_app/lib/l10n/app_mg.arb
index d57585a0ff8..1b02b9c351c 100644
--- a/packages/smooth_app/lib/l10n/app_mg.arb
+++ b/packages/smooth_app/lib/l10n/app_mg.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Makà sary",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Sokajy",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Firaketana",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_mi.arb b/packages/smooth_app/lib/l10n/app_mi.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_mi.arb
+++ b/packages/smooth_app/lib/l10n/app_mi.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ml.arb b/packages/smooth_app/lib/l10n/app_ml.arb
index 88916e791d0..32ed0e37b08 100644
--- a/packages/smooth_app/lib/l10n/app_ml.arb
+++ b/packages/smooth_app/lib/l10n/app_ml.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "വിഭാഗങ്ങൾ",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_mn.arb b/packages/smooth_app/lib/l10n/app_mn.arb
index 0cb761bc854..8a115b77caa 100644
--- a/packages/smooth_app/lib/l10n/app_mn.arb
+++ b/packages/smooth_app/lib/l10n/app_mn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Ангилалууд",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_mr.arb b/packages/smooth_app/lib/l10n/app_mr.arb
index afc5296e77b..271cbc1b4d9 100644
--- a/packages/smooth_app/lib/l10n/app_mr.arb
+++ b/packages/smooth_app/lib/l10n/app_mr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ms.arb b/packages/smooth_app/lib/l10n/app_ms.arb
index d0bbe88d42b..1f0388e91eb 100644
--- a/packages/smooth_app/lib/l10n/app_ms.arb
+++ b/packages/smooth_app/lib/l10n/app_ms.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto Ramuan",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Foto Kitar Semula",
+ "take_photo_title": "Ambil gambar",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Tiada Produk Ditemui",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "tidak ditemui:",
- "searchPanelHeader": "Cari atau imbas produk pertama anda",
- "@Product query status": {},
"refreshing_product": "Produk yang diperbaharui",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Lengkapkan butiran asas",
"not_implemented_snackbar_text": "Belum dilaksanakan lagi",
"category_picker_page_appbar_text": "Kategori-kategori",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Kongsi",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_mt.arb b/packages/smooth_app/lib/l10n/app_mt.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_mt.arb
+++ b/packages/smooth_app/lib/l10n/app_mt.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_my.arb b/packages/smooth_app/lib/l10n/app_my.arb
index 995b8cb6857..3f4d81b5caf 100644
--- a/packages/smooth_app/lib/l10n/app_my.arb
+++ b/packages/smooth_app/lib/l10n/app_my.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "ေဝမွ်မည္",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_nb.arb b/packages/smooth_app/lib/l10n/app_nb.arb
index 55a236f6615..5832be15d1a 100644
--- a/packages/smooth_app/lib/l10n/app_nb.arb
+++ b/packages/smooth_app/lib/l10n/app_nb.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Bilde av ingredienser",
"nutritional_facts_photo_title": "Bilde av ernæringsfakta",
"recycling_photo_title": "Bilde av resirkuleringsinformasjon",
+ "take_photo_title": "Ta et bilde",
"take_more_photo_title": "Ta flere bilder",
"front_photo_uploaded": "Framsidebilde lastet opp",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Søk etter eller skann ditt første produkt",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Fullfør grunnleggende detaljer",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorier",
- "edit_ingredients_extrait_ingredients_btn_text": "Hent ut ingredienser",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Oppdater bildet",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Hent ut emballasje",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Oppdater bildet",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Fant ikke produktet",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Ferdig",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Alle produkter som skal fullføres",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starter oppdateringen av alle produktene som er lagret lokalt",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Del",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Hva er Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ne.arb b/packages/smooth_app/lib/l10n/app_ne.arb
index ce2f13750c6..265c5e357ac 100644
--- a/packages/smooth_app/lib/l10n/app_ne.arb
+++ b/packages/smooth_app/lib/l10n/app_ne.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_nl.arb b/packages/smooth_app/lib/l10n/app_nl.arb
index 418a083208d..478c8712e5c 100644
--- a/packages/smooth_app/lib/l10n/app_nl.arb
+++ b/packages/smooth_app/lib/l10n/app_nl.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Een illustratie met onbekende Nutri-Score en Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Foto van voorkant verpakking",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Bevestig het uploaden van de foto van de voorkant",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto van de ingrediëntenlijst",
"nutritional_facts_photo_title": "Foto van voedingswaarden",
"recycling_photo_title": "Recycling afbeelding",
+ "take_photo_title": "Maak een foto",
"take_more_photo_title": "Maak meer foto's",
"front_photo_uploaded": "Foto voorkant geüpload",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Geen product gevonden",
"@no_product_found": {},
+ "no_location_found": "Geen locatie gevonden",
"not_found": "niet gevonden:",
- "searchPanelHeader": "Zoek of scan uw eerste product",
- "@Product query status": {},
"refreshing_product": "Product herladen",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Foto gemaakt op {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Afbeelding gemaakt op {date}. Deze afbeelding is mogelijk verouderd",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welkom bij Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** een streepjescode of\n**zoek** naar een product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Zoek naar een product",
+ "homepage_main_card_search_field_tooltip": "Begin met zoeken",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Laatste nieuws: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Vind je de app leuk?",
"tagline_app_review_button_positive": "Ik vind het geweldig! 😍",
"tagline_app_review_button_negative": "Niet echt…",
"tagline_app_review_button_later": "Vraag me later nog eens",
+ "tagline_feed_news_button": "Meer weten",
"app_review_negative_modal_title": "Vind je onze app niet leuk?",
"app_review_negative_modal_text": "Kunt u een paar seconden de tijd nemen om ons te vertellen waarom?",
"app_review_negative_modal_positive_button": "Ja, absoluut!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Er is een fout opgetreden!",
+ "product_internet_error_modal_message": "We kunnen geen informatie over dit product ophalen vanwege een netwerkfout. Controleer uw internetverbinding en probeer het opnieuw.\n\nInterne fout:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Onmogelijk om informatie over dit product op te halen vanwege een netwerkfout.",
"cached_results_from": "Resultaten weergeven van:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Kies een valuta",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Je bent zojuist van land veranderd.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Wilt u de valuta wijzigen van {previousCurrency} naar {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Kies een land:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We hebben in 2012\nde collaboratieve\nscan-app uitgevonden",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Naar aanleiding van ons 10-jarig bestaan, vinden we onszelf opnieuw uit!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welkom !",
+ "onboarding_home_welcome_text2": "De app die je helpt bij het kiezen van voedsel dat goed is voor **jou** en de **planeet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Doorgaan",
"onboarding_welcome_loading_dialog_title": "Uw eerste voorbeeldproduct wordt geladen",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan een streepjescode met uw camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Trillen & haptieken",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Basisdetails aanvullen",
"not_implemented_snackbar_text": "Nog niet geïmplementeerd",
"category_picker_page_appbar_text": "Categorieën",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingrediënten",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Detecteer de ingrediënten op de foto",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Detecteer de ingrediënten\nop de foto",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Foto laden…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Foto vernieuwen",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Verpakking uitpakken",
+ "edit_packaging_extract_btn_text": "Detecteer de verpakking\nop de foto",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Detecteer de verpakking op de foto",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Foto laden…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Foto vernieuwen",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Snelkoppeling naar de Prijzen-app op de productpagina",
"prices_app_button": "Ga naar de Prijzen-app",
+ "prices_generic_title": "Prijzen",
+ "prices_add_n_prices": "{count,plural, one {}=1{Voeg 1 prijs toe} other{Voeg {count} prijzen toe}}",
+ "prices_send_n_prices": "{count,plural, one {}=1{Verstuur 1 prijs} other{Verstuur {count} prijzen}}",
+ "prices_add_an_item": "Item toevoegen",
+ "prices_add_a_price": "Voeg een prijs toe",
+ "prices_add_a_receipt": "Een ontvangstbewijs toevoegen",
+ "prices_add_price_tags": "Voeg prijskaartjes toe",
+ "prices_barcode_search_not_found": "Geen product gevonden",
+ "prices_barcode_search_none_yet": "Nog geen product",
+ "prices_barcode_search_question": "Wilt u dit product zoeken?",
+ "prices_barcode_search_title": "Product zoeken",
+ "prices_barcode_search_running": "Zoeken naar {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Streepjescodelezer",
+ "prices_view_prices": "Bekijk de prijzen",
+ "prices_list_length_one_page": "{count,plural, one {}=0{Nog geen prijs} =1{Slechts één prijs} other{Alle {count} prijzen}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Laatste {pageSize} prijzen (totaal: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, one {}=0{Nog geen bewijs} =1{Slechts één bewijs} other{Alle {count} bewijzen}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Laatste {pageSize} bewijzen (totaal: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} bijdragers (totaal: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Hoeveelheid",
+ "prices_amount_is_discounted": "Wordt er korting gegeven?",
+ "prices_amount_price_normal": "Prijs",
+ "prices_amount_price_discounted": "Gereduceerde prijs",
+ "prices_amount_price_not_discounted": "Oorspronkelijke prijs",
+ "prices_amount_no_product": "Er ontbreekt één product!",
+ "prices_amount_price_incorrect": "Onjuiste waarde",
+ "prices_amount_price_mandatory": "Verplichte waarde",
+ "prices_currency_subtitle": "Valuta",
+ "prices_date_subtitle": "Datum",
+ "prices_location_subtitle": "Winkel",
+ "prices_location_find": "Zoek een winkel",
+ "prices_location_mandatory": "Je moet een winkel selecteren!",
+ "prices_proof_subtitle": "Bewijs",
+ "prices_proof_find": "Selecteer een bewijs",
+ "prices_proof_receipt": "Bon",
+ "prices_proof_price_tag": "Prijskaartje",
+ "prices_proof_mandatory": "Je moet een bewijs selecteren!",
+ "prices_add_validation_error": "Validatiefout",
+ "prices_privacy_warning_title": "Privacywaarschuwing",
+ "prices_privacy_warning_message": "De prijzen zijn openbaar, samen met de winkel waarnaar ze verwijzen.\nHierdoor kunnen mensen die uw Open Food Facts-pseudoniem kennen het volgende doen:\n* afleiden in welk gebied u woont\n* weten wat u koopt\n$Als u zich daar niet prettig bij voelt, wijzig dan uw pseudoniem of maak een nieuw Open Food Facts-account aan en log daarmee in op de app.",
+ "prices_unknown_product": "Onbekend product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Voltooid",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Serverconfiguratie",
+ "dev_mode_section_product_page": "Productpagina",
+ "dev_mode_section_ui": "Gebruikersinterface",
+ "dev_mode_section_data": "Gegevens",
+ "dev_mode_section_experimental_features": "Experimentele functies",
"dev_mode_hide_ecoscore_title": "Eco-Score uitsluiten",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Gebruik een spellingcontrole voor OCR-schermen",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingrediënten en verpakking)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Hergebruik en bewerk deze zoekopdracht",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Mijn prijzen",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Mijn bewijzen",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "Mijn bewijs",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Prijzen van bijdragers",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Laatst toegevoegde prijzen",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Beste prijsbijdragers",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Winkels met de meeste prijzen",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Producten met de meeste prijzen",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Alle te voltooien producten",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "De prijs wordt zo snel mogelijk naar de server verzonden.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Het vernieuwen starten van alle producten die lokaal zijn opgeslagen",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Selecteer uw valuta:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Selecteer uw taal:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Nieuwe berekening)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (Nieuwe berekening)",
"nutriscore_unknown": "Onbekende Nutri-Score",
+ "nutriscore_unknown_new_formula": "Onbekende Nutri-Score (Nieuwe berekening)",
"nutriscore_not_applicable": "Nutri-Score is niet van toepassing",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is niet van toepassing (Nieuwe berekening)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Installeer Open Beauty Facts om een cosmetische database te maken",
"faq_title_install_pet": "Installeer Open Pet Food Facts om een dierenvoedingsdatabase te maken",
"faq_title_install_product": "Installeer Open Products Facts om een productendatabase te creëren om de levensduur van objecten te verlengen",
+ "faq_nutriscore_nutriscore": "Nieuwe berekening van de Nutri-Score: wat is er nieuw?",
"contact_title_pro_page": "Pro? Importeer je producten in Open Food Facts",
"contact_title_pro_email": "Producentcontact",
"contact_title_press_page": "Perspagina",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Deze link kan niet worden geopend op uw apparaat. Controleer of u een browser heeft geïnstalleerd.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details voor {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details voor {pageName} met {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Gids",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Delen",
+ "guide_nutriscore_v2_enabled": "waar",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "De Nutri-Score Evolueert: Toelichtingen!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "nl",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Wat is de Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "De Nutri-Score is een logo dat tot doel heeft u te informeren over de **voedingskwaliteit van voedingsmiddelen**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "De kleurcode varieert van donkergroen (**A**) voor de **gezondste** producten tot donkerrood (**E**) voor de **minder gezonde** producten.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Het Nutri-Score A-logo",
+ "guide_nutriscore_v2_why_v2_title": "Waarom evolueert de Nutri-Score?",
+ "guide_nutriscore_v2_why_v2_intro": "De Nutri-Score-formule **evolueert** om betere aanbevelingen te doen:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Evalueert alle drankjes beter",
+ "guide_nutriscore_v2_why_v2_arg1_text": "De relatieve aantekeningen van **melk**, **zuiveldranken** met toegevoegde suikers en **groentedranken** werden beter gedifferentieerd in het nieuwe algoritme.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Betere rangschikking van drankjes",
+ "guide_nutriscore_v2_why_v2_arg2_text": "Er wordt meer rekening gehouden met het suikergehalte**, wat in voordeel is voor dranken met een laag suikergehalte.\\n** Zoetstoffen worden ook bestraft**: dieetdrankjes worden gedegradeerd van een B naar een C tot een E-score. Water is nog steeds de aanbevolen drank.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Zout en suiker bestraft",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Producten die **te zoet** of **te zout** zijn, krijgen een lagere beoordeling**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hiërarchie binnen oliën en vis",
+ "guide_nutriscore_v2_why_v2_arg4_text": "De beoordeling van bepaalde **vette vis** en **oliën rijk aan goede vetten** zal verbeteren.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Beperk rood vlees",
+ "guide_nutriscore_v2_why_v2_arg5_text": "De consumptie van **rood vlees moet beperkt worden**. Daarom zal **gevogelte relatief beter scoren**.",
+ "guide_nutriscore_v2_new_logo_title": "Hoe onderscheid ik de oude Nutri-Score van de nieuwe berekening?",
+ "guide_nutriscore_v2_new_logo_text": "Vanaf nu kan het logo een vermelding \"**Nieuwe berekening**\" weergeven om te verduidelijken dat het daadwerkelijk om de nieuwe berekening gaat.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Het logo van de nieuwe Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Waar vind je de nieuwe Nutri-Score berekening?",
+ "guide_nutriscore_v2_where_paragraph1": "De Nutri-Score wordt in meerdere landen toegepast: Duitsland, België, Spanje, Frankrijk, Luxemburg, Nederland en Zwitserland.",
+ "guide_nutriscore_v2_where_paragraph2": "Fabrikanten hebben tot uiterlijk **2026** de tijd om de oude berekening door de nieuwe te **vervangen**.",
+ "guide_nutriscore_v2_where_paragraph3": "Zonder te moeten wachten **vind je in de OpenFoodFacts applicatie** al de nieuwe berekening, ook als de fabrikanten de score nog niet hebben aangepast.",
+ "guide_nutriscore_v2_unchanged_title": "Wat niet verandert",
+ "guide_nutriscore_v2_unchanged_paragraph1": "De Nutri-Score is een score die is ontworpen om **de voedingskwaliteit te meten**. Het is **complementair aan de NOVA-groep** op **ultrabewerkte voedingsmiddelen** (ook aanwezig in de applicatie).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Voor fabrikanten blijft de weergave van de Nutri-Score **optioneel**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Voorbeeld",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_nn.arb b/packages/smooth_app/lib/l10n/app_nn.arb
index a1e540b31c6..1731558508f 100644
--- a/packages/smooth_app/lib/l10n/app_nn.arb
+++ b/packages/smooth_app/lib/l10n/app_nn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Ta et bilde",
"take_more_photo_title": "Ta flere bilder",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorier",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Del",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_no.arb b/packages/smooth_app/lib/l10n/app_no.arb
index a1e540b31c6..1731558508f 100644
--- a/packages/smooth_app/lib/l10n/app_no.arb
+++ b/packages/smooth_app/lib/l10n/app_no.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Ta et bilde",
"take_more_photo_title": "Ta flere bilder",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategorier",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Del",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_nr.arb b/packages/smooth_app/lib/l10n/app_nr.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_nr.arb
+++ b/packages/smooth_app/lib/l10n/app_nr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_oc.arb b/packages/smooth_app/lib/l10n/app_oc.arb
index 5120c5b1fa3..efd39816bd6 100644
--- a/packages/smooth_app/lib/l10n/app_oc.arb
+++ b/packages/smooth_app/lib/l10n/app_oc.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categorias",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Donadas",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Partejar",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_or.arb b/packages/smooth_app/lib/l10n/app_or.arb
index 54db538378c..b10968f9050 100644
--- a/packages/smooth_app/lib/l10n/app_or.arb
+++ b/packages/smooth_app/lib/l10n/app_or.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_pa.arb b/packages/smooth_app/lib/l10n/app_pa.arb
index 1a1b43c1eb4..a3502859bad 100644
--- a/packages/smooth_app/lib/l10n/app_pa.arb
+++ b/packages/smooth_app/lib/l10n/app_pa.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_pl.arb b/packages/smooth_app/lib/l10n/app_pl.arb
index f3495579a32..47b3825a9ed 100644
--- a/packages/smooth_app/lib/l10n/app_pl.arb
+++ b/packages/smooth_app/lib/l10n/app_pl.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Zdjęcie produktu z przodu",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Potwierdź przesłanie zdjęcia produktu",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Zdjęcie listy składników",
"nutritional_facts_photo_title": "Zdjęcie tabeli wartości odżywczych",
"recycling_photo_title": "Zdjęcie informacji o recyklingu",
+ "take_photo_title": "Zrób zdjęcie",
"take_more_photo_title": "Zrób więcej zdjęć",
"front_photo_uploaded": "Przesłano zdjęcie przodu",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nie znaleziono produktu",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "nie znaleziono:",
- "searchPanelHeader": "Wyszukaj lub zeskanuj swój pierwszy produkt",
- "@Product query status": {},
"refreshing_product": "Odświeżanie produktu",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Wyszukaj produkt",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Nie można pobrać informacji o tym produkcie z powodu błędu sieciowego.",
"cached_results_from": "Pokaż wyniki z:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "W 2012 roku\nstworzyliśmy aplikację\ndo wspólnego skanowania",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Po 10. latach działania\npostanowiliśmy zaprojektować\naplikację od zera!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Kontynuuj",
"onboarding_welcome_loading_dialog_title": "Ładowanie pierwszego przykładowego produktu",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Wibracje i Haptyczna Informacja Zwrotna",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Uzupełnij podstawowe informacje",
"not_implemented_snackbar_text": "Jeszcze niezaimplementowane",
"category_picker_page_appbar_text": "Kategorie",
- "edit_ingredients_extrait_ingredients_btn_text": "Wyodrębnij składniki",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Odśwież zdjęcie",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Rozpoznaj opakowanie",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Odśwież zdjęcie",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Ceny",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Dodaj cenę",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produkt nie został znaleziony",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Cena",
+ "prices_amount_price_discounted": "Cena promocyjna",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Waluta",
+ "prices_date_subtitle": "Data",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Dowód",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Rachunek",
+ "prices_proof_price_tag": "Cenówka",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Nieznany produkt",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Gotowe",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dane",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Wyklucz EcoScore",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Użyj ponownie i edytuj to wyszukiwanie",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Moje ceny",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Moje dowody",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Wszystkie produkty do uzupełnienia",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Rozpoczynanie odświeżania wszystkich lokalnie przechowywanych produktów",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Nie można otworzyć tego odnośnika na Twoim urządzeniu. Sprawdź, czy masz zainstalowaną przeglądarkę.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Udostępnij",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Czym jest Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_pt.arb b/packages/smooth_app/lib/l10n/app_pt.arb
index d4b41660315..14dccb75a57 100644
--- a/packages/smooth_app/lib/l10n/app_pt.arb
+++ b/packages/smooth_app/lib/l10n/app_pt.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Uma ilustração com Nutri-Score e Eco-Score desconhecidos",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Fotografia frontal da embalagem",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirmar envio da fotografia frontal da embalagem",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Fotografia dos ingredientes",
"nutritional_facts_photo_title": "Fotografia das informações nutricionais",
"recycling_photo_title": "Fotografia de reciclagem",
+ "take_photo_title": "Tirar uma foto",
"take_more_photo_title": "Tirar mais fotografias",
"front_photo_uploaded": "Fotografia inicial enviada",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Não foi encontrado nenhum produto",
"@no_product_found": {},
+ "no_location_found": "Nenhuma localização encontrada",
"not_found": "não encontrado:",
- "searchPanelHeader": "Pesquise ou digitalize o seu primeiro produto",
- "@Product query status": {},
"refreshing_product": "A atualizar o produto",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Procurar por um produto",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Gosta da aplicação?",
"tagline_app_review_button_positive": "Adoro! 😍",
"tagline_app_review_button_negative": "Nem por isso…",
"tagline_app_review_button_later": "Perguntar depois",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Não gosta da nossa aplicação?",
"app_review_negative_modal_text": "Pode tirar uns segundos e dizer-nos o porquê por favor?",
"app_review_negative_modal_positive_button": "Sim, absolutamente!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Não foi possível obter informações sobre este produto devido a um erro de rede.",
"cached_results_from": "Mostrar resultados de:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Por favor selecione uma moeda",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Acabou de mudar de país.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Quer alterar a moeda de {previousCurrency} para {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Escolha um país:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Inventamos\na aplicação de digitalização\ncolaborativa em 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Ao fazermos 10 anos,\nestamos a reinventá-la\na partir do zero!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continuar",
"onboarding_welcome_loading_dialog_title": "A carregar o seu primeiro exemplo de produto",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibração e resposta tátil",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Detalhes básicos completos",
"not_implemented_snackbar_text": "Ainda não implementado",
"category_picker_page_appbar_text": "Categorias",
- "edit_ingredients_extrait_ingredients_btn_text": "Extrair ingredientes",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Atualizar fotografia",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extrair embalagem",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Atualizar fotografia",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Atalho para a aplicação Preços na página do produto",
"prices_app_button": "Ir para a aplicação Preços",
+ "prices_generic_title": "Preços",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Adicionar um preço",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produto não encontrado",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Pesquisa de produtos",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "Ver os preços",
+ "prices_list_length_one_page": "{count,plural, =0{Ainda sem preço} =1{Apenas um preço} other{Todos os {count} preços}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Últimos {pageSize} preços (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Montante",
+ "prices_amount_is_discounted": "Está com desconto?",
+ "prices_amount_price_normal": "Preço",
+ "prices_amount_price_discounted": "Preço descontado",
+ "prices_amount_price_not_discounted": "Preço original",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Valor incorreto",
+ "prices_amount_price_mandatory": "Valor obrigatório",
+ "prices_currency_subtitle": "Moeda",
+ "prices_date_subtitle": "Data",
+ "prices_location_subtitle": "Loja",
+ "prices_location_find": "Encontrar uma loja",
+ "prices_location_mandatory": "Tem de selecionar uma loja!",
+ "prices_proof_subtitle": "Demonstração",
+ "prices_proof_find": "Selecionar um comprovativo",
+ "prices_proof_receipt": "Recibo",
+ "prices_proof_price_tag": "Etiqueta de preço",
+ "prices_proof_mandatory": "Tem de selecionar um comprovativo!",
+ "prices_add_validation_error": "Erro de validação",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Produto desconhecido",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Concluído",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dados",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Excluir Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reproduzir e editar esta pesquisa",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Meus valores",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Minhas demonstrações",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Todos os produtos a serem concluídos",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "O preço será enviado para o servidor o mais rapidamente possível.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "A iniciar a atualização de todos os produtos armazenados localmente",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Selecione a sua moeda:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Selecione o seu idioma:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (novo cálculo)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (novo cálculo)",
"nutriscore_unknown": "Nutri-Score desconhecido",
+ "nutriscore_unknown_new_formula": "Nutri-Score desconhecido (novo cálculo)",
"nutriscore_not_applicable": "Nutri-Score não aplicável",
+ "nutriscore_not_applicable_new_formula": "O Nutri-Score não é aplicável (novo cálculo)",
"ecoscore_generic": "Eco-Pontuação",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Instale o Open Beauty Facts para criar uma base de dados de cosméticos",
"faq_title_install_pet": "Instale o Open Pet Food Facts para criar uma base de dados de comida para animais de estimação",
"faq_title_install_product": "Instale o Open Products Facts para criar uma base de dados de produtos para prolongar a vida útil dos objetos",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Profissional? Importe os seus produtos no Open Food Facts",
"contact_title_pro_email": "Contacto do produtor",
"contact_title_press_page": "Página de imprensa",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Este link não pode ser aberto no seu dispositivo. Por favor, verifique se você tem um navegador instalado.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Detalhes de {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Detalhes de {pageName} com {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guia",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Partilhar",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "pt",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "O que não muda",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_qu.arb b/packages/smooth_app/lib/l10n/app_qu.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_qu.arb
+++ b/packages/smooth_app/lib/l10n/app_qu.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_rm.arb b/packages/smooth_app/lib/l10n/app_rm.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_rm.arb
+++ b/packages/smooth_app/lib/l10n/app_rm.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ro.arb b/packages/smooth_app/lib/l10n/app_ro.arb
index 26f8b0c837d..c911d649da4 100644
--- a/packages/smooth_app/lib/l10n/app_ro.arb
+++ b/packages/smooth_app/lib/l10n/app_ro.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Fotografie din față a produsului",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirmați încărcarea fotografiei ambalajului frontal",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Fotografie cu ingredientele",
"nutritional_facts_photo_title": "Informații nutriționale Foto",
"recycling_photo_title": "Imaginea cu metoda de reciclare",
+ "take_photo_title": "Faceți o fotografie",
"take_more_photo_title": "Faceți mai multe poze",
"front_photo_uploaded": "Fotografia frontală a fost încărcată",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nu a fost găsit niciun produs",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "nu a fost găsit:",
- "searchPanelHeader": "Cauta sau scaneaza primul produs",
- "@Product query status": {},
"refreshing_product": "Reîmprospătare produs",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Îți place aplicația?",
"tagline_app_review_button_positive": "O ador! 😍",
"tagline_app_review_button_negative": "Nu chiar...",
"tagline_app_review_button_later": "Întreabă-mă mai târziu",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Nu îți place aplicația noastră?",
"app_review_negative_modal_text": "Poți să aloci câteva secunde pentru a ne spune de ce?",
"app_review_negative_modal_positive_button": "Da, cu siguranță!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Imposibil de preluat informații despre acest produs din cauza unei erori de rețea.",
"cached_results_from": "Afișați rezultate de la:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Vă rugăm să alegeți o țară:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Am inventat\naplicația de scanare colaborativă\nîn 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Când împlinim 10 ani,\no reinventăm\nde la zero!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continuați",
"onboarding_welcome_loading_dialog_title": "Se încarcă primul exemplu de produs",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibrație și haptică",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Detalii de bază complete",
"not_implemented_snackbar_text": "Neimplementat încă",
"category_picker_page_appbar_text": "Categorii",
- "edit_ingredients_extrait_ingredients_btn_text": "Extrageți ingredientele",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Reîmprospătați fotografia",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extragere ambalaj",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Reîmprospătați fotografia",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Produsul nu a fost găsit",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Terminat",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Date",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Excludeți Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reutilizați și editați această căutare",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Toate produsele de completat",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Începe reîmprospătarea tuturor produselor stocate local",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Selectați limba dvs.:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Scor nutrițional C",
"nutriscore_d": "Scor nutrițional D",
"nutriscore_e": "Scor nutrițional E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Scor nutrițional necunoscut",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Scorul nutrițional nu se aplică",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Scor Ecologic",
"ecoscore_a": "Scor Ecologic A",
"ecoscore_b": "Scor Ecologic B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Instalați Open Beauty Facts pentru a crea o bază de date cu produse cosmetice",
"faq_title_install_pet": "Instalați Open Pet Food Facts pentru a crea o bază de date cu alimente pentru animalele de companie",
"faq_title_install_product": "Instalați Open Products Facts pentru a crea o bază de date de produse pentru a prelungi durata de viață a obiectelor",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Importați-vă produsele în Open Food Facts",
"contact_title_pro_email": "Contact producător",
"contact_title_press_page": "Apăsați Pagina",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Acest link nu poate fi deschis pe dispozitivul dvs. Vă rugăm să verificați dacă aveți un browser instalat.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Distribuiți",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ru.arb b/packages/smooth_app/lib/l10n/app_ru.arb
index 1afd77477e5..71a326333cc 100644
--- a/packages/smooth_app/lib/l10n/app_ru.arb
+++ b/packages/smooth_app/lib/l10n/app_ru.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Фотография лицевой стороны продукта",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Подтвердить загрузку фотографии лицевой стороны продукта",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Фото состава",
"nutritional_facts_photo_title": "Фото информации о пищевой ценности",
"recycling_photo_title": "Изображение сведений о переработке",
+ "take_photo_title": "Сфотографировать",
"take_more_photo_title": "Сделайте дополнительные фото",
"front_photo_uploaded": "Загружено переднее фото",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Продукт не найден",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "не найдено:",
- "searchPanelHeader": "Найдите или просканируйте свой первый продукт",
- "@Product query status": {},
"refreshing_product": "Обновление продукта",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Нравится приложение?",
"tagline_app_review_button_positive": "Конечно! 😍",
"tagline_app_review_button_negative": "Не очень…",
"tagline_app_review_button_later": "Позже",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Не нравится наше приложение?",
"app_review_negative_modal_text": "Пожалуйста, напишите, почему.",
"app_review_negative_modal_positive_button": "Да, конечно!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Невозможно получить информацию об этом продукте из-за сетевой ошибки.",
"cached_results_from": "Показать результаты из:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "В 2012 году\nмы создали приложение\nдля коллективного сканирования",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Теперь когда нам 10 лет,\nнами было пересоздано\nполностью с нуля!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Продолжить",
"onboarding_welcome_loading_dialog_title": "Загрузка вашего первого примера продукта",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Вибрация и отклик",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Детальная информация",
"not_implemented_snackbar_text": "Пока что не реализовано",
"category_picker_page_appbar_text": "Категории",
- "edit_ingredients_extrait_ingredients_btn_text": "Распознать ингредиенты",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Обновить фото",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Извлечь информацию об упаковке",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Обновить фото",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Продукт не найден",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Готово",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Данные",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Исключить Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Все незавершённые продукты",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Вы производитель? Импортируйте данные о своих продуктах в Open Food Facts",
"contact_title_pro_email": "Связаться с нами (для производителей)",
"contact_title_press_page": "Материалы для прессы",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Поделиться",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "Англ.",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sa.arb b/packages/smooth_app/lib/l10n/app_sa.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_sa.arb
+++ b/packages/smooth_app/lib/l10n/app_sa.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sc.arb b/packages/smooth_app/lib/l10n/app_sc.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_sc.arb
+++ b/packages/smooth_app/lib/l10n/app_sc.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sd.arb b/packages/smooth_app/lib/l10n/app_sd.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_sd.arb
+++ b/packages/smooth_app/lib/l10n/app_sd.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sg.arb b/packages/smooth_app/lib/l10n/app_sg.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_sg.arb
+++ b/packages/smooth_app/lib/l10n/app_sg.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_si.arb b/packages/smooth_app/lib/l10n/app_si.arb
index fbe9916b845..e211d286d36 100644
--- a/packages/smooth_app/lib/l10n/app_si.arb
+++ b/packages/smooth_app/lib/l10n/app_si.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sk.arb b/packages/smooth_app/lib/l10n/app_sk.arb
index 1c35ffb4fd1..68e27d8b0d5 100644
--- a/packages/smooth_app/lib/l10n/app_sk.arb
+++ b/packages/smooth_app/lib/l10n/app_sk.arb
@@ -302,7 +302,7 @@
"@contributors_label": {
"description": "Button label: Opens a pop up window where all contributors of this app are shown"
},
- "contributors_dialog_title": "Contributors",
+ "contributors_dialog_title": "Prispievatelia",
"@contributors_dialog_title": {
"description": "Dialog title: A list of all contributors of this app"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Predná fotografia produktu",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Odfotiť",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Neboli nájdené žiadne výrobky",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "nenájdené:",
- "searchPanelHeader": "Vyhľadajte alebo naskenujte svoj prvý produkt",
- "@Product query status": {},
"refreshing_product": "Obnovuje sa produkt",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Vyhľadajte produkt",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Páči sa vám aplikácia?",
"tagline_app_review_button_positive": "Milujem to! 😍",
"tagline_app_review_button_negative": "Naozaj nie…",
"tagline_app_review_button_later": "Opýtajte sa ma neskôr",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Nepáči sa vám naša aplikácia?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Áno, jednoznačne!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Nie je možné získať informácie o tomto produkte kvôli chybe siete.",
"cached_results_from": "Zobraziť výsledky z:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Vyberte krajinu:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Pokračovať",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibrácie a haptika",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Kategórie",
- "edit_ingredients_extrait_ingredients_btn_text": "Rozpoznať zložky",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Odkaz na aplikáciu Ceny na stránke produktu",
"prices_app_button": "Prejdite do aplikácie Ceny",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Pridajte cenu",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Výrobok sa nenašiel",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Cena",
+ "prices_amount_price_discounted": "Zvýhodnená cena",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Mena",
+ "prices_date_subtitle": "Dátum",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Účtenka",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Hotovo",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Údaje",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Vylúčiť ekologické skóre",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Opätovne použite a upravte toto vyhľadávanie",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Moje ceny",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Všetky produkty, ktoré sa majú dokončiť",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Vyberte váš jazyk",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Neznáme Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score nie je použiteľné",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eko-skóre",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Nainštalujte si Open Beauty Facts a vytvorte kozmetickú databázu",
"faq_title_install_pet": "Nainštalujte si Open Pet Food Facts a vytvorte databázu krmiva pre domáce zvieratá",
"faq_title_install_product": "Nainštalujte si fakty o otvorených produktoch na vytvorenie databázy produktov na predĺženie životnosti objektov",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Importujte svoje produkty do Open Food Facts",
"contact_title_pro_email": "Kontakt na výrobcu",
"contact_title_press_page": "Stránka pre média",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Tento odkaz nie je možné otvoriť na vašom zariadení. Skontrolujte, či máte nainštalovaný prehliadač.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sl.arb b/packages/smooth_app/lib/l10n/app_sl.arb
index 48344bfeac0..9ee10bb3ca8 100644
--- a/packages/smooth_app/lib/l10n/app_sl.arb
+++ b/packages/smooth_app/lib/l10n/app_sl.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Fotografija sprednjega dela izdelka",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Potrdite naloženo sprednjo fotografijo izdelka",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Slika sestavin",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Fotografija recikliranja",
+ "take_photo_title": "Posnemi fotografijo",
"take_more_photo_title": "Naredite več slik",
"front_photo_uploaded": "Sprednja fotografija je naložena",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Ni zadetkov",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "ni zadetkov:",
- "searchPanelHeader": "Poiščite ali skenirajte svoj prvi izdelek",
- "@Product query status": {},
"refreshing_product": "Osvežitev izdelkov",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Zaradi napake v omrežju ni mogoče pridobiti informacij o tem izdelku.",
"cached_results_from": "Prikaži rezultate iz:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Kooperativno aplikacijo\nza skeniranje smo\nizumili leta 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Ker smo dopolnili 10\nbomo preoblikovali vse na novo\nod glave do pete!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Nalaganje prvega primera izdelka",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Izpolnite osnovne podatke",
"not_implemented_snackbar_text": "Še ni implementirano",
"category_picker_page_appbar_text": "Kategorije",
- "edit_ingredients_extrait_ingredients_btn_text": "Preberi sestavine",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Osveži fotografijo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Osveži fotografijo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Opravljeno",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Podatki",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Deli",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sn.arb b/packages/smooth_app/lib/l10n/app_sn.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_sn.arb
+++ b/packages/smooth_app/lib/l10n/app_sn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_so.arb b/packages/smooth_app/lib/l10n/app_so.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_so.arb
+++ b/packages/smooth_app/lib/l10n/app_so.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sq.arb b/packages/smooth_app/lib/l10n/app_sq.arb
index 7ef495a705c..26aa2799529 100644
--- a/packages/smooth_app/lib/l10n/app_sq.arb
+++ b/packages/smooth_app/lib/l10n/app_sq.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Fotoja e perparme, ballore u ngarkua.",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Nuk u gjet asnje produkt",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "Nuk u gjet, nuk rezultoi ",
- "searchPanelHeader": "Kerkoni ose skanoni produktin tuaj te pare",
- "@Product query status": {},
"refreshing_product": "Produkt freskues",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Eshte e pamundur te merret informacion ne lidhje me kete produkt per shkak te nje gabimi ne rrjet.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sr.arb b/packages/smooth_app/lib/l10n/app_sr.arb
index 205f8abd8d9..bd2e6dd1d0f 100644
--- a/packages/smooth_app/lib/l10n/app_sr.arb
+++ b/packages/smooth_app/lib/l10n/app_sr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Категорије",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Подаци",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Podeli",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ss.arb b/packages/smooth_app/lib/l10n/app_ss.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ss.arb
+++ b/packages/smooth_app/lib/l10n/app_ss.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_st.arb b/packages/smooth_app/lib/l10n/app_st.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_st.arb
+++ b/packages/smooth_app/lib/l10n/app_st.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sv.arb b/packages/smooth_app/lib/l10n/app_sv.arb
index 0acf43b4a92..6389bf35997 100644
--- a/packages/smooth_app/lib/l10n/app_sv.arb
+++ b/packages/smooth_app/lib/l10n/app_sv.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Foto på Ingredienser",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Bild på återvinningsinformation",
+ "take_photo_title": "Ta en bild",
"take_more_photo_title": "Ta fler bilder",
"front_photo_uploaded": "Framsidefoto uppladdat",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Ingen produkt hittades",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "hittades inte:",
- "searchPanelHeader": "Sök eller skanna din första produkt",
- "@Product query status": {},
"refreshing_product": "Uppdaterar produkt",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Gillar du appen?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Inte riktigt…",
"tagline_app_review_button_later": "Fråga mig senare",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Gillar du inte vår app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Ja, självklart!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Omöjligt att hämta information om denna produkt på grund av ett nätverksfel.",
"cached_results_from": "Visa resultat från:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Laddar din första exempelprodukt",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Komplettera grundläggande uppgifter",
"not_implemented_snackbar_text": "Inte implementerat ännu",
"category_picker_page_appbar_text": "Kategorier",
- "edit_ingredients_extrait_ingredients_btn_text": "Extrahera ingredienser",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Finner ej produkt",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Klar",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Välj ditt språk:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Dela",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_sw.arb b/packages/smooth_app/lib/l10n/app_sw.arb
index 1ba9cfc30f8..fab8450a8da 100644
--- a/packages/smooth_app/lib/l10n/app_sw.arb
+++ b/packages/smooth_app/lib/l10n/app_sw.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ta.arb b/packages/smooth_app/lib/l10n/app_ta.arb
index 32dd8ce0ea4..a3800c17a56 100644
--- a/packages/smooth_app/lib/l10n/app_ta.arb
+++ b/packages/smooth_app/lib/l10n/app_ta.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "அறியப்படாத நியூட்ரி-ஸ்கோர் மற்றும் எக்கோ-ஸ்கோர் கொண்ட ஒரு விளக்கம்",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "ஒரு படம் எடு",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "படம் எடுக்கப்பட்ட{date} அன்று",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "நாணயத்தைத் தேர்வு செய்யவும்",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "நீங்கள் இப்போதுதான் நாடுகளை மாற்றி இருக்கிறீர்கள்.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "உங்களின் முந்தைய நாணயத்திலிருந்து {previousCurrency} சாத்தியமான நாணயத்திற்கு {possibleCurrency} மாற்ற விரும்புகிறீர்களா?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "{barcode} ஐத் தேடுகிறது அல்லது தேடுகிறோம்",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "சிறந்த {pageSize} பங்களிப்பாளர்கள் (மொத்தம்: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "தரவு",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "எனது விலைகள்",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "பங்களிப்பாளர் விலைகள்",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "சமீபத்திய விலைகள் சேர்க்கப்பட்டன",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "அதிக விலை பங்களிப்பாளர்கள்",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "அதிக விலை கொண்ட கடைகள்",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "அதிக விலை கொண்ட தயாரிப்புகள்",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "உள்நாட்டில் சேமிக்கப்பட்ட அனைத்து தயாரிப்புகளையும் புதுப்பிக்கத் தொடங்குகிறது",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "உங்கள் நாணயத்தைத் தேர்ந்தெடுக்கவும்:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "நியூட்ரி-ஸ்கோர் {letter} (புதிய கணக்கீடு)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "தெரியாத நியூட்ரி ஸ்கோர் (புதிய கணக்கீடு)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "நியூட்ரி-ஸ்கோர் பொருந்தாது (புதிய கணக்கீடு)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "கையேடு",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "பகிர்க",
+ "guide_nutriscore_v2_enabled": "உண்மை",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_te.arb b/packages/smooth_app/lib/l10n/app_te.arb
index 796bfb3869b..0c920c56da9 100644
--- a/packages/smooth_app/lib/l10n/app_te.arb
+++ b/packages/smooth_app/lib/l10n/app_te.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "వర్గాలు",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tg.arb b/packages/smooth_app/lib/l10n/app_tg.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_tg.arb
+++ b/packages/smooth_app/lib/l10n/app_tg.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_th.arb b/packages/smooth_app/lib/l10n/app_th.arb
index 2792e5eb08f..6ab989ddbe1 100644
--- a/packages/smooth_app/lib/l10n/app_th.arb
+++ b/packages/smooth_app/lib/l10n/app_th.arb
@@ -443,7 +443,7 @@
"@myPersonalizedRanking": {
"description": "When you press this button, all products (in list or category) are sorted according to your preferences."
},
- "ranking_tab_all": "All",
+ "ranking_tab_all": "ทั้งหมด",
"ranking_subtitle_match_yes": "จับคู่ที่ดีสำหรับคุณ",
"ranking_subtitle_match_no": "Very poor match",
"ranking_subtitle_match_maybe": "Unknown match",
@@ -476,7 +476,7 @@
"@category": {
"description": "From a product list, there's a category filter: this is its title"
},
- "category_all": "All",
+ "category_all": "ทั้งหมด",
"@category_al": {
"description": "Top meta-entry on a category filter"
},
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "รูปภาพส่วนประกอบของอาหาร",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "การนำกลับไปใช้ใหม่",
+ "take_photo_title": "ถ่ายภาพ",
"take_more_photo_title": "ถ่ายรูปเพิ่มเติม",
"front_photo_uploaded": "รูปภาพด้านหน้าอัพโหลดเรียบร้อย",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "ไม่พบผลิตภัณฑ์",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "ไม่พบ",
- "searchPanelHeader": "ค้นหาหรือสแกนผลิตภัณฑ์แรกของคุณ",
- "@Product query status": {},
"refreshing_product": "กำลังโหลดผลิตภัณฑ์ใหม่",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "ไม่สามารถดึงข้อมูลเกี่ยวกับผลิตภัณฑ์นี้ได้เนื่องจากข้อผิดพลาดของเครือข่าย",
"cached_results_from": "แสดงผลลัพธ์จาก:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "หมวดหมู่",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "ข้อมูล",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "อธิบายเพิ่มเติมเกี่ยวกับ Nutri-Score",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ti.arb b/packages/smooth_app/lib/l10n/app_ti.arb
index db59725dec9..d448c94a7d0 100644
--- a/packages/smooth_app/lib/l10n/app_ti.arb
+++ b/packages/smooth_app/lib/l10n/app_ti.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tl.arb b/packages/smooth_app/lib/l10n/app_tl.arb
index 17a11e0d8c3..dbcf11b0994 100644
--- a/packages/smooth_app/lib/l10n/app_tl.arb
+++ b/packages/smooth_app/lib/l10n/app_tl.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Kumuha ng larawan",
"take_more_photo_title": "Kumuha ng mas maraming larawan",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Mga kategorya",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Datos",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Ibahagi",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tn.arb b/packages/smooth_app/lib/l10n/app_tn.arb
index 276b5888a6a..1e534e3b6c4 100644
--- a/packages/smooth_app/lib/l10n/app_tn.arb
+++ b/packages/smooth_app/lib/l10n/app_tn.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tr.arb b/packages/smooth_app/lib/l10n/app_tr.arb
index 5ca0aa82e68..1ad5d380ce6 100644
--- a/packages/smooth_app/lib/l10n/app_tr.arb
+++ b/packages/smooth_app/lib/l10n/app_tr.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Ürünün önden bir fotoğrafı",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Ürünün ön fotoğrafının yüklenmesini onaylayın",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "İçindekiler fotoğarafı",
"nutritional_facts_photo_title": "Besin Değerleri Fotoğrafı",
"recycling_photo_title": "Geri Dönüşüm Fotoğrafı",
+ "take_photo_title": "Resim çek",
"take_more_photo_title": "Daha fazla fotoğraf çekin",
"front_photo_uploaded": "Önden fotoğraf yüklendi",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Ürün bulunamadı",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "bulunamadı:",
- "searchPanelHeader": "İlk ürününüzü arayın veya tarayın",
- "@Product query status": {},
"refreshing_product": "Ürün yenileme",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Bir ürün arayın",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Uygulamayı beğendiniz mi?",
"tagline_app_review_button_positive": "Bayıldım! 😍",
"tagline_app_review_button_negative": "Pek sayılmaz…",
"tagline_app_review_button_later": "Daha sonra sor",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "Uygulamamızı beğenmediniz mi?",
"app_review_negative_modal_text": "Bize nedenini söylemek için birkaç saniyenizi ayırabilir misiniz?",
"app_review_negative_modal_positive_button": "Evet kesinlikle!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Bir ağ hatasından dolayı ürün bilgileri çekilemedi.",
"cached_results_from": "Sonuçların gösterildiği:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Lütfen bir para birimi seçin",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Az önce ülke değiştirdiniz.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Para birimini {previousCurrency} yerine {possibleCurrency} olarak değiştirmek istiyor musunuz?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Lütfen bir ülke seçin:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "İşbirliğine dayalı tarama uygulamasını 2012'de icat ettik",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "10 yaşına geldiğimizde, onu sıfırdan yeniden keşfediyoruz!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Devam et",
"onboarding_welcome_loading_dialog_title": "İlk örnek ürününüz yükleniyor",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Titreşim ve Dokunma",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Temel bilgileri tamamlayın",
"not_implemented_snackbar_text": "Henüz uygulanmadı",
"category_picker_page_appbar_text": "Kategoriler",
- "edit_ingredients_extrait_ingredients_btn_text": "İçindekileri çıkartın",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Fotoğrafı yenileyin",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Paketi ayıkla",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Fotoğrafı yenileyin",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Ürün sayfasındaki Fiyatlar uygulamasının kısayolu",
"prices_app_button": "Fiyatlar uygulamasına gidin",
+ "prices_generic_title": "Fiyatlar",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Fiyat ekleyin",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Ürün bulunamadı",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Ürün Arama",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Fiyat",
+ "prices_amount_price_discounted": "İndirimli fiyat",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Kur",
+ "prices_date_subtitle": "Tarih",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Kanıt",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Makbuz",
+ "prices_proof_price_tag": "Fiyat etiketi",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Bilinmeyen ürün",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Yapıldı",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Veri",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "EcoScore'u hariç tut",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Bu aramayı yeniden kullan ve düzenle",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Fiyatlarım",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Bedellerim",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Tamamlanacak tüm ürünler",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Yerel olarak depolanan tüm ürünlerin yenilenmesinin başlatılması",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Para biriminizi seçin:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Dilinizi seçiniz:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (Yeni hesaplama)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Bilinmeyen Nutri-Score",
+ "nutriscore_unknown_new_formula": "Bilinmeyen Nutri-Score (Yeni hesaplama)",
"nutriscore_not_applicable": "Nutri-Score geçerli değildir",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score geçerli değildir (Yeni hesaplama)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Bir kozmetik veritabanı oluşturmak için Open Beauty Facts'i yükleyin",
"faq_title_install_pet": "Bir evcil hayvan maması veri tabanı oluşturmak için Open Pet Food Facts'i kurun",
"faq_title_install_product": "Nesnelerin ömrünü uzatmak amacıyla bir ürün veritabanı oluşturmak için Open Products Facts'i kurun",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Profesyonel mi? Open Food Facts'te ürünlerinizi içe aktarın",
"contact_title_pro_email": "Üretici İletişim",
"contact_title_press_page": "Basın Sayfası",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Bu bağlantı cihazınızda açılamıyor. Lütfen tarayıcınızın kurulu olup olmadığını kontrol edin.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Paylaş",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Nutri-Score nedir?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ts.arb b/packages/smooth_app/lib/l10n/app_ts.arb
index 276b5888a6a..1e534e3b6c4 100644
--- a/packages/smooth_app/lib/l10n/app_ts.arb
+++ b/packages/smooth_app/lib/l10n/app_ts.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tt.arb b/packages/smooth_app/lib/l10n/app_tt.arb
index 470bc8cd832..84cbf7f9024 100644
--- a/packages/smooth_app/lib/l10n/app_tt.arb
+++ b/packages/smooth_app/lib/l10n/app_tt.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Әзер",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Мәгълүмат",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Бүлеш",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_tw.arb b/packages/smooth_app/lib/l10n/app_tw.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_tw.arb
+++ b/packages/smooth_app/lib/l10n/app_tw.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ty.arb b/packages/smooth_app/lib/l10n/app_ty.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_ty.arb
+++ b/packages/smooth_app/lib/l10n/app_ty.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ug.arb b/packages/smooth_app/lib/l10n/app_ug.arb
index bbfa0ba1cab..facddd04004 100644
--- a/packages/smooth_app/lib/l10n/app_ug.arb
+++ b/packages/smooth_app/lib/l10n/app_ug.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "رەسىمگە تارتىش",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "سانلىق مەلۇمات",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "ھەمبەھىرلەش",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_uk.arb b/packages/smooth_app/lib/l10n/app_uk.arb
index 60a3a0a23db..bdc0ab8d9a3 100644
--- a/packages/smooth_app/lib/l10n/app_uk.arb
+++ b/packages/smooth_app/lib/l10n/app_uk.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "Ілюстрація з невідомими Nutri-Score та Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Фото передньої частини продукту",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Підтвердьте завантаження передньої фотографії продукту",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Фото інгредієнтів",
"nutritional_facts_photo_title": "Світлина харчової цінності продукту",
"recycling_photo_title": "Обробка фото",
+ "take_photo_title": "Сфотографувати",
"take_more_photo_title": "Зробити більше фото",
"front_photo_uploaded": "Попереднє фото завантажено",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Продукт не знайдено",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "не знайдено:",
- "searchPanelHeader": "Шукайте або відскануйте ваш перший товар",
- "@Product query status": {},
"refreshing_product": "Освіжаючий товар",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Зображення зроблене {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Зображення, зроблене {date}. Це зображення може бути застарілим",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Вітаємо в Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Відскануйте** штрих-код або\n**знайдіть** продукт",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Пошук товару",
+ "homepage_main_card_search_field_tooltip": "Почати пошук",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Останні новини: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Вам подобається цей додаток?",
"tagline_app_review_button_positive": "Я в захопленні! 😍",
"tagline_app_review_button_negative": "Не дуже…",
"tagline_app_review_button_later": "Запитайте мене пізніше",
+ "tagline_feed_news_button": "Докладніше",
"app_review_negative_modal_title": "Вам не подобається наш додаток?",
"app_review_negative_modal_text": "Не могли б ви витратити кілька секунд, щоб сказати нам, чому?",
"app_review_negative_modal_positive_button": "Так, звичайно!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "Сталася помилка!",
+ "product_internet_error_modal_message": "Ми не можемо отримати інформацію про цей продукт через помилку мережі. Перевірте підключення до Інтернету та повторіть спробу.\n\nВнутрішня помилка:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Неможливо отримати інформацію про цей продукт через помилку мережі.",
"cached_results_from": "Показати результати з:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Будь ласка виберіть валюту",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "Ви щойно змінили країну.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Ви хочете змінити валюту з {previousCurrency} на {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Будь ласка, виберіть країну:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Ми розробили додаток\nдля спільного сканування\nу 2012 році",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Оскільки нам виповнюється 10 років,\nми переосмислюємо його\nз нуля!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Ласкаво просимо!",
+ "onboarding_home_welcome_text2": "Додаток, який допоможе вам вибрати їжу, яка корисна для **вас** і **планети**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Продовжити",
"onboarding_welcome_loading_dialog_title": "Завантаження вашого першого прикладу продукту",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Відскануйте штрих-код камерою",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Вібрація та тактильні відчуття",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Заповніть основні деталі",
"not_implemented_snackbar_text": "Ще не реалізовано",
"category_picker_page_appbar_text": "Категорії",
- "edit_ingredients_extrait_ingredients_btn_text": "Вилучити інгредієнти",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Видобути інгредієнти з фото",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Отримання інгредієнтів із зображення",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Завантаження фото…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Оновити фото",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Розпакування пакунків",
+ "edit_packaging_extract_btn_text": "Видобути упаковку\nз фото",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Вилучення пакунка з фотографії",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Завантаження фото…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Оновити фото",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Ярлик програми «Ціни» на сторінці продукту",
"prices_app_button": "Перейдіть у додаток Ціни",
+ "prices_generic_title": "Ціни",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Додати елемент",
+ "prices_add_a_price": "Додати ціну",
+ "prices_add_a_receipt": "Додати чек",
+ "prices_add_price_tags": "Додайте цінові бірки",
+ "prices_barcode_search_not_found": "Товар не знайдено",
+ "prices_barcode_search_none_yet": "Ще немає товару",
+ "prices_barcode_search_question": "Ви хочете шукати цей продукт?",
+ "prices_barcode_search_title": "Пошук товару",
+ "prices_barcode_search_running": "Шукаю {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Сканер штрих-коду",
+ "prices_view_prices": "Переглянути ціни",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Останні {pageSize} докази (всього: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Топ {pageSize} учасників (всього: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Кількість",
+ "prices_amount_is_discounted": "Чи є знижка?",
+ "prices_amount_price_normal": "Ціна",
+ "prices_amount_price_discounted": "Ціна зі знижкою",
+ "prices_amount_price_not_discounted": "Початкова ціна",
+ "prices_amount_no_product": "Бракує одного товару!",
+ "prices_amount_price_incorrect": "Помилкове значення",
+ "prices_amount_price_mandatory": "Обов'язкове значення",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Крамниця",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Доказ",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Квитанція",
+ "prices_proof_price_tag": "Цінник",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Попередження про конфіденційність",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Невідомий продукт",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Виконано",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Конфігурація сервера",
+ "dev_mode_section_product_page": "Сторінка продукту",
+ "dev_mode_section_ui": "Інтерфейс користувача",
+ "dev_mode_section_data": "Дані",
+ "dev_mode_section_experimental_features": "Експериментальні функції",
"dev_mode_hide_ecoscore_title": "Вимкнути Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Використовуйте перевірку орфографії для OCR екранів",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Інгредієнти та упаковка)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Повторно використовуйте та редагуйте цей пошук",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "Мої ціни",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "Мої докази",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "Мої докази",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Ціни вкладників",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Останні додані ціни",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Найбільші учасники цін",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Магазини з найбільшими цінами",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Товари з найбільшою ціною",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Мої завершені товари",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Запуск оновлення всіх продуктів, які зберігаються локальна",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Оберіть Вашу валюту:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Виберіть свою мову:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Оцінка Nutri-Score C",
"nutriscore_d": "Оцінка Nutri-Score D",
"nutriscore_e": "Оцінка Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (новий розрахунок)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (Новий розрахунок)",
"nutriscore_unknown": "Невідома оцінка Nutri-Score",
+ "nutriscore_unknown_new_formula": "Невідомий Nutri-Score (новий розрахунок)",
"nutriscore_not_applicable": "Nutri-Score не застосовується",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score не застосовується (новий розрахунок)",
"ecoscore_generic": "Eco-Score (показник впливу на довкілля)",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Встановіть Open Beauty Facts для створення косметичної бази даних",
"faq_title_install_pet": "Встановіть Open Pet Food Facts щоб створити базу даних для домашніх тварин",
"faq_title_install_product": "Встановіть Open Products Facts, щоб створити базу даних продуктів і подовжити термін служби об’єктів",
+ "faq_nutriscore_nutriscore": "Новий розрахунок Nutri-Score: що нового?",
"contact_title_pro_page": "Pro? Імпортуйте свої продукти в Open Food Facts",
"contact_title_pro_email": "Контакт виробника",
"contact_title_press_page": "Інформація для преси",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "Це посилання не може бути відкрито на вашому пристрої. Будь ласка, перевірте чи встановлено браузер.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Деталі для {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Деталі для {pageName} з {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Посібник",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Поділитися",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "Nutri-Score розвивається: пояснення!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "Що таке Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "Nutri-Score – це логотип, мета якого інформувати вас про **поживну якість харчових продуктів**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "Кольоровий код варіюється від темно-зеленого (**A**) для **найздоровіших** продуктів до темно-червоного (**E**) для **менш корисних** продуктів.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "Логотип Nutri-Score A",
+ "guide_nutriscore_v2_why_v2_title": "Чому Nutri-Score розвивається?",
+ "guide_nutriscore_v2_why_v2_intro": "Формула Nutri-Score **еволюціонує**, щоб надавати кращі рекомендації:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Краще оцініть всі напої",
+ "guide_nutriscore_v2_why_v2_arg1_text": "Порівняльні ноти **молока**, **молочних напоїв** з додаванням цукру та **овочевих** напоїв у новому алгоритмі краще розрізнили.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Кращий рейтинг напоїв",
+ "guide_nutriscore_v2_why_v2_arg2_text": "**Вміст цукру** краще брати до уваги, і він надає перевагу напоям із **слабким вмістом цукру**.\\n**Підсолоджувачі також будуть штрафуватися**: рейтинг дієтичних газованих напоїв буде знижено з B до C і E. Вода залишається рекомендованим напоєм.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Сіль і цукор штрафні",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Продукти **занадто солодкі** або **занадто солоні** отримають **рейтинг ще більше знижений**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Ієрархія в оліях і рибі",
+ "guide_nutriscore_v2_why_v2_arg4_text": "Поліпшиться рейтинг певної **жирної риби** та **олій, багатих хорошими жирами**.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Обмежити червоне м'ясо",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Споживання **червоного м’яса слід обмежити**. Ось чому **птах матиме порівняно кращий рейтинг**.",
+ "guide_nutriscore_v2_new_logo_title": "Як відрізнити старий Nutri-Score від нового розрахунку?",
+ "guide_nutriscore_v2_new_logo_text": "Відтепер логотип може показувати згадку «**Новий розрахунок**», щоб уточнити, що це справді новий розрахунок.",
+ "guide_nutriscore_v2_new_logo_image_caption": "Логотип нового Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Де знайти новий розрахунок Nutri-Score?",
+ "guide_nutriscore_v2_where_paragraph1": "Nutri-Score застосовується в кількох країнах: Німеччині, Бельгії, Іспанії, Франції, Люксембурзі, Нідерландах та Швейцарії.",
+ "guide_nutriscore_v2_where_paragraph2": "Постачальники мають до **2026 року** останній термін **на заміну** старого розрахунку на новий.",
+ "guide_nutriscore_v2_where_paragraph3": "Без очікування ви вже знайдете в додатку OpenFoodFacts новий розрахунок, включаючи в тому числі якщо постачальники не оновили бали.",
+ "guide_nutriscore_v2_unchanged_title": "Що не змінилося",
+ "guide_nutriscore_v2_unchanged_paragraph1": "Nutri-Score – це оцінка, розроблена для **вимірювання якості харчування**. Він **доповнює групу NOVA** щодо **ультраоброблених продуктів** (також присутня в додатку).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "Для постачальників зображення Nutri-Score **залишається необов’язковим**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Попередній перегляд",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ur.arb b/packages/smooth_app/lib/l10n/app_ur.arb
index 6697ac7790b..a050e760be7 100644
--- a/packages/smooth_app/lib/l10n/app_ur.arb
+++ b/packages/smooth_app/lib/l10n/app_ur.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "تصویر لیں",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_uz.arb b/packages/smooth_app/lib/l10n/app_uz.arb
index 069f9385023..a10381b1069 100644
--- a/packages/smooth_app/lib/l10n/app_uz.arb
+++ b/packages/smooth_app/lib/l10n/app_uz.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Suratga olish",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Toifalar",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Maʻlumot",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_ve.arb b/packages/smooth_app/lib/l10n/app_ve.arb
index 276b5888a6a..1e534e3b6c4 100644
--- a/packages/smooth_app/lib/l10n/app_ve.arb
+++ b/packages/smooth_app/lib/l10n/app_ve.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_vi.arb b/packages/smooth_app/lib/l10n/app_vi.arb
index 00e1b988a3d..2f38a26f8d9 100644
--- a/packages/smooth_app/lib/l10n/app_vi.arb
+++ b/packages/smooth_app/lib/l10n/app_vi.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Ảnh mặt trước sản phẩm",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Xác nhận tải lên ảnh trước của Sản phẩm",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ảnh thành phần",
"nutritional_facts_photo_title": "Ảnh chụp thông tin dinh dưỡng",
"recycling_photo_title": "Ảnh quy định tái chế",
+ "take_photo_title": "Chụp ảnh",
"take_more_photo_title": "Chụp thêm ảnh",
"front_photo_uploaded": "Đã tải ảnh mặt trước lên",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "Không tìm thấy sản phẩm",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "không tìm thấy:",
- "searchPanelHeader": "Tìm kiếm hoặc quét sản phẩm đầu tiên của bạn",
- "@Product query status": {},
"refreshing_product": "Làm mới sản phẩm",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Không thể nạp thông tin về sản phẩm này do lỗi kết nối mạng.",
"cached_results_from": "Hiển thị kết quả từ:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "Chúng tôi đã phát mình\nứng dụng quét cộng tác\nvào năm 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "Khi tròn 10 năm,\nchúng tôi đã phát minh lại nó\ntừ đầu!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Tiếp tục",
"onboarding_welcome_loading_dialog_title": "Đang tải lên sản phẩm mẫu đầu tiên của bạn",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Rung & Phản hồi",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Hoàn thành thông tin cơ bản",
"not_implemented_snackbar_text": "Chưa thực hiện",
"category_picker_page_appbar_text": "Thể loại",
- "edit_ingredients_extrait_ingredients_btn_text": "Trích xuất thành phần",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Làm mới ảnh",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Xuất thông tin từ bao bì",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Làm mới ảnh",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Không tìm thấy sản phẩm",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Xong",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Dữ liệu",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Loại trừ Điểm sinh thái",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "Tất cả các sản phẩm sắp hoàn thiện",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Điểm sinh thái",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Chia sẻ",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_wa.arb b/packages/smooth_app/lib/l10n/app_wa.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_wa.arb
+++ b/packages/smooth_app/lib/l10n/app_wa.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_wo.arb b/packages/smooth_app/lib/l10n/app_wo.arb
index 276b5888a6a..1e534e3b6c4 100644
--- a/packages/smooth_app/lib/l10n/app_wo.arb
+++ b/packages/smooth_app/lib/l10n/app_wo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_xh.arb b/packages/smooth_app/lib/l10n/app_xh.arb
index d19da9861a3..cc3ec58afc4 100644
--- a/packages/smooth_app/lib/l10n/app_xh.arb
+++ b/packages/smooth_app/lib/l10n/app_xh.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_yi.arb b/packages/smooth_app/lib/l10n/app_yi.arb
index 0582593abcc..d880cf68188 100644
--- a/packages/smooth_app/lib/l10n/app_yi.arb
+++ b/packages/smooth_app/lib/l10n/app_yi.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more pictures",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_yo.arb b/packages/smooth_app/lib/l10n/app_yo.arb
index c1fa8eb30ab..c1cd3ac71e0 100644
--- a/packages/smooth_app/lib/l10n/app_yo.arb
+++ b/packages/smooth_app/lib/l10n/app_yo.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Ya aworan kan",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Awon eka",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_zh.arb b/packages/smooth_app/lib/l10n/app_zh.arb
index 2c13ce99dc0..4dd46edf3f7 100644
--- a/packages/smooth_app/lib/l10n/app_zh.arb
+++ b/packages/smooth_app/lib/l10n/app_zh.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "配料表照片",
"nutritional_facts_photo_title": "营养成分表",
"recycling_photo_title": "循环利用照片",
+ "take_photo_title": "選一張圖片",
"take_more_photo_title": "拍攝更多照片",
"front_photo_uploaded": "已上传正面照片",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "没有找到的产品",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "未找到:",
- "searchPanelHeader": "搜索或扫描您的第一个产品",
- "@Product query status": {},
"refreshing_product": "产品更新中",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "由于网络错误,无法获取有关此产品的信息。",
"cached_results_from": "显示结果来自:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "我们在 2012 年发明了\n协作\n扫描应用程序",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "当我们 10 岁时,\n我们正在从头开始重新改变它\n!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "继续",
"onboarding_welcome_loading_dialog_title": "正在加载您的第一个产品",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "振动 触觉",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "完善基本信息",
"not_implemented_snackbar_text": "尚未生效",
"category_picker_page_appbar_text": "類別",
- "edit_ingredients_extrait_ingredients_btn_text": "提取成分",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "刷新照片",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "提取包装信息",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "刷新照片",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "完成",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "數據",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "排除 Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "所有待完善产品",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "开始刷新本地存储的所有产品",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "推荐给好友",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/l10n/app_zu.arb b/packages/smooth_app/lib/l10n/app_zu.arb
index 658fdff9e3d..0fc7d7f6c74 100644
--- a/packages/smooth_app/lib/l10n/app_zu.arb
+++ b/packages/smooth_app/lib/l10n/app_zu.arb
@@ -566,6 +566,10 @@
"@new_product_dialog_description": {
"description": "Please keep it short, like less than 100 characters. Explanatory text of the dialog when the user searched for an unknown barcode."
},
+ "new_product_dialog_illustration_description": "An illustration with unknown Nutri-Score and Eco-Score",
+ "@new_product_dialog_illustration_description": {
+ "description": "A description for accessibility of two images side by side: a Nutri-Score and an EcoScore."
+ },
"front_packaging_photo_button_label": "Front packaging photo",
"@front_packaging_photo_button_label": {},
"confirm_front_packaging_photo_button_label": "Confirm upload of Front packaging photo",
@@ -624,6 +628,7 @@
"ingredients_photo_title": "Ingredients Photo",
"nutritional_facts_photo_title": "Nutrition Facts Photo",
"recycling_photo_title": "Recycling Photo",
+ "take_photo_title": "Take a picture",
"take_more_photo_title": "Take more photos",
"front_photo_uploaded": "Front photo uploaded",
"@front_photo_uploaded": {},
@@ -735,9 +740,8 @@
"@view_more_photo_button": {},
"no_product_found": "No product found",
"@no_product_found": {},
+ "no_location_found": "No location found",
"not_found": "not found:",
- "searchPanelHeader": "Search or scan your first product",
- "@Product query status": {},
"refreshing_product": "Refreshing product",
"@refreshing_product": {
"description": "Confirmation, that the product data of a cached product is queried again"
@@ -746,10 +750,51 @@
"@product_refreshed": {
"description": "Confirmation, that the product data refresh is done"
},
+ "product_image_accessibility_label": "Image taken on {date}",
+ "@product_image_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "product_image_outdated_accessibility_label": "Image taken on {date}. This image may be outdated",
+ "@product_image_outdated_accessibility_label": {
+ "placeholders": {
+ "date": {
+ "type": "String",
+ "description": "The date of picture (in localized format for YYYY-MM-DD)"
+ }
+ }
+ },
+ "homepage_main_card_logo_description": "Welcome to Open Food Facts",
+ "@homepage_main_card_logo_description": {
+ "description": "Description for accessibility of the Open Food Facts logo on the homepage"
+ },
+ "homepage_main_card_subheading": "**Scan** a barcode or\n**search** for a product",
+ "@homepage_main_card_subheading": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please keep it."
+ },
+ "homepage_main_card_search_field_hint": "Search for a product",
+ "homepage_main_card_search_field_tooltip": "Start search",
+ "@homepage_main_card_search_field_tooltip": {
+ "description": "Description for accessibility of the search field on the homepage"
+ },
+ "scan_tagline_news_item_accessibility": "Latest news: {news_title}",
+ "@scan_tagline_news_item_accessibility": {
+ "description": "Accessibility label for the title of a news",
+ "placeholders": {
+ "news_title": {
+ "type": "String"
+ }
+ }
+ },
"tagline_app_review": "Do you like the app?",
"tagline_app_review_button_positive": "I love it! 😍",
"tagline_app_review_button_negative": "Not really…",
"tagline_app_review_button_later": "Ask me later",
+ "tagline_feed_news_button": "Know more",
"app_review_negative_modal_title": "You don't like our app?",
"app_review_negative_modal_text": "Could you take a few seconds to tell us why?",
"app_review_negative_modal_positive_button": "Yes, absolutely!",
@@ -758,6 +803,16 @@
"@could_not_refresh": {
"description": "The product data couldn't be refreshed"
},
+ "product_internet_error_modal_title": "An error has occurred!",
+ "product_internet_error_modal_message": "We are unable to fetch information about this product due to a network error. Please check your internet connection and try again.\n\nInternal error:\n{error}",
+ "@product_internet_error_modal_message": {
+ "placeholders": {
+ "error": {
+ "type": "String",
+ "description": "The error message"
+ }
+ }
+ },
"product_internet_error": "Impossible to fetch information about this product due to a network error.",
"cached_results_from": "Show results from:",
"@cached_results_from": {
@@ -798,6 +853,28 @@
"@country_chooser_label": {
"description": "Label shown above a selector where the user can select their country (in the preferences)"
},
+ "currency_chooser_label": "Please choose a currency",
+ "@currency_chooser_label": {
+ "description": "Label shown above a selector where the user can select their currency (in the preferences)"
+ },
+ "country_change_message": "You have just changed countries.",
+ "@country_change_message": {
+ "description": "Message stating the change of countries"
+ },
+ "currency_auto_change_message": "Do you want to change the currency from {previousCurrency} to {possibleCurrency}?",
+ "@currency_auto_change_message": {
+ "description": "Message asking to confirm the change of currencies",
+ "placeholders": {
+ "previousCurrency": {
+ "type": "String",
+ "description": "Current currency"
+ },
+ "possibleCurrency": {
+ "type": "String",
+ "description": "Possible currency"
+ }
+ }
+ },
"onboarding_country_chooser_label": "Please choose a country:",
"@onboarding_country_chooser_label": {
"description": "The label shown above a selector where the user can select their country (in the onboarding)"
@@ -1042,14 +1119,12 @@
}
}
},
- "onboarding_reinventing_text1": "We invented\nthe collaborative\nscanning app in 2012",
- "@onboarding_reinventing_text1": {
- "description": "Onboarding / Reinventing page: text 1/2. If possible, balanced on 3 lines."
- },
- "onboarding_reinventing_text2": "As we turn 10,\nwe're reinventing it\nfrom the ground up!",
- "@onboarding_reinventing_text2": {
- "description": "Onboarding / Reinventing page: text 2/2. If possible, balanced on 3 lines."
+ "onboarding_home_welcome_text1": "Welcome !",
+ "onboarding_home_welcome_text2": "The app that helps you choose food that is good for **you** and the **planet**!",
+ "@onboarding_home_welcome_text2": {
+ "description": "Onboarding home screen welcome text, text surrounded by * will be bold"
},
+ "onboarding_continue_button": "Continue",
"onboarding_welcome_loading_dialog_title": "Loading your first example product",
"@onboarding_welcome_loading_dialog_title": {
"description": "Title for the onboarding loading dialog"
@@ -1160,6 +1235,10 @@
"@camera_play_sound_subtitle": {
"description": "SubTitle for the Camera play sound toggle"
},
+ "camera_window_accessibility_label": "Scan a barcode with your camera",
+ "@camera_window_accessibility_label": {
+ "description": "Accessibility label for the camera window"
+ },
"app_haptic_feedback_title": "Vibration & Haptics",
"@app_haptic_feedback_title": {
"description": "Title for the Haptic feedback toggle"
@@ -1400,18 +1479,34 @@
"completed_basic_details_btn_text": "Complete basic details",
"not_implemented_snackbar_text": "Not implemented yet",
"category_picker_page_appbar_text": "Categories",
- "edit_ingredients_extrait_ingredients_btn_text": "Extract ingredients",
- "@edit_ingredients_extrait_ingredients_btn_text": {
+ "edit_ingredients_extract_ingredients_btn_text": "Extract ingredients from the photo",
+ "@edit_ingredients_extract_ingredients_btn_text": {
"description": "Ingredients edition - Extract ingredients"
},
+ "edit_ingredients_extracting_ingredients_btn_text": "Extracting ingredients\nfrom the photo",
+ "@edit_ingredients_extracting_ingredients_btn_text": {
+ "description": "Ingredients edition - Extracting ingredients"
+ },
+ "edit_ingredients_loading_photo_btn_text": "Loading photo…",
+ "@edit_ingredients_loading_photo_btn_text": {
+ "description": "Ingredients edition - Loading photo from the server"
+ },
"edit_ingredients_refresh_photo_btn_text": "Refresh photo",
"@edit_ingredients_refresh_photo_btn_text": {
"description": "Ingredients edition - Refresh photo"
},
- "edit_packaging_extract_btn_text": "Extract packaging",
+ "edit_packaging_extract_btn_text": "Extract packaging\nfrom the photo",
"@edit_packaging_extract_btn_text": {
"description": "Packaging edition - OCR-Extract packaging"
},
+ "edit_packaging_extracting_btn_text": "Extracting packaging from the photo",
+ "@edit_packaging_extracting_btn_text": {
+ "description": "Packaging edition - OCR-Extracting packaging"
+ },
+ "edit_packaging_loading_photo_btn_text": "Loading photo…",
+ "@edit_packaging_loading_photo_btn_text": {
+ "description": "Packaging edition - Loading photo from the server"
+ },
"edit_packaging_refresh_photo_btn_text": "Refresh photo",
"@edit_packaging_refresh_photo_btn_text": {
"description": "Packaging edition - Refresh photo"
@@ -1623,14 +1718,128 @@
},
"prices_app_dev_mode_flag": "Shortcut to Prices app on product page",
"prices_app_button": "Go to Prices app",
+ "prices_generic_title": "Prices",
+ "prices_add_n_prices": "{count,plural, =1{Add a price} other{App {count} prices}}",
+ "prices_send_n_prices": "{count,plural, =1{Send the price} other{Send {count} prices}}",
+ "prices_add_an_item": "Add an item",
+ "prices_add_a_price": "Add a price",
+ "prices_add_a_receipt": "Add a receipt",
+ "prices_add_price_tags": "Add price tags",
+ "prices_barcode_search_not_found": "Product not found",
+ "prices_barcode_search_none_yet": "No product yet",
+ "prices_barcode_search_question": "Do you want to look for this product?",
+ "prices_barcode_search_title": "Product search",
+ "prices_barcode_search_running": "Looking for {barcode}",
+ "@prices_barcode_search_running": {
+ "description": "Dialog title about barcode look-up",
+ "placeholders": {
+ "barcode": {
+ "type": "String"
+ }
+ }
+ },
+ "prices_barcode_reader_action": "Barcode reader",
+ "prices_view_prices": "View the prices",
+ "prices_list_length_one_page": "{count,plural, =0{No price yet} =1{Only one price} other{All {count} prices}}",
+ "@prices_list_length_one_page": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_list_length_many_pages": "Latest {pageSize} prices (total: {total})",
+ "@prices_list_length_many_pages": {
+ "description": "Number of prices for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_one_page": "{count,plural, =0{No proof yet} =1{Only one proof} other{All {count} proofs}}",
+ "@prices_proofs_list_length_one_page": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "count": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_proofs_list_length_many_pages": "Latest {pageSize} proofs (total: {total})",
+ "@prices_proofs_list_length_many_pages": {
+ "description": "Number of proofs for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_users_list_length_many_pages": "Top {pageSize} contributors (total: {total})",
+ "@prices_users_list_length_many_pages": {
+ "description": "Number of users for one-page result",
+ "placeholders": {
+ "pageSize": {
+ "type": "int"
+ },
+ "total": {
+ "type": "int"
+ }
+ }
+ },
+ "prices_amount_subtitle": "Amount",
+ "prices_amount_is_discounted": "Is discounted?",
+ "prices_amount_price_normal": "Price",
+ "prices_amount_price_discounted": "Discounted price",
+ "prices_amount_price_not_discounted": "Original price",
+ "prices_amount_no_product": "One product is missing!",
+ "prices_amount_price_incorrect": "Incorrect value",
+ "prices_amount_price_mandatory": "Mandatory value",
+ "prices_currency_subtitle": "Currency",
+ "prices_date_subtitle": "Date",
+ "prices_location_subtitle": "Shop",
+ "prices_location_find": "Find a shop",
+ "prices_location_mandatory": "You need to select a shop!",
+ "prices_proof_subtitle": "Proof",
+ "prices_proof_find": "Select a proof",
+ "prices_proof_receipt": "Receipt",
+ "prices_proof_price_tag": "Price tag",
+ "prices_proof_mandatory": "You need to select a proof!",
+ "prices_add_validation_error": "Validation error",
+ "prices_privacy_warning_title": "Privacy warning",
+ "prices_privacy_warning_message": "Prices will be public, along with the store they refer to.\nThat might allow people who know about your Open Food Facts pseudonym to:\n* infer in which area you live\n* know what you are buying\nIf you are uneasy with that, please change your pseudonym, or create a new Open Food Facts account and log into the app with it.",
+ "prices_unknown_product": "Unknown product",
+ "@prices_unknown_product": {
+ "description": "Very small text, in the context of prices, to say that the product is unknown"
+ },
"dev_preferences_import_history_result_success": "Done",
"@dev_preferences_import_history_result_success": {
"description": "User dev preferences - Import history - Result successful"
},
+ "dev_mode_section_server": "Server configuration",
+ "dev_mode_section_product_page": "Product page",
+ "dev_mode_section_ui": "User Interface",
+ "dev_mode_section_data": "Data",
+ "dev_mode_section_experimental_features": "Experimental features",
"dev_mode_hide_ecoscore_title": "Exclude Eco-Score",
"@dev_mode_hide_ecoscore_title": {
"description": "User dev preferences - Disable Ecoscore - Title"
},
+ "dev_mode_spellchecker_for_ocr_title": "Use a spellchecker for OCR screens",
+ "@dev_mode_spellchecker_for_ocr_title": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Title"
+ },
+ "dev_mode_spellchecker_for_ocr_subtitle": "(Ingredients and packaging)",
+ "@dev_mode_spellchecker_for_ocr_subtitle": {
+ "description": "User dev preferences - Enable Spellchecker on OCR screens - Subtitle"
+ },
"search_history_item_edit_tooltip": "Reuse and edit this search",
"@search_history_item_edit_tooltip": {
"description": "A tooltip to explain the Pen button near a search term -> it allows to reuse the item"
@@ -1682,6 +1891,38 @@
"@user_search_to_be_completed_title": {
"description": "User search (to be completed): list tile title"
},
+ "user_search_prices_title": "My prices",
+ "@user_search_prices_title": {
+ "description": "User prices: list tile title"
+ },
+ "user_search_proofs_title": "My proofs",
+ "@user_search_proofs_title": {
+ "description": "User proofs: list tile title"
+ },
+ "user_search_proof_title": "My proof",
+ "@user_search_proof_title": {
+ "description": "User proof: page title"
+ },
+ "user_any_search_prices_title": "Contributor prices",
+ "@user_any_search_prices_title": {
+ "description": "User prices (everybody except me): list tile title"
+ },
+ "all_search_prices_latest_title": "Latest Prices added",
+ "@all_search_prices_latest_title": {
+ "description": "Latest prices: list tile title"
+ },
+ "all_search_prices_top_user_title": "Top price contributors",
+ "@all_search_prices_top_user_title": {
+ "description": "Top price users: list tile title"
+ },
+ "all_search_prices_top_location_title": "Stores with the most prices",
+ "@all_search_prices_top_location_title": {
+ "description": "Top price locations: list tile title"
+ },
+ "all_search_prices_top_product_title": "Products with the most prices",
+ "@all_search_prices_top_product_title": {
+ "description": "Top price products: list tile title"
+ },
"all_search_to_be_completed_title": "All to-be-completed products",
"@all_search_to_be_completed_title": {
"description": "All products to be completed: list tile title"
@@ -1948,6 +2189,10 @@
"@image_upload_queued": {
"description": "Message when a photo is queued for upload"
},
+ "add_price_queued": "The price will be sent to the server as soon as possible.",
+ "@add_price_queued": {
+ "description": "Message when an added price is queued for the server"
+ },
"background_task_title_full_refresh": "Starting the refresh of all the products locally stored",
"@background_task_title_full_refresh": {
"description": "Snackbar message when a full refresh is started"
@@ -2462,6 +2707,10 @@
"@country_selector_title": {
"description": "Label written as the title of the dialog to select the user country"
},
+ "currency_selector_title": "Select your currency:",
+ "@currency_selector_title": {
+ "description": "Label written as the title of the dialog to select the user currency"
+ },
"language_selector_title": "Select your language:",
"@language_selector_title": {
"description": "Label written as the title of the dialog to select the user language"
@@ -2488,8 +2737,20 @@
"nutriscore_c": "Nutri-Score C",
"nutriscore_d": "Nutri-Score D",
"nutriscore_e": "Nutri-Score E",
+ "nutriscore_new_formula": "Nutri-Score {letter} (New calculation)",
+ "@nutriscore_new_formula": {
+ "description": "A generic string to define a Nutri-Score V2 with a letter [eg: \"Nutri-Score A (New calculation)\"]",
+ "placeholders": {
+ "letter": {
+ "type": "String"
+ }
+ }
+ },
+ "nutriscore_new_formula_title": "Nutri-Score (New calculation)",
"nutriscore_unknown": "Unknown Nutri-Score",
+ "nutriscore_unknown_new_formula": "Unknown Nutri-Score (New calculation)",
"nutriscore_not_applicable": "Nutri-Score is not applicable",
+ "nutriscore_not_applicable_new_formula": "Nutri-Score is not applicable (New calculation)",
"ecoscore_generic": "Eco-Score",
"ecoscore_a": "Eco-Score A",
"ecoscore_b": "Eco-Score B",
@@ -2510,6 +2771,7 @@
"faq_title_install_beauty": "Install Open Beauty Facts to create a cosmetic database",
"faq_title_install_pet": "Install Open Pet Food Facts to create a pet food database",
"faq_title_install_product": "Install Open Products Facts to create a products database to extend the life of objects",
+ "faq_nutriscore_nutriscore": "New calculation of the Nutri-Score: what's new?",
"contact_title_pro_page": "Pro? Import your products in Open Food Facts",
"contact_title_pro_email": "Producer Contact",
"contact_title_press_page": "Press Page",
@@ -2526,5 +2788,84 @@
"link_cant_be_opened": "This link can't be opened on your device. Please check that you have a browser installed.",
"@link_cant_be_opened": {
"description": "An error may happen if the device doesn't have a browser installed."
+ },
+ "knowledge_panel_page_title_no_title": "Details for {productName}",
+ "@knowledge_panel_page_title_no_title": {
+ "description": "The title of the page when we click on an item in the product page and this page is unnamed",
+ "placeholders": {
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "knowledge_panel_page_title": "Details for {pageName} with {productName}",
+ "@knowledge_panel_page_title": {
+ "description": "The title of the page when we click on an item in the product page",
+ "placeholders": {
+ "pageName": {
+ "type": "String"
+ },
+ "productName": {
+ "type": "String"
+ }
+ }
+ },
+ "guide_title": "Guide",
+ "@guide_title": {
+ "description": "A title for a guide"
+ },
+ "guide_share_label": "Share",
+ "guide_nutriscore_v2_enabled": "true",
+ "@guide_nutriscore_v2_enabled": {
+ "description": "Please NEVER touch this value and let the OFF team change it!"
+ },
+ "guide_nutriscore_v2_title": "The Nutri-Score is evolving: explanations!",
+ "@guide_nutriscore_v2_title": {
+ "description": "The title of the guide (please don't forget the use of non-breaking spaces)"
+ },
+ "guide_nutriscore_v2_file_language": "en",
+ "@guide_nutriscore_v2_file_language": {
+ "description": "The logo is only available in de/en/fr/ln/nl. Please use en if not available (in lowercase, please)."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_title": "What is the Nutri-Score?",
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph1": "The Nutri-Score is a logo which aims to inform you about the **nutritional quality of foods**.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph1": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_what_is_nutriscore_paragraph2": "The color code varies from dark green (**A**) for the **healthiest** products to dark red (**E**) for the **less healthy** ones.",
+ "@guide_nutriscore_v2_what_is_nutriscore_paragraph2": {
+ "description": "Text between asterisks (eg: **My Text**) means text in bold. Please try to keep it."
+ },
+ "guide_nutriscore_v2_nutriscore_a_caption": "The Nutri-Score A logo",
+ "guide_nutriscore_v2_why_v2_title": "Why is Nutri-Score evolving?",
+ "guide_nutriscore_v2_why_v2_intro": "The Nutri-Score formula **is evolving** to provide better recommendations:",
+ "guide_nutriscore_v2_why_v2_arg1_title": "Better evaluate all drinks",
+ "guide_nutriscore_v2_why_v2_arg1_text": "The comparative notes of **milk**, **dairy drinks** with added sugar and **vegetable** drinks were better differentiated in the new algorithm.",
+ "guide_nutriscore_v2_why_v2_arg2_title": "Better ranking of drinks",
+ "guide_nutriscore_v2_why_v2_arg2_text": "The **sugar content** is better taken into account and favors **lowly sweetened** drinks.\\n**Sweeteners will also be penalized**: diet sodas will be downgraded from a B rating to between C and E. Water remains the recommended drink.",
+ "guide_nutriscore_v2_why_v2_arg3_title": "Salt and sugar penalized",
+ "guide_nutriscore_v2_why_v2_arg3_text": "Products **too sweet** or **too salty** will see their **rating further downgraded**.",
+ "guide_nutriscore_v2_why_v2_arg4_title": "Hierarchy within oils and fishes",
+ "guide_nutriscore_v2_why_v2_arg4_text": "The rating of certain **fatty fish** and **oils rich in good fats** will improve.",
+ "guide_nutriscore_v2_why_v2_arg5_title": "Limit red meat",
+ "guide_nutriscore_v2_why_v2_arg5_text": "Consumption of **red meat should be limited**. This is why **poultry will be comparatively better ranked**.",
+ "guide_nutriscore_v2_new_logo_title": "How to differentiate old Nutri-Score and new calculation?",
+ "guide_nutriscore_v2_new_logo_text": "From now on, the logo can display a mention \"**New calculation**\" to clarify that this is indeed the new calculation.",
+ "guide_nutriscore_v2_new_logo_image_caption": "The logo of the new Nutri-Score",
+ "guide_nutriscore_v2_where_title": "Where to find the new Nutri-Score calculation?",
+ "guide_nutriscore_v2_where_paragraph1": "The Nutri-Score is applied in several countries: Germany, Belgium, Spain, France, Luxembourg, the Netherlands and Switzerland.",
+ "guide_nutriscore_v2_where_paragraph2": "Manufacturers have until **2026** at the latest **to replace** the old calculation with the new one.",
+ "guide_nutriscore_v2_where_paragraph3": "Without waiting, you **will already find in the OpenFoodFacts application**, the new calculation, including if the manufacturers have not updated the score.",
+ "guide_nutriscore_v2_unchanged_title": "What doesn't change",
+ "guide_nutriscore_v2_unchanged_paragraph1": "The Nutri-Score is a score designed to **measure nutritional quality**. It is **complementary to the NOVA group** on **ultra-processed foods** (also present in the application).",
+ "guide_nutriscore_v2_unchanged_paragraph2": "For manufacturers, the display of the Nutri-Score **remains optional**.",
+ "guide_nutriscore_v2_share_link": "https://world.openfoodfacts.org/nutriscore-v2",
+ "guide_nutriscore_v2_share_message": "",
+ "@guide_nutriscore_v2_share_message": {
+ "description": "Please let empty for now (maybe use in the future)"
+ },
+ "preview_badge": "Preview",
+ "@preview_badge": {
+ "description": "Badge to indicate that the product is in preview mode (Be careful with this translation)"
}
}
\ No newline at end of file
diff --git a/packages/smooth_app/lib/main.dart b/packages/smooth_app/lib/main.dart
index 8c4e1686d58..f2577ae069e 100644
--- a/packages/smooth_app/lib/main.dart
+++ b/packages/smooth_app/lib/main.dart
@@ -3,7 +3,6 @@ import 'dart:io';
import 'package:app_store_shared/app_store_shared.dart';
import 'package:dart_ping_ios/dart_ping_ios.dart';
-import 'package:device_preview/device_preview.dart';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
@@ -17,6 +16,7 @@ import 'package:provider/single_child_widget.dart';
import 'package:scanner_shared/scanner_shared.dart';
import 'package:sentry_flutter/sentry_flutter.dart';
import 'package:smooth_app/data_models/continuous_scan_model.dart';
+import 'package:smooth_app/data_models/news_feed/newsfeed_provider.dart';
import 'package:smooth_app/data_models/preferences/user_preferences.dart';
import 'package:smooth_app/data_models/product_preferences.dart';
import 'package:smooth_app/data_models/user_management_provider.dart';
@@ -81,14 +81,22 @@ Future launchSmoothApp({
WidgetsFlutterBinding.ensureInitialized();
FlutterNativeSplash.preserve(widgetsBinding: widgetsBinding);
+ _enableEdgeToEdgeMode();
+
if (kReleaseMode) {
await AnalyticsHelper.initSentry(
appRunner: () => runApp(const SmoothApp()));
} else {
- runApp(
- DevicePreview(
- enabled: true,
- builder: (_) => const SmoothApp(),
+ runApp(const SmoothApp());
+ }
+}
+
+void _enableEdgeToEdgeMode() {
+ if (Platform.isAndroid) {
+ SystemChrome.setEnabledSystemUIMode(SystemUiMode.edgeToEdge);
+ SystemChrome.setSystemUIOverlayStyle(
+ const SystemUiOverlayStyle(
+ systemNavigationBarColor: Colors.transparent,
),
);
}
@@ -136,6 +144,7 @@ Future _init1() async {
),
daoString: DaoString(_localDatabase),
);
+ ProductQuery.setQueryType(_userPreferences);
UserManagementProvider().checkUserLoginValidity();
await AnalyticsHelper.linkPreferences(_userPreferences);
@@ -144,7 +153,6 @@ Future _init1() async {
_themeProvider = ThemeProvider(_userPreferences);
_colorProvider = ColorProvider(_userPreferences);
_textContrastProvider = TextContrastProvider(_userPreferences);
- ProductQuery.setQueryType(_userPreferences);
await CameraHelper.init();
await ProductQuery.setUuid(_localDatabase);
@@ -205,8 +213,12 @@ class _SmoothAppState extends State {
// The `create` constructor of [ChangeNotifierProvider] takes care of
// disposing the value.
- ChangeNotifierProvider provide(T value) =>
- ChangeNotifierProvider(create: (BuildContext context) => value);
+ ChangeNotifierProvider provide(T value,
+ {bool? lazy}) =>
+ ChangeNotifierProvider(
+ create: (BuildContext context) => value,
+ lazy: lazy,
+ );
if (!_screenshots) {
// ending FlutterNativeSplash.preserve()
@@ -225,13 +237,19 @@ class _SmoothAppState extends State {
provide(_continuousScanModel),
provide(_permissionListener),
],
- child: AnimationsLoader(
- child: AppNavigator(
- observers: [
- SentryNavigatorObserver(),
- matomoObserver,
- ],
- child: Builder(builder: _buildApp),
+ child: ChangeNotifierProvider