From 34a6a43d359aaf3cd256b8c0e2b07901448b7a3c Mon Sep 17 00:00:00 2001
From: Oliver Walters <oliver.henry.walters@gmail.com>
Date: Wed, 19 May 2021 23:08:44 +1000
Subject: [PATCH] Fixed (most) of the raw text instances

---
 lib/settings/about.dart                 |  4 ++--
 lib/settings/app_settings.dart          | 12 ++++++------
 lib/settings/login.dart                 |  2 +-
 lib/widget/category_display.dart        |  6 +++---
 lib/widget/fields.dart                  |  6 +++---
 lib/widget/home.dart                    | 26 +++++--------------------
 lib/widget/location_display.dart        |  6 +++---
 lib/widget/part_detail.dart             | 17 ++++++++--------
 lib/widget/search.dart                  | 16 +++++++--------
 lib/widget/starred_parts.dart           |  8 +++++---
 lib/widget/stock_detail.dart            |  6 +++---
 lib/widget/stock_item_test_results.dart |  8 ++++----
 12 files changed, 51 insertions(+), 66 deletions(-)

diff --git a/lib/settings/about.dart b/lib/settings/about.dart
index 228ff00b..6d110816 100644
--- a/lib/settings/about.dart
+++ b/lib/settings/about.dart
@@ -116,7 +116,7 @@ class InvenTreeAboutWidget extends StatelessWidget {
     tiles.add(
       ListTile(
         title: Text(I18N.of(context).releaseNotes),
-        subtitle: Text("Display app release notes"),
+        subtitle: Text(I18N.of(context).appReleaseNotes),
         leading: FaIcon(FontAwesomeIcons.fileAlt),
         onTap: () {
           _releaseNotes(context);
@@ -127,7 +127,7 @@ class InvenTreeAboutWidget extends StatelessWidget {
     tiles.add(
       ListTile(
         title: Text(I18N.of(context).credits),
-        subtitle: Text("Additional app credits"),
+        subtitle: Text(I18N.of(context).appCredits),
         leading: FaIcon(FontAwesomeIcons.bullhorn),
         onTap: () {
           _credits(context);
diff --git a/lib/settings/app_settings.dart b/lib/settings/app_settings.dart
index 05302842..355b26cf 100644
--- a/lib/settings/app_settings.dart
+++ b/lib/settings/app_settings.dart
@@ -95,8 +95,8 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
               leading: FaIcon(FontAwesomeIcons.shapes),
             ),
             ListTile(
-              title: Text("Include Subcategories"),
-              subtitle: Text("Display subcategory parts in list view"),
+              title: Text(I18N.of(context).includeSubcategories),
+              subtitle: Text(I18N.of(context).includeSubcategoriesDetail),
               leading: FaIcon(FontAwesomeIcons.sitemap),
               trailing: Switch(
                 value: partSubcategory,
@@ -111,8 +111,8 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
               leading: FaIcon(FontAwesomeIcons.boxes),
             ),
             ListTile(
-              title: Text("Include Sublocations"),
-              subtitle: Text("Display sublocation items in list view"),
+              title: Text(I18N.of(context).includeSublocations),
+              subtitle: Text(I18N.of(context).includeSublocationsDetail),
               leading: FaIcon(FontAwesomeIcons.sitemap),
               trailing: Switch(
                 value: stockSublocation,
@@ -129,7 +129,7 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
             ),
             ListTile(
               title: Text(I18N.of(context).serverError),
-              subtitle: Text("Play audible tone on server error"),
+              subtitle: Text(I18N.of(context).soundOnServerError),
               leading: FaIcon(FontAwesomeIcons.server),
               trailing: Switch(
                 value: serverSounds,
@@ -138,7 +138,7 @@ class _InvenTreeAppSettingsState extends State<InvenTreeAppSettingsWidget> {
             ),
             ListTile(
               title: Text(I18N.of(context).barcodeTones),
-              subtitle: Text("Play audible tones for barcode actions"),
+              subtitle: Text(I18N.of(context).soundOnBarcodeAction),
               leading: FaIcon(FontAwesomeIcons.qrcode),
               trailing: Switch(
                 value: barcodeSounds,
diff --git a/lib/settings/login.dart b/lib/settings/login.dart
index ac10672e..cac0dd9a 100644
--- a/lib/settings/login.dart
+++ b/lib/settings/login.dart
@@ -300,7 +300,7 @@ class _InvenTreeLoginSettingsState extends State<InvenTreeLoginSettingsWidget> {
       // No profile available!
       children.add(
         ListTile(
-          title: Text("No profiles available"),
+          title: Text(I18N.of(context).profileNone),
         )
       );
     }
diff --git a/lib/widget/category_display.dart b/lib/widget/category_display.dart
index 63c2fe4d..5f007277 100644
--- a/lib/widget/category_display.dart
+++ b/lib/widget/category_display.dart
@@ -163,7 +163,7 @@ class _CategoryDisplayState extends RefreshableState<CategoryDisplayWidget> {
     if (category == null) {
       return Card(
         child: ListTile(
-          title: Text("Top level part category"),
+          title: Text(I18N.of(context).partCategoryTopLevel)
         )
       );
     } else {
@@ -248,8 +248,8 @@ class _CategoryDisplayState extends RefreshableState<CategoryDisplayWidget> {
       tiles.add(progressIndicator());
     } else if (_subcategories.length == 0) {
       tiles.add(ListTile(
-        title: Text("No Subcategories"),
-        subtitle: Text("No subcategories available")
+        title: Text(I18N.of(context).noSubcategories),
+        subtitle: Text(I18N.of(context).noSubcategoriesAvailable)
       ));
     } else {
       tiles.add(SubcategoryList(_subcategories));
diff --git a/lib/widget/fields.dart b/lib/widget/fields.dart
index 9878df9f..3fa502b4 100644
--- a/lib/widget/fields.dart
+++ b/lib/widget/fields.dart
@@ -66,13 +66,13 @@ class ImagePickerField extends FormField<File> {
               mainAxisAlignment: MainAxisAlignment.spaceEvenly,
               children: <Widget>[
                 FlatButton(
-                  child: Text("Select Image"),
+                  child: Text(I18N.of(context).selectImage),
                   onPressed: () {
                     _selectFromGallery(state);
                   },
                 ),
                 FlatButton(
-                  child: Text("Take Picture"),
+                  child: Text(I18N.of(context).takePicture),
                   onPressed: () {
                     _selectFromCamera(state);
                   },
@@ -81,7 +81,7 @@ class ImagePickerField extends FormField<File> {
             ),
           );
           return ListTile(
-            title: Text("Select Image"),
+            title: Text(I18N.of(context).selectImage),
           );
         }
       );
diff --git a/lib/widget/home.dart b/lib/widget/home.dart
index b7f9d2f7..014fa2d1 100644
--- a/lib/widget/home.dart
+++ b/lib/widget/home.dart
@@ -104,22 +104,6 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
     });
   }
 
-  void _unsupported() {
-    showDialog(
-        context:  context,
-        child: new SimpleDialog(
-          title: new Text("Unsupported"),
-          children: <Widget>[
-            ListTile(
-              title: Text("This feature is not yet supported"),
-              subtitle: Text("It will be supported in an upcoming release"),
-            )
-          ],
-        )
-    );
-  }
-
-
   void _loadProfile() async {
 
     _profile = await UserProfileDBManager().getSelectedProfile();
@@ -144,8 +128,8 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
     // Tap to select / create a profile
     if (_profile == null) {
       return ListTile(
-        title: Text("No Profile Selected"),
-        subtitle: Text("Tap to create or select a profile"),
+        title: Text(I18N.of(context).profileNotSelected),
+        subtitle: Text(I18N.of(context).profileTapToCreate),
         leading: FaIcon(FontAwesomeIcons.server),
         trailing: FaIcon(
           FontAwesomeIcons.user,
@@ -160,7 +144,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
     // Profile is selected ...
     if (InvenTreeAPI().isConnecting()) {
       return ListTile(
-        title: Text("Connecting to server..."),
+        title: Text(I18N.of(context).serverConnecting),
         subtitle: Text("${InvenTreeAPI().baseUrl}"),
         leading: FaIcon(FontAwesomeIcons.server),
         trailing: Spinner(
@@ -173,7 +157,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
       );
     } else if (InvenTreeAPI().isConnected()) {
       return ListTile(
-        title: Text("Connected to server"),
+        title: Text(I18N.of(context).serverConnected),
         subtitle: Text("${InvenTreeAPI().baseUrl}"),
         leading: FaIcon(FontAwesomeIcons.server),
         trailing: FaIcon(
@@ -186,7 +170,7 @@ class _InvenTreeHomePageState extends State<InvenTreeHomePage> {
       );
     } else {
       return ListTile(
-        title: Text("Could not connect to server"),
+        title: Text(I18N.of(context).serverCouldNotConnect),
         subtitle: Text("${_profile.server}"),
         leading: FaIcon(FontAwesomeIcons.server),
         trailing: FaIcon(
diff --git a/lib/widget/location_display.dart b/lib/widget/location_display.dart
index 30ecf99a..b7765275 100644
--- a/lib/widget/location_display.dart
+++ b/lib/widget/location_display.dart
@@ -183,7 +183,7 @@ class _LocationDisplayState extends RefreshableState<LocationDisplayWidget> {
       if (includeActions) {
         children.add(
             ListTile(
-              title: Text("Parent Category"),
+              title: Text(I18N.of(context).parentCategory),
               subtitle: Text("${location.parentpathstring}"),
               leading: FaIcon(FontAwesomeIcons.levelUpAlt),
               onTap: () {
@@ -286,8 +286,8 @@ List<Widget> detailTiles() {
       tiles.add(SublocationList(_sublocations));
     } else {
       tiles.add(ListTile(
-        title: Text("No Sublocations"),
-        subtitle: Text("No sublocations available")
+        title: Text(I18N.of(context).sublocationNone),
+        subtitle: Text(I18N.of(context).sublocationNoneDetail)
       ));
     }
 
diff --git a/lib/widget/part_detail.dart b/lib/widget/part_detail.dart
index 040bca7c..7c71a90f 100644
--- a/lib/widget/part_detail.dart
+++ b/lib/widget/part_detail.dart
@@ -216,7 +216,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
     if (part.categoryName != null && part.categoryName.isNotEmpty) {
       tiles.add(
         ListTile(
-            title: Text("Part Category"),
+            title: Text(I18N.of(context).partCategory),
             subtitle: Text("${part.categoryName}"),
             leading: FaIcon(FontAwesomeIcons.sitemap),
             onTap: () {
@@ -232,8 +232,8 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
     } else {
       tiles.add(
         ListTile(
-          title: Text("Part Category"),
-          subtitle: Text("Top level part category"),
+          title: Text(I18N.of(context).partCategory),
+          subtitle: Text(I18N.of(context).partCategoryTopLevel),
           leading: FaIcon(FontAwesomeIcons.sitemap),
           onTap: () {
             Navigator.push(context, MaterialPageRoute(builder: (context) => CategoryDisplayWidget(null)));
@@ -261,7 +261,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
       if (part.supplier_count > 0) {
         tiles.add(
           ListTile(
-            title: Text("Suppliers"),
+            title: Text(I18N.of(context).suppliers),
             leading: FaIcon(FontAwesomeIcons.industry),
             trailing: Text("${part.supplier_count}"),
           )
@@ -289,7 +289,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
     if (false && part.isAssembly) {
 
       tiles.add(ListTile(
-        title: Text("Bill of Materials"),
+        title: Text(I18N.of(context).billOfMaterials),
         leading: FaIcon(FontAwesomeIcons.thList),
         trailing: Text("${part.bomItemCount}"),
         onTap: null,
@@ -298,7 +298,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
 
       tiles.add(
           ListTile(
-            title: Text("Building"),
+            title: Text(I18N.of(context).building),
             leading: FaIcon(FontAwesomeIcons.tools),
             trailing: Text("${part.building}"),
             onTap: null,
@@ -344,7 +344,7 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
     // TODO - Add request tests?
     if (false && part.isTrackable) {
       tiles.add(ListTile(
-          title: Text("Required Tests"),
+          title: Text(I18N.of(context).testsRequired),
           leading: FaIcon(FontAwesomeIcons.tasks),
           trailing: Text("${part.testTemplateCount}"),
           onTap: null,
@@ -356,11 +356,10 @@ class _PartDisplayState extends RefreshableState<PartDetailWidget> {
     if (part.notes.isNotEmpty) {
       tiles.add(
           ListTile(
-            title: Text("Notes"),
+            title: Text(I18N.of(context).notes),
             leading: FaIcon(FontAwesomeIcons.stickyNote),
             trailing: Text(""),
             onTap: () {
-              print("Hello");
               Navigator.push(
                 context,
                 MaterialPageRoute(builder: (context) => PartNotesWidget(part))
diff --git a/lib/widget/search.dart b/lib/widget/search.dart
index c2ed7094..1f8a066a 100644
--- a/lib/widget/search.dart
+++ b/lib/widget/search.dart
@@ -157,21 +157,21 @@ class PartSearchDelegate extends SearchDelegate<InvenTreePart> {
 
     if (query.length == 0) {
       return ListTile(
-        title: Text("Enter search query")
+        title: Text(I18N.of(context).queryEnter)
       );
     }
 
     if (query.length < 3) {
       return ListTile(
-        title: Text("Query too short"),
-        subtitle: Text("Enter a query of at least three characters")
+        title: Text(I18N.of(context).queryShort),
+        subtitle: Text(I18N.of(context).queryShortDetail)
       );
     }
 
     if (partResults.length == 0) {
       return ListTile(
         title: Text(I18N.of(context).noResults),
-        subtitle: Text("No results for '${query}'")
+        subtitle: Text(I18N.of(context).queryNoResults + " '${query}'")
       );
     }
 
@@ -340,21 +340,21 @@ class StockSearchDelegate extends SearchDelegate<InvenTreeStockItem> {
 
     if (query.length == 0) {
       return ListTile(
-          title: Text("Enter search query")
+          title: Text(I18N.of(context).queryEnter)
       );
     }
 
     if (query.length < 3) {
       return ListTile(
-          title: Text("Query too short"),
-          subtitle: Text("Enter a query of at least three characters")
+          title: Text(I18N.of(context).queryShort),
+          subtitle: Text(I18N.of(context).queryShortDetail)
       );
     }
 
     if (itemResults.length == 0) {
       return ListTile(
           title: Text(I18N.of(context).noResults),
-          subtitle: Text("No results for '${query}'")
+          subtitle: Text(I18N.of(context).queryNoResults + " '${query}'")
       );
     }
 
diff --git a/lib/widget/starred_parts.dart b/lib/widget/starred_parts.dart
index 3d11cc00..aadccd54 100644
--- a/lib/widget/starred_parts.dart
+++ b/lib/widget/starred_parts.dart
@@ -7,6 +7,8 @@ import 'package:InvenTree/widget/refreshable_state.dart';
 import 'package:flutter/cupertino.dart';
 import 'package:flutter/material.dart';
 
+import 'package:flutter_gen/gen_l10n/app_localizations.dart';
+
 import '../api.dart';
 
 
@@ -24,7 +26,7 @@ class _StarredPartState extends RefreshableState<StarredPartWidget> {
   List<InvenTreePart> starredParts = [];
 
   @override
-  String getAppBarTitle(BuildContext context) => "Starred Parts";
+  String getAppBarTitle(BuildContext context) => I18N.of(context).partsStarred;
 
   @override
   Future<void> request(BuildContext context) async {
@@ -75,8 +77,8 @@ class _StarredPartState extends RefreshableState<StarredPartWidget> {
       return ListView(
         children: [
           ListTile(
-            title: Text("No Parts"),
-            subtitle: Text("No starred parts available")
+            title: Text(I18N.of(context).partsNone),
+            subtitle: Text(I18N.of(context).partsStarredNone)
           )
         ],
       );
diff --git a/lib/widget/stock_detail.dart b/lib/widget/stock_detail.dart
index 1f5e3323..8cddbe38 100644
--- a/lib/widget/stock_detail.dart
+++ b/lib/widget/stock_detail.dart
@@ -410,7 +410,7 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
           ListTile(
             title: Text(I18N.of(context).stockLocation),
             leading: FaIcon(FontAwesomeIcons.mapMarkerAlt),
-            subtitle: Text("No location set"),
+            subtitle: Text(I18N.of(context).locationNotSet),
           )
       );
     }
@@ -508,14 +508,14 @@ class _StockItemDisplayState extends RefreshableState<StockDetailWidget> {
     if (!InvenTreeAPI().checkPermission('stock', 'change')) {
       tiles.add(
         ListTile(
-          title: Text("Permission Required"),
+          title: Text(I18N.of(context).permissionRequired),
           leading: FaIcon(FontAwesomeIcons.userTimes)
         )
       );
 
       tiles.add(
         ListTile(
-          subtitle: Text("Your account does not have permission to perform stock adjustments"),
+          subtitle: Text(I18N.of(context).permissionAccountDenied),
         )
       );
 
diff --git a/lib/widget/stock_item_test_results.dart b/lib/widget/stock_item_test_results.dart
index 7704f6a4..dc2fd7ae 100644
--- a/lib/widget/stock_item_test_results.dart
+++ b/lib/widget/stock_item_test_results.dart
@@ -178,7 +178,7 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
 
     tiles.add(
       ListTile(
-        title: Text("Test Results",
+        title: Text(I18N.of(context).testResults,
           style: TextStyle(fontWeight: FontWeight.bold)
         )
       )
@@ -193,8 +193,8 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
 
     if (results.length == 0) {
       tiles.add(ListTile(
-        title: Text("No Results"),
-        subtitle: Text("No test results available"),
+        title: Text(I18N.of(context).testResultNone),
+        subtitle: Text(I18N.of(context).testResultNoneDetail),
       ));
 
       return tiles;
@@ -254,7 +254,7 @@ class _StockItemTestResultDisplayState extends RefreshableState<StockItemTestRes
 
     if (tiles.isEmpty) {
       tiles.add(ListTile(
-        title: Text("No test results"),
+        title: Text(I18N.of(context).testResultNone),
       ));
     }