diff --git a/android/build.gradle b/android/build.gradle index 1d27960ad..1e12af409 100755 --- a/android/build.gradle +++ b/android/build.gradle @@ -10,23 +10,23 @@ buildscript { mavenLocal() maven { url "https://jitpack.io" } } + dependencies { + classpath 'com.google.gms:google-services:4.3.10' classpath 'com.android.tools.build:gradle:7.4.2' - classpath 'com.google.gms:google-services:4.3.15' classpath 'com.google.firebase:firebase-crashlytics-gradle:2.9.5' classpath 'de.undercouch:gradle-download-task:4.1.1' classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" + // Other dependencies can be added here - // NOTE: Do not place your application dependencies here; they belong - // in the individual module build.gradle files } } allprojects { repositories { google() - jcenter() mavenLocal() + mavenCentral() maven { url "https://jitpack.io" } } } @@ -35,40 +35,33 @@ task clean(type: Delete) { delete rootProject.buildDir } -task checkStyle(type:JavaExec) { +task checkStyle(type: JavaExec) { workingDir = "utils" classpath = files("utils/google-java-format-1.7-all-deps.jar") FileTree tree = fileTree('app/src/main/java') { include '**/*.java' } - args(["-n","--set-exit-if-changed"]) // -n prints filename if using wrong style - tree.each {args += it} - //color codes: "\u001B[33m" - yellow, "\u001B[32m" - green, "\u001B[0m" - reset (Unix) + args(["-n", "--set-exit-if-changed"]) + tree.each { args += it } doFirst { println("You can fix the style of the files below (if any) with " + "\u001B[33m" + "./gradlew applyStyle" + "\u001B[0m") } - doLast { // will only execute on success (exitcode=0) - println ("\u001B[32m" + " -> All java files follow the correct style." + "\u001B[0m") + doLast { + println("\u001B[32m" + " -> All java files follow the correct style." + "\u001B[0m") } } -task checkStyleUnix(type:Exec) { - workingDir 'utils' - commandLine './checkStyle.sh' -} - -task applyStyle(type:JavaExec) { +task applyStyle(type: JavaExec) { workingDir = "utils" classpath = files("utils/google-java-format-1.7-all-deps.jar") FileTree tree = fileTree('app/src/main/java') { include '**/*.java' } - args("-r") // replace cmd, means write changes back to source file - tree.each {args += it} + args("-r") + tree.each { args += it } } -task applyStyleUnix(type:Exec) { - workingDir 'utils' - commandLine './applyStyle.sh' -} +apply plugin: 'com.google.gms.google-services' + + diff --git a/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties index 72029b32d..8049c684f 100755 --- a/android/gradle/wrapper/gradle-wrapper.properties +++ b/android/gradle/wrapper/gradle-wrapper.properties @@ -1,4 +1,3 @@ -#Thu Sep 19 11:12:47 IST 2024 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists distributionUrl=https\://services.gradle.org/distributions/gradle-7.5-bin.zip diff --git a/android/robot/build.gradle b/android/robot/build.gradle index 487229887..73cfebf92 100755 --- a/android/robot/build.gradle +++ b/android/robot/build.gradle @@ -196,4 +196,4 @@ dependencies { exclude group: 'org.apache.httpcomponents' exclude module: 'guava-jdk5' } -} +} \ No newline at end of file diff --git a/android/robot/src/main/java/org/openbot/OpenBotApplication.java b/android/robot/src/main/java/org/openbot/OpenBotApplication.java index 78b0b07e3..cb33b7f5c 100644 --- a/android/robot/src/main/java/org/openbot/OpenBotApplication.java +++ b/android/robot/src/main/java/org/openbot/OpenBotApplication.java @@ -1,17 +1,26 @@ package org.openbot; +import android.app.Activity; import android.app.Application; import android.content.Context; import android.content.SharedPreferences; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.os.Build; + import androidx.annotation.NonNull; import androidx.preference.PreferenceManager; + import org.jetbrains.annotations.NotNull; import org.openbot.vehicle.Vehicle; + +import java.util.Locale; + import timber.log.Timber; public class OpenBotApplication extends Application { - static Context context; + private static Context context; public static Vehicle vehicle; public static Context getContext() { @@ -23,21 +32,61 @@ public void onCreate() { super.onCreate(); context = getApplicationContext(); + // Retrieve selected language from SharedPreferences SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + String languageCode = sharedPreferences.getString("language", "en"); // Default to English + setLocale(languageCode); // Apply the language setting + int baudRate = Integer.parseInt(sharedPreferences.getString("baud_rate", "115200")); vehicle = new Vehicle(this, baudRate); vehicle.initBle(); vehicle.connectUsb(); - vehicle.initBle(); + + // Setup Timber for logging in debug mode if (BuildConfig.DEBUG) { - Timber.plant( - new Timber.DebugTree() { - @NonNull - @Override - protected String createStackElementTag(@NotNull StackTraceElement element) { - return super.createStackElementTag(element) + ":" + element.getLineNumber(); - } - }); + Timber.plant(new Timber.DebugTree() { + @NonNull + @Override + protected String createStackElementTag(@NotNull StackTraceElement element) { + return super.createStackElementTag(element) + ":" + element.getLineNumber(); + } + }); + } + } + + // Set the locale for the application + public void setLocale(String languageCode) { + Locale locale = new Locale(languageCode); + Locale.setDefault(locale); + Resources resources = getResources(); + Configuration config = resources.getConfiguration(); + + // Update the configuration based on the version + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) { + config.setLocale(locale); + config.setLayoutDirection(locale); + getApplicationContext().createConfigurationContext(config); + } else { + config.locale = locale; + config.setLayoutDirection(locale); + } + + resources.updateConfiguration(config, resources.getDisplayMetrics()); + } + + // Method to dynamically refresh the app's language + public void refreshAppLanguage(String languageCode) { + // Save the new language preference + SharedPreferences sharedPreferences = PreferenceManager.getDefaultSharedPreferences(this); + SharedPreferences.Editor editor = sharedPreferences.edit(); + editor.putString("language", languageCode); // Store the new language code + editor.apply(); + + // Set the locale and refresh the UI + setLocale(languageCode); + if (context instanceof Activity) { + Activity activity = (Activity) context; + activity.recreate(); // Restart the activity to apply the new locale settings } } diff --git a/android/robot/src/main/java/org/openbot/common/FeatureList.java b/android/robot/src/main/java/org/openbot/common/FeatureList.java index 4c5cdbf81..2527e574c 100644 --- a/android/robot/src/main/java/org/openbot/common/FeatureList.java +++ b/android/robot/src/main/java/org/openbot/common/FeatureList.java @@ -1,7 +1,7 @@ package org.openbot.common; +import android.content.Context; import java.util.ArrayList; -import org.jetbrains.annotations.NotNull; import org.openbot.R; import org.openbot.model.Category; import org.openbot.model.SubCategory; @@ -10,62 +10,65 @@ public class FeatureList { // region Properties // Global - public static final String ALL = "All"; - public static final String GENERAL = "General"; - public static final String LEGACY = "Legacy"; - public static final String DEFAULT = "Default"; - public static final String PROJECTS = "Projects"; - public static final String CONTROLLER = "Controller"; - public static final String CONTROLLER_MAPPING = "Controller Mapping"; - public static final String ROBOT_INFO = "Robot Info"; + public static final int ALL = R.string.all; + public static final int GENERAL = R.string.general; + public static final int LEGACY = R.string.legacy; + public static final int DEFAULT = R.string.default_t; + public static final int PROJECTS = R.string.projects; + public static final int CONTROLLER = R.string.controller; + public static final int CONTROLLER_MAPPING = R.string.controller_mapping; + public static final int ROBOT_INFO = R.string.robot_info; // Game - public static final String GAME = "Game"; - public static final String FREE_ROAM = "Free Roam"; - public static final String AR_MODE = "AR Mode"; + public static final int GAME = R.string.game; + public static final int FREE_ROAM = R.string.free_roam; + public static final int AR_MODE = R.string.ar_mode; // Data Collection - public static final String DATA_COLLECTION = "Data Collection"; - public static final String LOCAL_SAVE_ON_PHONE = "Local (save On Phone)"; - public static final String EDGE_LOCAL_NETWORK = "Edge (local Network)"; - public static final String CLOUD_FIREBASE = "Cloud (firebase)"; - public static final String CROWD_SOURCE = "Crowd-source (post/accept Data Collection Tasks)"; + public static final int DATA_COLLECTION = R.string.data_collection; + public static final int LOCAL_SAVE_ON_PHONE = R.string.local_save_on_phone; + public static final int EDGE_LOCAL_NETWORK = R.string.edge_local_network; + public static final int CLOUD_FIREBASE = R.string.cloud_firebase; + public static final int CROWD_SOURCE = R.string.crowd_source; // AI - public static final String AI = "AI"; - public static final String AUTOPILOT = "Autopilot"; - public static final String PERSON_FOLLOWING = "Person Following"; - public static final String OBJECT_NAV = "Object Tracking"; - public static final String MODEL_MANAGEMENT = "Model Management"; - public static final String POINT_GOAL_NAVIGATION = "Point Goal Navigation"; - public static final String AUTONOMOUS_DRIVING = "Autonomous Driving"; - public static final String VISUAL_GOALS = "Visual Goals"; - public static final String SMART_VOICE = "Smart Voice (left/right/straight, Ar Core)"; + public static final int AI = R.string.ai; + public static final int AUTOPILOT = R.string.autopilot; + public static final int PERSON_FOLLOWING = R.string.person_following; + public static final int OBJECT_NAV = R.string.object_nav; + public static final int MODEL_MANAGEMENT = R.string.model_management; + public static final int POINT_GOAL_NAVIGATION = R.string.point_goal_navigation; + public static final int AUTONOMOUS_DRIVING = R.string.autonomous_driving; + public static final int VISUAL_GOALS = R.string.visual_goals; + public static final int SMART_VOICE = R.string.smart_voice; // Remote Access - public static final String REMOTE_ACCESS = "Remote Access"; - public static final String WEB_INTERFACE = "Web Interface"; - public static final String ROS = "ROS"; - public static final String FLEET_MANAGEMENT = "Fleet Management"; + public static final int REMOTE_ACCESS = R.string.remote_access; + public static final int WEB_INTERFACE = R.string.web_interface; + public static final int ROS = R.string.ros; + public static final int FLEET_MANAGEMENT = R.string.fleet_management; // Coding - public static final String CODING = "Coding"; - public static final String BLOCK_BASED_PROGRAMMING = "Block-Based Programming"; - public static final String SCRIPTS = "Scripts"; + public static final int CODING = R.string.coding; + public static final int BLOCK_BASED_PROGRAMMING = R.string.block_based_programming; + public static final int SCRIPTS = R.string.scripts; // Research - public static final String RESEARCH = "Research"; - public static final String CLASSICAL_ROBOTICS_ALGORITHMS = "Classical Robotics Algorithms"; - public static final String BACKEND_FOR_LEARNING = "Backend For Learning"; + public static final int RESEARCH = R.string.research; + public static final int CLASSICAL_ROBOTICS_ALGORITHMS = R.string.classical_robotics_algorithms; + public static final int BACKEND_FOR_LEARNING = R.string.backend_for_learning; // Monitoring - public static final String MONITORING = "Monitoring"; - public static final String SENSORS_FROM_CAR = "Sensors from Car"; - public static final String SENSORS_FROM_PHONE = "Sensors from Phone"; - public static final String MAP_VIEW = "Map View"; + public static final int MONITORING = R.string.monitoring; + public static final int SENSORS_FROM_CAR = R.string.sensors_from_car; + public static final int SENSORS_FROM_PHONE = R.string.sensors_from_phone; + public static final int MAP_VIEW = R.string.map_view; // endregion - @NotNull + public static String getString(Context context, int resourceId) { + return context.getString(resourceId); + } + public static ArrayList getCategories() { ArrayList categories = new ArrayList<>(); @@ -82,8 +85,7 @@ public static ArrayList getCategories() { subCategories = new ArrayList<>(); subCategories.add(new SubCategory(AUTOPILOT, R.drawable.ic_autopilot, "#44525F")); subCategories.add(new SubCategory(OBJECT_NAV, R.drawable.ic_person_search, "#E7CE88")); - subCategories.add( - new SubCategory(POINT_GOAL_NAVIGATION, R.drawable.ic_baseline_golf_course, "#1BBFBF")); + subCategories.add(new SubCategory(POINT_GOAL_NAVIGATION, R.drawable.ic_baseline_golf_course, "#1BBFBF")); subCategories.add(new SubCategory(MODEL_MANAGEMENT, R.drawable.ic_list_bulleted_48, "#BC7680")); categories.add(new Category(AI, subCategories)); @@ -91,49 +93,6 @@ public static ArrayList getCategories() { subCategories.add(new SubCategory(DEFAULT, R.drawable.ic_legacy_car, "#F86363")); categories.add(new Category(LEGACY, subCategories)); - /* - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(SMART_VOICE, R.drawable.ic_voice_over)); - subCategories.add(new SubCategory(VISUAL_GOALS, R.drawable.openbot_icon)); - categories.add(new Category(AI, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(CONTROLLER, R.drawable.ic_controller)); - subCategories.add(new SubCategory(FREE_ROAM, R.drawable.ic_game, "#FFFF6D00")); - subCategories.add(new SubCategory(AR_MODE, R.drawable.ic_game, "#B3FF6D00")); - categories.add(new Category(GAME, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(LOCAL_SAVE_ON_PHONE, R.drawable.ic_storage, "#93C47D")); - subCategories.add(new SubCategory(EDGE_LOCAL_NETWORK, R.drawable.ic_network)); - subCategories.add(new SubCategory(CLOUD_FIREBASE, R.drawable.ic_cloud_upload)); - subCategories.add(new SubCategory(CROWD_SOURCE, R.drawable.openbot_icon)); - categories.add(new Category(DATA_COLLECTION, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(WEB_INTERFACE, R.drawable.openbot_icon)); - subCategories.add(new SubCategory(ROS, R.drawable.openbot_icon)); - subCategories.add(new SubCategory(FLEET_MANAGEMENT, R.drawable.openbot_icon)); - categories.add(new Category(REMOTE_ACCESS, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(BLOCK_BASED_PROGRAMMING, R.drawable.ic_code)); - subCategories.add(new SubCategory(SCRIPTS, R.drawable.ic_code)); - categories.add(new Category(CODING, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add( - new SubCategory(CLASSICAL_ROBOTICS_ALGORITHMS, R.drawable.openbot_icon)); - subCategories.add(new SubCategory(BACKEND_FOR_LEARNING, R.drawable.openbot_icon)); - categories.add(new Category(RESEARCH, subCategories)); - - subCategories = new ArrayList<>(); - subCategories.add(new SubCategory(SENSORS_FROM_CAR, R.drawable.ic_electric_car)); - subCategories.add(new SubCategory(SENSORS_FROM_PHONE, R.drawable.ic_phonelink)); - subCategories.add(new SubCategory(MAP_VIEW, R.drawable.ic_map)); - categories.add(new Category(MONITORING, subCategories)); - */ - return categories; } } diff --git a/android/robot/src/main/java/org/openbot/main/CategoryAdapter.java b/android/robot/src/main/java/org/openbot/main/CategoryAdapter.java index 5abdcc143..e81beb8c8 100644 --- a/android/robot/src/main/java/org/openbot/main/CategoryAdapter.java +++ b/android/robot/src/main/java/org/openbot/main/CategoryAdapter.java @@ -5,7 +5,6 @@ import android.widget.TextView; import androidx.recyclerview.widget.LinearLayoutManager; import androidx.recyclerview.widget.RecyclerView; -import java.util.List; import org.jetbrains.annotations.NotNull; import org.openbot.R; import org.openbot.databinding.ItemCategoryBinding; @@ -13,6 +12,8 @@ import org.openbot.model.SubCategory; import org.openbot.utils.MarginItemDecoration; +import java.util.List; + public class CategoryAdapter extends RecyclerView.Adapter { private final List mValues; @@ -27,22 +28,23 @@ public CategoryAdapter(List items, OnItemClickListener it @Override public ViewHolder onCreateViewHolder(@NotNull ViewGroup parent, int viewType) { return new ViewHolder( - ItemCategoryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); + ItemCategoryBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false)); } @Override public void onBindViewHolder(final ViewHolder holder, int position) { holder.mItem = mValues.get(position); - holder.title.setText(mValues.get(position).getTitle()); + // Fetch the title using the getTitle() method with context + holder.title.setText(mValues.get(position).getTitle(holder.itemView.getContext())); holder.subCategoryList.setLayoutManager( - new LinearLayoutManager(holder.itemView.getContext(), RecyclerView.HORIZONTAL, false)); + new LinearLayoutManager(holder.itemView.getContext(), RecyclerView.HORIZONTAL, false)); holder.subCategoryList.setAdapter( - new SubCategoryAdapter(holder.mItem.getSubCategories(), itemClickListener)); + new SubCategoryAdapter(holder.mItem.getSubCategories(), itemClickListener)); if (holder.subCategoryList.getItemDecorationCount() == 0) holder.subCategoryList.addItemDecoration( - new MarginItemDecoration( - (int) - holder.itemView.getContext().getResources().getDimension(R.dimen.feed_padding))); + new MarginItemDecoration( + (int) + holder.itemView.getContext().getResources().getDimension(R.dimen.feed_padding))); } @Override diff --git a/android/robot/src/main/java/org/openbot/main/MainFragment.java b/android/robot/src/main/java/org/openbot/main/MainFragment.java index a6c63e40e..17f383dcc 100644 --- a/android/robot/src/main/java/org/openbot/main/MainFragment.java +++ b/android/robot/src/main/java/org/openbot/main/MainFragment.java @@ -26,9 +26,9 @@ public class MainFragment extends Fragment implements OnItemClickListener subCategories) { - this.title = title; + public Category(int titleResId, List subCategories) { + this.titleResId = titleResId; this.subCategories = subCategories; } - private String title; + // Store the resource ID for the title + private int titleResId; private List subCategories; - public String getTitle() { - return title; + // Getter method for the title using context to get the localized string + public String getTitle(Context context) { + return context.getString(titleResId); // Retrieve the localized string using the resource ID } - public void setTitle(String title) { - this.title = title; + // Setter for the title (although it's now resource-based, this may not be used) + public void setTitle(int titleResId) { + this.titleResId = titleResId; } public List getSubCategories() { diff --git a/android/robot/src/main/java/org/openbot/model/SubCategory.java b/android/robot/src/main/java/org/openbot/model/SubCategory.java index b2bee01c0..39f2405f5 100644 --- a/android/robot/src/main/java/org/openbot/model/SubCategory.java +++ b/android/robot/src/main/java/org/openbot/model/SubCategory.java @@ -2,8 +2,8 @@ public class SubCategory { - public SubCategory(String title, int image, String backgroundColor) { - this.title = title; + public SubCategory(int title, int image, String backgroundColor) { + this.title = String.valueOf(title); this.backgroundColor = backgroundColor; this.image = image; } @@ -35,4 +35,4 @@ public String getBackgroundColor() { public void setBackgroundColor(String backgroundColor) { this.backgroundColor = backgroundColor; } -} +} \ No newline at end of file diff --git a/android/robot/src/main/java/org/openbot/utils/ControlModeMapping.java b/android/robot/src/main/java/org/openbot/utils/ControlModeMapping.java new file mode 100644 index 000000000..61343dbb8 --- /dev/null +++ b/android/robot/src/main/java/org/openbot/utils/ControlModeMapping.java @@ -0,0 +1,26 @@ +package org.openbot.utils; + +import android.content.Context; +import org.openbot.R; + +public class ControlModeMapping { + + private static final String TAG = "ControlModeMapping"; + + public static Enums.ControlMode getControlMode(Context context, String localizedTitle) { + // Match localized strings to the corresponding enums + if (localizedTitle.equals(context.getString(R.string.control_mode_gamepad))) { + return Enums.ControlMode.GAMEPAD; + } else if (localizedTitle.equals(context.getString(R.string.control_mode_phone))) { + return Enums.ControlMode.PHONE; + } else if (localizedTitle.equals(context.getString(R.string.control_mode_webserver))) { + return Enums.ControlMode.WEBSERVER; + } else if (localizedTitle.equals(context.getString(R.string.control_mode_manette))) { + return Enums.ControlMode.MANETTE; + } + + // Fallback case with logging + android.util.Log.e("ControlModeMapping", "Unhandled ControlMode: " + localizedTitle); + return Enums.ControlMode.GAMEPAD; // Provide a safe default + } +} diff --git a/android/robot/src/main/java/org/openbot/utils/DriveModeMapping.java b/android/robot/src/main/java/org/openbot/utils/DriveModeMapping.java new file mode 100644 index 000000000..c466b87fe --- /dev/null +++ b/android/robot/src/main/java/org/openbot/utils/DriveModeMapping.java @@ -0,0 +1,25 @@ +package org.openbot.utils; + +import android.content.Context; +import org.openbot.R; + +public class DriveModeMapping { + + private static final String TAG = "DriveModeMapping"; + + public static Enums.DriveMode getDriveMode(Context context, String localizedTitle) { + // Match localized strings to the corresponding enums + if (localizedTitle.equals(context.getString(R.string.drive_mode_gamepad))) { + return Enums.DriveMode.GAME; + } else if (localizedTitle.equals(context.getString(R.string.drive_mode_joystick))) { + return Enums.DriveMode.JOYSTICK; + } else if (localizedTitle.equals(context.getString(R.string.drive_mode_dual))) { + return Enums.DriveMode.DUAL; + } + + // Fallback case with logging + android.util.Log.e("DriveModeMapping", "Unhandled DriveMode: " + localizedTitle); + return Enums.DriveMode.GAME; // Provide a safe default + } +} + diff --git a/android/robot/src/main/java/org/openbot/utils/Enums.java b/android/robot/src/main/java/org/openbot/utils/Enums.java index fad69aec3..be0cc03cc 100644 --- a/android/robot/src/main/java/org/openbot/utils/Enums.java +++ b/android/robot/src/main/java/org/openbot/utils/Enums.java @@ -4,207 +4,208 @@ import java.util.EnumSet; public class Enums { - public enum SensorType { - ACCELEROMETER("Accelerometer"), - GYROSCOPE("Gyroscope"), - PROXIMITY("Proximity"), - GRAVITY("Gravity"), - MAGNETIC("Magnetic"), - LIGHT("Light"), - PRESSURE("Pressure"), - TEMPERATURE("Temperature"), - GPS("Gps"), - VEHICLE("Vehicle"), - POSE("Pose"), - MOTION("Motion"); - - private String sensor; - - SensorType(String sensor) { - this.sensor = sensor; - } + public enum SensorType { + ACCELEROMETER("Accelerometer"), + GYROSCOPE("Gyroscope"), + PROXIMITY("Proximity"), + GRAVITY("Gravity"), + MAGNETIC("Magnetic"), + LIGHT("Light"), + PRESSURE("Pressure"), + TEMPERATURE("Temperature"), + GPS("Gps"), + VEHICLE("Vehicle"), + POSE("Pose"), + MOTION("Motion"); + + private String sensor; + + SensorType(String sensor) { + this.sensor = sensor; + } - public String getSensor() { - return sensor; + public String getSensor() { + return sensor; + } } - } - public enum LogMode { - ALL_IMGS(0), - CROP_IMG(1), - PREVIEW_IMG(2), - ONLY_SENSORS(3); + public enum LogMode { + ALL_IMGS(0), + CROP_IMG(1), + PREVIEW_IMG(2), + ONLY_SENSORS(3); - private final int value; + private final int value; - LogMode(final int value) { - this.value = value; - } + LogMode(final int value) { + this.value = value; + } - public int getValue() { - return value; + public int getValue() { + return value; + } } - } - public enum ControlMode { - GAMEPAD(0), - PHONE(1), - WEBSERVER(2); - private final int value; + public enum ControlMode { + GAMEPAD(0), + PHONE(1), + WEBSERVER(2), + MANETTE (3); + private final int value; - ControlMode(final int value) { - this.value = value; - } + ControlMode(final int value) { + this.value = value; + } - public int getValue() { - return value; - } + public int getValue() { + return value; + } - public static ControlMode getByID(int value) { - for (final ControlMode element : EnumSet.allOf(ControlMode.class)) { - if (element.value == value) { - return element; + public static ControlMode getByID(int value) { + for (final ControlMode element : EnumSet.allOf(ControlMode.class)) { + if (element.value == value) { + return element; + } + } + return null; } - } - return null; } - } - - public static ControlMode switchControlMode(ControlMode mode) { - switch (mode) { - case GAMEPAD: - return ControlMode.PHONE; - case PHONE: - return ControlMode.WEBSERVER; - case WEBSERVER: - return ControlMode.GAMEPAD; + + public static ControlMode switchControlMode(ControlMode mode) { + switch (mode) { + case GAMEPAD: + return ControlMode.PHONE; + case PHONE: + return ControlMode.WEBSERVER; + case WEBSERVER: + return ControlMode.GAMEPAD; + } + return null; } - return null; - } - public enum SpeedMode { - SLOW(128), - NORMAL(192), - FAST(255); + public enum SpeedMode { + SLOW(128), + NORMAL(192), + FAST(255); - private final int value; + private final int value; - SpeedMode(final int value) { - this.value = value; - } + SpeedMode(final int value) { + this.value = value; + } - public int getValue() { - return value; - } + public int getValue() { + return value; + } - public static SpeedMode getByID(int value) { - for (final SpeedMode element : EnumSet.allOf(SpeedMode.class)) { - if (element.value == value) { - return element; + public static SpeedMode getByID(int value) { + for (final SpeedMode element : EnumSet.allOf(SpeedMode.class)) { + if (element.value == value) { + return element; + } + } + return null; } - } - return null; } - } - public enum DriveMode { - DUAL(0), - GAME(1), - JOYSTICK(2); + public enum DriveMode { + DUAL(0), + GAME(1), + JOYSTICK(2); - private final int value; + private final int value; - DriveMode(final int value) { - this.value = value; - } + DriveMode(final int value) { + this.value = value; + } - public int getValue() { - return value; - } + public int getValue() { + return value; + } - public static DriveMode getByID(int value) { - for (final DriveMode element : EnumSet.allOf(DriveMode.class)) { - if (element.value == value) { - return element; + public static DriveMode getByID(int value) { + for (final DriveMode element : EnumSet.allOf(DriveMode.class)) { + if (element.value == value) { + return element; + } + } + return null; } - } - return null; } - } - - public static DriveMode switchDriveMode(DriveMode mode) { - switch (mode) { - case DUAL: - return DriveMode.GAME; - case GAME: - return DriveMode.JOYSTICK; - case JOYSTICK: - return DriveMode.DUAL; + + public static DriveMode switchDriveMode(DriveMode mode) { + switch (mode) { + case DUAL: + return DriveMode.GAME; + case GAME: + return DriveMode.JOYSTICK; + case JOYSTICK: + return DriveMode.DUAL; + } + return null; } - return null; - } - public enum VehicleIndicator { - LEFT(-1), - STOP(0), - RIGHT(1); + public enum VehicleIndicator { + LEFT(-1), + STOP(0), + RIGHT(1); - private final int value; + private final int value; - VehicleIndicator(final int value) { - this.value = value; - } + VehicleIndicator(final int value) { + this.value = value; + } - public int getValue() { - return value; + public int getValue() { + return value; + } } - } - public enum Direction { - UP(+1), - CYCLIC(0), - DOWN(-1); + public enum Direction { + UP(+1), + CYCLIC(0), + DOWN(-1); - private final int value; + private final int value; - Direction(final int value) { - this.value = value; - } + Direction(final int value) { + this.value = value; + } - public int getValue() { - return value; + public int getValue() { + return value; + } } - } - - public static SpeedMode toggleSpeed(int direction, SpeedMode speedMode) { - if (speedMode != null) - switch (speedMode) { - case SLOW: - if (direction != Enums.Direction.DOWN.getValue()) return SpeedMode.NORMAL; - break; - case NORMAL: - return direction == Enums.Direction.DOWN.getValue() ? SpeedMode.SLOW : SpeedMode.FAST; - case FAST: - if (direction == Enums.Direction.DOWN.getValue()) return SpeedMode.NORMAL; - if (direction == Enums.Direction.CYCLIC.getValue()) return SpeedMode.SLOW; - break; - } - return null; - } - - public enum Preview { - FULL_HD(new Size(1080, 1920)), - HD(new Size(720, 1280)), - SD(new Size(360, 640)); - - private final Size value; - - Preview(final Size value) { - this.value = value; + + public static SpeedMode toggleSpeed(int direction, SpeedMode speedMode) { + if (speedMode != null) + switch (speedMode) { + case SLOW: + if (direction != Enums.Direction.DOWN.getValue()) return SpeedMode.NORMAL; + break; + case NORMAL: + return direction == Enums.Direction.DOWN.getValue() ? SpeedMode.SLOW : SpeedMode.FAST; + case FAST: + if (direction == Enums.Direction.DOWN.getValue()) return SpeedMode.NORMAL; + if (direction == Enums.Direction.CYCLIC.getValue()) return SpeedMode.SLOW; + break; + } + return null; } - public Size getValue() { - return value; + public enum Preview { + FULL_HD(new Size(1080, 1920)), + HD(new Size(720, 1280)), + SD(new Size(360, 640)); + + private final Size value; + + Preview(final Size value) { + this.value = value; + } + + public Size getValue() { + return value; + } } - } } diff --git a/android/robot/src/main/res/values-de/string.xml b/android/robot/src/main/res/values-de/string.xml new file mode 100644 index 000000000..84e275b87 --- /dev/null +++ b/android/robot/src/main/res/values-de/string.xml @@ -0,0 +1,353 @@ + + + OpenBot + OpenBot + Info + Dieses Gerät unterstützt die Camera2 API nicht. + Threads + Kameraberechtigung ist erforderlich + Externe Speicherberechtigung ist erforderlich + Standortberechtigung ist erforderlich + Aufnahmeberechtigung ist erforderlich + um Datensätze zu protokollieren. + um KI-Modelle auszuführen. + um AR Core auszuführen. + um Video zum Controller zu streamen. + um Video vorzuschauen. + um Audio zum Controller zu streamen. + um den Controller zu finden. + um ein Modell aus dem Telefonspeicher auszuwählen. + um alle Funktionen der App zu nutzen. + + Speicher + Standort + Mikrofon + Videostreaming + Streaming-Modus + Verbindungstyp + Konnektivitätsmodus + Sprache + Sprache auswählen + + Gamepads + Telefon + Webserver + Unbekannter + Gamepad + + Gamepad + Joystick + Dual + + + RTSP + USB + de + + Richten Sie Ihr Profil ein, indem Sie sich mit Ihrem Google-Konto anmelden. + Anmeldung mit Google + Profil bearbeiten + Abmelden + + Ups! Keine Projekte gefunden. + Es sieht so aus, als ob es noch keine Projekte in Ihrem Google Drive gibt. + Richten Sie Ihr Profil ein, indem Sie sich mit Ihrem Google-Konto anmelden. + Anmeldung mit Google + Blink-LED-Datei erkannt. Beginnen Sie, den Code auf Ihrem OpenBot auszuführen. + Start + + Vorname + Nachname + Geburtsdatum + E-Mail-Adresse + Änderungen speichern + + Aktualisieren + + Auto stoppen + Zurücksetzen + + Ups! Etwas ist schief gelaufen. Bitte versuchen Sie es erneut. + Fehler + + Sensoren + + Modelldetails + .tflite + Name + Autopilot + Klasse + Typ + Eingabe (B x H) + Fertig + + Verbinden + + Modell 1 + Beschleunigungsmesser + + Unterkategorie + Kategorie + + Alle + Allgemein + Legacy + Controller-Zuordnung + Roboter-Info + + Sensordaten + Protokolldaten + Modellauflösung + Vorschau-Bilder + Trainingsbilder + Verzögerung (ms) + + + Spiel + Freies Erkunden + AR-Modus + Standard + + + Datenaufzeichnung + Lokale Speicherung (auf Telefon speichern) + Edge (lokales Netzwerk) + Cloud (Firebase) + Crowd-Sourcing (Datenaufgaben posten/akzeptieren) + + + KI + Autopilot + Personenverfolgung + Objektverfolgung + Modellverwaltung + Punktzielnavigation + Autonomes Fahren + Visuelle Ziele + Intelligente Stimme (links/rechts/geradeaus, AR Core) + + + Fernzugriff + Web-Oberfläche + ROS + Flottenmanagement + + + Programmierung + Blockbasierte Programmierung + Skripte + + + Forschung + Klassische Robotik-Algorithmen + Backend für Lernen + + + Überwachung + Sensoren vom Auto + Sensoren vom Telefon + Kartenansicht + + VIDEO_PROTOCOL + VIDEO_COMMAND + VIDEO_SERVER_URL + WEB_RTC_EVENT + SWITCH_CAMERA + + Ziel setzen + Befestigen Sie das Telefon am Roboter und geben Sie ein Ziel an. Der Roboter wird versuchen, das Ziel zu erreichen, nachdem Sie Start gedrückt haben. + Start + + Aus + Ein + + Server + Speichern unter + x.x.x.x + Modell + + Gerät + Baudrate + + Protokolleinstellungen + Hinten + + Vorne + Protokollierung + + Keine Protokollierung + + Kein Gerät + + Datenprotokoll + + USB-Verbindung + + Kamera + + Steuerung + Batterie + Geschwindigkeit (l,r) + Sonar + ***,*** + ***,*** U/min + **,* V + *** cm + *** ms + *** fps + *** x *** + Fahrmodus + Geschwindigkeitsmodus + plus + Pfeil + minus + Controller + Steuermodus + Zuschneiden + Rahmen + 1 + Einstellungen + Bluetooth + Geschwindigkeit + Eingabe + Vertrauen + Objekt + Geschwindigkeit + %1$s V + %1$s U/min + %1$s cm + Vorschauauflösung + Speicheroptionen + Ein Modell mit demselben Namen existiert bereits. Möchten Sie es ersetzen? + Datei gefunden + Möchten Sie dieses Modell wirklich löschen? + Bestätigen + Berechtigungen + Ziel erreicht. + Zurückgehen würde den Download abbrechen. Sind Sie sicher? + Modell-Download läuft + Speichern + Sind Sie sicher? + Die App muss neu gestartet werden, damit diese Einstellung wirksam wird + Alles auswählen + Alles löschen + Verfolgung verloren. + Keine anfängliche AR Core-Position. + AR Core-Sitzung pausiert. + Verbindungszeitüberschreitung + Verbindung fehlgeschlagen + Verbindung wurde getrennt + Bitte geben Sie einen Hex-String ein + + Kein Server + + + Autopilot_F + MobileNetV1_1_0_Q + MobileNetV3_S_Q + YoloV4 + + + CPU + GPU + NNAPI + + + 9600 + 14400 + 19200 + 38400 + 57600 + 115200 + 230400 + 460800 + 921600 + + + alle_bilder + bildausschnitt + vorschau_bild + nur_sensoren + + + Gamepad + Standard + Telefon + Touchscreen + Tastatur + + + + + Doppelt + Spiel + Joystick + + + + Niedrig + Mittel + Hoch + + + + Lokaler Speicher + Google Drive + Lokaler Server + + + + + WebRTC + RTSP + + + Bluetooth + USB + + + + Langsam + Normal + Schnell + + Profil + Projekte + Scanner + Startseite + QR-Code scannen + Spielplatz + Platzieren Sie den QR-Code innerhalb des Rahmens zum Scannen. Bitte vermeiden Sie Erschütterungen, um schnell Ergebnisse zu erzielen. + Profil bearbeiten + Abmelden + Automatikmodus + Dynamische Geschwindigkeit + Stoßfänger + N/V + Roboter-Typ: + Indikatoren + Zurück + Spannungsteiler + Status + Vorne + Roboter-Symbol + Radvodometrie Vorne + Radvodometrie Hinten + Rückwärts + Vorwärts + Stopp + Motoren + LEDs + Lichter + Sensoren + Befehle senden + Radvodometrie + Messungen + Lichtregler + Anzeige-LEDs + Hintere LEDs + Status-LEDs + Vordere LEDs + USB + Abbrechen + diff --git a/android/robot/src/main/res/values-fr/string.xml b/android/robot/src/main/res/values-fr/string.xml new file mode 100644 index 000000000..5f710a52a --- /dev/null +++ b/android/robot/src/main/res/values-fr/string.xml @@ -0,0 +1,351 @@ + + + OpenBot + OpenBot + Infos + Cet appareil ne supporte pas l API Camera2. + Threads + L autorisation de la caméra est nécessaire + L autorisation de stockage externe est nécessaire + L autorisation de localisation est nécessaire + L autorisation d enregistrement audio est nécessaire + pour enregistrer les ensembles de données. + pour exécuter des modèles d IA. + pour exécuter AR Core. + pour diffuser la vidéo au contrôleur. + pour prévisualiser la vidéo. + pour diffuser l audio au contrôleur. + pour trouver le contrôleur. + pour sélectionner un modèle depuis le stockage du téléphone. + pour utiliser toutes les fonctionnalités de l application. + + Stockage + Localisation + Microphone + Diffusion Vidéo + Mode de Diffusion + Type de Connexion + Mode de Connectivité + Langue + Choisir la Langue + + Manette de jeu + Téléphone + Serveur Web + Inconnu + Manette + + Manette + Joystick + Double + + RTSP + USB + fr + + Configurez votre profil en vous connectant avec votre compte Google. + Connexion avec Google + Modifier le profil + Déconnexion + + Oups ! Aucun projet trouvé. + Il semble qu il n y ait pas encore de projets dans votre Google Drive. + Configurez votre profil en vous connectant avec votre compte Google. + Connexion avec Google + Fichier LED clignotant détecté. Commencez à exécuter le code sur votre OpenBot. + Démarrer + + Prénom + Nom de famille + Date de naissance + Adresse e-mail + Enregistrer les modifications + + Actualiser + + Arrêter la voiture + Réinitialiser + + Oups ! Une erreur s est produite. Veuillez réessayer. + Erreur + + Capteurs + + Détails du modèle + .tflite + Nom + Pilote automatique + Classe + Type + Entrée (l x h) + Terminé + + Connecter + + Modèle 1 + Accéléromètre + + Sous-catégorie + Catégorie + + Tous + Général + Héritage + Mapping de Contrôleur + Info Robot + + Données du capteur + Données de journal + Résolution du modèle + Images de prévisualisation + Images d entraînement + Délai (ms) + + + Jeu + Libre Exploration + Mode AR + Défaut + + + Collecte de Données + Local (enregistrer sur le téléphone) + Edge (réseau local) + Cloud (Firebase) + Crowd-sourcing (publier/accepter des tâches de collecte de données) + + + IA + Pilote Automatique + Suivi de Personne + Suivi d Objet + Gestion de Modèle + Navigation vers Objectif + Conduite Autonome + Objectifs Visuels + Voix Intelligente (gauche/droite/tout droit, AR Core) + + + Accès à Distance + Interface Web + ROS + Gestion de Flotte + + + Programmation + Programmation Basée sur Blocs + Scripts + + + Recherche + Algorithmes de Robotique Classique + Backend pour l Apprentissage + + + Surveillance + Capteurs de Voiture + Capteurs de Téléphone + Vue de la Carte + PROTOCOLE_VIDEO + COMMANDE_VIDEO + URL_SERVEUR_VIDEO + ÉVÉNEMENT_WEB_RTC + CHANGER_CFFAMÉRA + + Définir un objectif + Montez le téléphone sur le robot et spécifiez un objectif. Le robot essaiera d atteindre l objectif après avoir appuyé sur démarrer. + Démarrer + + Éteint + Allumé + + Serveur + Enregistrer sous + x.x.x.x + Modèle + + Appareil + Débit en bauds + + Paramètres de journalisation + Arrière + + Avant + Journalisation + + Non journalisé + + Aucun appareil + + Journal des données + + Connexion USB + + Caméra + + Contrôle + Batterie + Vitesse (g,d) + Sonar + ***,*** + ***,*** tr/min + **.* V + *** cm + *** ms + *** fps + *** x *** + Mode de conduite + Mode de vitesse + plus + flèche + moins + Contrôleur + Mode de contrôle + Rogner + Cadre + 1 + Paramètres + Bluetooth + Vitesse + Entrée + Confiance + Objet + Vitesse + %1$s V + %1$s tr/min + %1$s cm + Résolution de prévisualisation + Options d enregistrement + Un modèle portant le même nom existe déjà. Voulez-vous le remplacer ? + Fichier trouvé + Êtes-vous sûr de vouloir supprimer ce modèle ? + Confirmer + Autorisations + Objectif atteint. + Revenir en arrière annulerait le téléchargement. Êtes-vous sûr ? + Téléchargement de modèle en cours + Enregistrer + Êtes-vous sûr ? + L application doit être redémarrée pour que ce paramètre prenne effet + Tout sélectionner + Tout effacer + Suivi perdu. + Pas de pose AR Core initiale. + Session AR Core en pause. + délai de connexion dépassé + échec de la connexion + la connexion a été déconnectée + veuillez entrer une chaîne hexadécimale + + Aucun serveur + + + Autopilot_F + MobileNetV1_1_0_Q + MobileNetV3_S_Q + YoloV4 + + + CPU + GPU + NNAPI + + + 9600 + 14400 + 19200 + 38400 + 57600 + 115200 + 230400 + 460800 + 921600 + + + all_imgs + crop_img + preview_img + only_sensors + + + + Manette + Défaut + Téléphone + Écran tactile + Clavier + + + + Double + Jeu + Joystick + + + + Basse + Moyenne + Haute + + + + Stockage local + Google Drive + Serveur local + + + + WebRTC + RTSP + + + Bluetooth + USB + + + Lent + Normal + Rapide + + Profil + Projets + Scanner + Accueil + Scanner le code QR + Terrain de jeu + Placez le code QR à l intérieur du cadre pour scanner. Veuillez éviter les secousses pour obtenir rapidement les résultats. + Modifier le profil + Déconnexion + Mode automatique + Vitesse Dynamique + Pare-chocs + N/D + Type de Robot : + Indicateurs + Retour + Diviseur de Tension + Statut + Avant + Icône du Robot + Odométrie des Roues Avant + Odométrie des Roues Arrière + Reculer + Avancer + Arrêter + Moteurs + LEDs + Lumières + Capteurs + Envoyer des Commandes + Odométrie des Roues + Lectures + Curseur des lumières + LEDs Indicateurs + LEDs Arrière + LEDs de Statut + LEDs Avant + USB + Annuler + + + diff --git a/android/robot/src/main/res/values-zh/string.xml b/android/robot/src/main/res/values-zh/string.xml new file mode 100644 index 000000000..584040818 --- /dev/null +++ b/android/robot/src/main/res/values-zh/string.xml @@ -0,0 +1,353 @@ + + + OpenBot + OpenBot + 信息 + 此设备不支持 Camera2 API。 + 线程 + 需要摄像头权限 + 需要外部存储权限 + 需要位置权限 + 需要录音权限 + 用于记录数据集。 + 用于运行 AI 模型。 + 用于运行 AR Core。 + 用于将视频流传输到控制器。 + 用于预览视频。 + 用于将音频流传输到控制器。 + 用于查找控制器。 + 用于从手机存储中选择模型。 + 用于使用应用程序的所有功能。 + + 存储 + 位置 + 麦克风 + 视频流 + 流模式 + 连接类型 + 连接模式 + 语言 + 选择语言 + + 游戏手柄 + 手机 + 网络服务器 + 未知 + 手柄 + + 游戏手柄 + 摇杆 + 双重 + + RTSP + USB + zh + + 通过使用您的 Google 账户登录来设置您的个人资料。 + 使用 Google 登录 + 编辑个人资料 + 登出 + + 哎呀!未找到项目。 + 看起来您的 Google 云端硬盘中还没有项目。 + 通过使用您的 Google 账户登录来设置您的个人资料。 + 使用 Google 登录 + 检测到 LED 闪烁文件。开始在您的 OpenBot 上执行代码。 + 开始 + + 名字 + 姓氏 + 出生日期 + 电子邮件地址 + 保存更改 + + 刷新 + + 停止汽车 + 重置 + + 哎呀!出现了问题。请重试。 + 错误 + + 传感器 + + 模型详情 + .tflite + 名称 + 自动驾驶 + 类别 + 类型 + 输入(宽 x 高) + 完成 + + 连接 + + 模型 1 + 加速度计 + + 子类别 + 类别 + + 全部 + 通用 + 旧版 + 控制器映射 + 机器人信息 + + 传感器数据 + 日志数据 + 模型分辨率 + 预览图像 + 训练图像 + 延迟(毫秒) + + + 游戏 + 自由漫游 + 增强现实模式 + 默认 + + + 数据收集 + 本地(保存到手机) + 边缘(本地网络) + 云端(Firebase) + 众包(发布/接受数据收集任务) + + + 人工智能 + 自动驾驶 + 跟随人 + 目标跟踪 + 模型管理 + 目标导航 + 自动驾驶 + 视觉目标 + 智能语音(左/右/直行,AR核心) + + + 远程访问 + 网页界面 + 机器人操作系统(ROS) + 车队管理 + + + 编程 + 积木式编程 + 脚本 + + + 研究 + 经典机器人算法 + 学习支持后端 + + + 监控 + 车载传感器 + 手机传感器 + 地图视图 + + 视频协议 + 视频命令 + 视频服务器URL + WEB_RTC事件 + 切换摄像头 + + 设置目标 + 将手机安装在机器人上并指定目标。按下开始后,机器人将尝试达到目标。 + 开始 + + 关闭 + 开启 + + 服务器 + 另存为 + x.x.x.x + 模型 + + 设备 + 波特率 + + 日志设置 + 后置 + + 前置 + 记录中 + + 未记录 + + 无设备 + + 数据日志 + + USB 连接 + + 相机 + + 控制 + 电池 + 速度(左,右) + 声纳 + ***,*** + ***,*** 转每分钟 + **.* 伏特 + *** 厘米 + *** 毫秒 + *** 帧每秒 + *** x *** + 驾驶模式 + 速度模式 + + 箭头 + + 控制器 + 控制模式 + 裁剪 + 框架 + 1 + 设置 + 蓝牙 + 速度 + 输入 + 置信度 + 物体 + 速度 + %1$s 伏特 + %1$s 转每分钟 + %1$s 厘米 + 预览分辨率 + 保存选项 + 同名模型已存在。是否要替换它? + 文件已找到 + 您确定要删除此模型吗? + 确认 + 权限 + 目标已达成。 + 返回将取消下载。您确定吗? + 模型下载进行中 + 保存 + 您确定吗? + 应用程序需要重启才能使此设置生效 + 全选 + 清空所有 + 丢失跟踪。 + 无初始 AR Core 姿态。 + AR Core 会话已暂停。 + 连接超时 + 连接失败 + 连接已断开 + 请输入十六进制字符串 + + 无服务器 + + + Autopilot_F + MobileNetV1_1_0_Q + MobileNetV3_S_Q + YoloV4 + + + CPU + GPU + NNAPI + + + 9600 + 14400 + 19200 + 38400 + 57600 + 115200 + 230400 + 460800 + 921600 + + + 所有图片 + 裁剪图片 + 预览图片 + 仅限传感器 + + + 游戏手柄 + 默认 + 手机 + 触摸屏 + 键盘 + + + + + 双重 + 游戏 + 操纵杆 + + + + + + + + + + 本地存储 + 谷歌云盘 + 本地服务器 + + + + + WebRTC + RTSP + + + 蓝牙 + USB + + + + + 正常 + + + 个人资料 + 项目 + 扫描器 + 主页 + 扫描二维码 + 游乐场 + 将二维码放入框架内进行扫描。请避免抖动,以便快速获得结果。 + 编辑个人资料 + 登出 + 自动模式 + 动态速度 + 防撞器 + 不适用 + 机器人类型: + 指示灯 + 后面 + 电压分压器 + 状态 + 前面 + 机器人图标 + 前轮里程计 + 后轮里程计 + 向后 + 向前 + 停止 + 电动机 + LED灯 + 灯光 + 传感器 + 发送命令 + 轮子里程计 + 读数 + 灯光滑块 + 指示LED灯 + 后LED灯 + 状态LED灯 + 前LED灯 + USB + 取消 + + diff --git a/android/robot/src/main/res/values/refs.xml b/android/robot/src/main/res/values/refs.xml index a6b3daec9..f4eed1104 100644 --- a/android/robot/src/main/res/values/refs.xml +++ b/android/robot/src/main/res/values/refs.xml @@ -1,2 +1,22 @@ - \ No newline at end of file + + + + English + German + Chinese + French + + + + + + en + de + zh + fr + + + + + \ No newline at end of file diff --git a/android/robot/src/main/res/values/strings.xml b/android/robot/src/main/res/values/strings.xml index b3ce8f2b5..b7d490c80 100644 --- a/android/robot/src/main/res/values/strings.xml +++ b/android/robot/src/main/res/values/strings.xml @@ -19,6 +19,137 @@ to select a model from phone storage. to use all features of the app. + Gamepad + Phone + Webserver + Unknown + Manette + + Gamepad + Joystick + Dual + + All + General + Legacy + Controller Mapping + Robot Info + + Game + Free Roam + AR Mode + Default + + Data Collection + Local (save On Phone) + Edge (local Network) + Cloud (firebase) + Crowd-source (post/accept Data Collection Tasks) + + AI + Autopilot + Person Following + Object Tracking + Model Management + Point Goal Navigation + Autonomous Driving + Visual Goals + Smart Voice (left/right/straight, Ar Core) + + Remote Access + Web Interface + ROS + Fleet Management + + Sensor Data + Log Data + Model Resolution + Preview Images + Training Images + Delay (ms) + + Coding + Block-Based Programming + Scripts + + Research + Classical Robotics Algorithms + Backend For Learning + + Monitoring + Sensors from Car + Sensors from Phone + Map View + + VIDEO_PROTOCOL + VIDEO_COMMAND + VIDEO_SERVER_URL + WEB_RTC_EVENT + SWITCH_CAMERA + + Set Goal + Mount the phone on the robot and specify a goal. The robot will try to reach the goal after pressing start. + Start + + Storage + Location + Microphone + Video Streaming + Stream Mode + Connection Type + Connectivity Mode + Language + Select Language + + RTSP + USB + en + + Set up your profile by signing in with your Google account. + Sign-in with Google + Edit Profile + Logout + + Oops! No projects found. + Looks like there are no projects in your google drive yet. + Set up your profile by signing in with your Google account. + Sign-in with Google + Blink LED file detected.Start to execute the code on your OpenBot. + Start + + First Name + Last Name + Date Of Birth + Email Address + Save Changes + + Refresh + + Stop Car + Reset + + Oops! Something went wrong.Please try again. + Error + + Sensors + + Model Details + .tflite + Name + Auto Pilot + Class + Type + Input (w x h) + Done + + Connect + + Model 1 + Accelerometer + + Subcategory + Category + Off On @@ -133,8 +264,12 @@ Gamepad Phone - + Default + Touchscreen + Keyboard + + Dual Game @@ -175,7 +310,7 @@ Scan QR Code Playground Place QR code inside the frame to scan. Please avoid shake to get results quickly. - Edit Profile + Edit Profile Logout Auto Mode Dynamic Speed diff --git a/android/robot/src/main/res/xml/root_preferences.xml b/android/robot/src/main/res/xml/root_preferences.xml index 9d3cf4e85..4e4703dd5 100644 --- a/android/robot/src/main/res/xml/root_preferences.xml +++ b/android/robot/src/main/res/xml/root_preferences.xml @@ -1,46 +1,52 @@ - + app:title="@string/camera" /> + app:title="@string/storage" /> + app:title="@string/location" /> + app:title="@string/microphone" /> - - + - - - + + + + - \ No newline at end of file + +