Compare commits

..

18 Commits

Author SHA1 Message Date
Dennis Guse 374656aa6b Release: v4.9.2 2023-10-10 20:08:19 +02:00
Åzze c623475c95 Translated using Weblate (Finnish)
Currently translated at 92.5% (474 of 512 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/fi/
2023-10-10 06:30:14 +00:00
Hosted Weblate 316e21a2c4 Update translation files
Updated by "Remove blank strings" hook in Weblate.

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/
2023-10-10 06:30:13 +00:00
mondstern 9dedfb38bc Translated using Weblate (Catalan)
Currently translated at 0.8% (1 of 120 strings)

Translation: OpenTracks/App store metadata files
Translate-URL: https://hosted.weblate.org/projects/opentracks/app-store-metadata-files/ca/
2023-10-10 06:30:12 +00:00
plum7x eb7552acdb Translated using Weblate (Chinese (Traditional))
Currently translated at 99.2% (508 of 512 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/zh_Hant/
2023-10-10 06:30:12 +00:00
ovl-1 79729cd4a7 Translated using Weblate (Norwegian Bokmål)
Currently translated at 97.2% (498 of 512 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/nb_NO/
2023-10-10 06:30:11 +00:00
mondstern 12c2c7cae0 Translated using Weblate (Catalan)
Currently translated at 52.5% (269 of 512 strings)

Translation: OpenTracks/opentracks.src-main-res-values-strings-xml--main
Translate-URL: https://hosted.weblate.org/projects/opentracks/opentracks-src-main-res-values-strings-xml-main/ca/
2023-10-10 06:30:10 +00:00
Dennis Guse 504e27a9df Android12+: use user-defined DynamicColors. 2023-10-10 08:29:32 +02:00
Dennis Guse 5fbc079d96 Android12+: use user-defined DynamicColors. 2023-10-10 08:25:05 +02:00
Dennis Guse 54fb70053c Settings: use category for recording UI settings. 2023-10-10 08:25:05 +02:00
Dennis Guse ea7d754482 Bugfix: voice announcement setting for total distance was removed. 2023-10-10 08:25:05 +02:00
Dennis Guse 1647b821e6 Bump com.android.tools.build:gradle from 8.1.0-beta04 to 8.1.0-beta06 2023-10-10 08:25:05 +02:00
Dennis Guse 5ced5e2c0b Cleanup: remove unused method. 2023-10-10 07:37:05 +02:00
Dennis Guse 31ea1348de Predictive back: enable.
Part of #1708.
2023-10-10 07:37:05 +02:00
Dennis Guse 3995e2b609 Upgrade to Gradlew 8.4.0 2023-10-09 08:12:56 +02:00
dependabot[bot] eddf6ffc04 Bump org.mockito:mockito-android from 5.5.0 to 5.6.0
Bumps [org.mockito:mockito-android](https://github.com/mockito/mockito) from 5.5.0 to 5.6.0.
- [Release notes](https://github.com/mockito/mockito/releases)
- [Commits](https://github.com/mockito/mockito/compare/v5.5.0...v5.6.0)

---
updated-dependencies:
- dependency-name: org.mockito:mockito-android
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-10-09 08:10:58 +02:00
Leon Marz 88b860af5a Marker List: Fix crashes in selection mode 2023-10-08 14:20:40 +02:00
Leon Marz 1708e09c5a Change missing line for afbe94195c 2023-10-08 14:20:40 +02:00
22 changed files with 184 additions and 149 deletions
+4 -4
View File
@@ -6,7 +6,7 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:8.2.0-beta04'
classpath 'com.android.tools.build:gradle:8.2.0-beta06'
}
}
@@ -64,8 +64,8 @@ android {
defaultConfig {
applicationId "de.dennisguse.opentracks"
versionCode 5447
versionName "v4.9.1"
versionCode 5465
versionName "v4.9.2"
buildConfigField "String", "VERSION_NAME_FULL", "\"${getVersionName()}\""
@@ -141,7 +141,7 @@ dependencies {
androidTestImplementation 'androidx.test:rules:1.5.0'
androidTestImplementation 'androidx.test:runner:1.5.2'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.5.1'
androidTestImplementation 'org.mockito:mockito-android:5.5.0'
androidTestImplementation 'org.mockito:mockito-android:5.6.0'
androidTestUtil 'androidx.test:orchestrator:1.4.2'
}
@@ -0,0 +1 @@
Un amic rastrejador esportiu que respecta la vostra privadesa.
@@ -0,0 +1,9 @@
v4.9.2: OpenTracks
Changes:
- Option to use Android 12's Dynamic Color (Material Design)
- Android 14's Predictive Back for some activities
Bugfix:
- Settings for total distance voice announcement was accidentially removed
Binary file not shown.
+1 -1
View File
@@ -1,6 +1,6 @@
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-bin.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-8.4-all.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
Vendored
+2 -1
View File
@@ -83,7 +83,8 @@ done
# This is normally unused
# shellcheck disable=SC2034
APP_BASE_NAME=${0##*/}
APP_HOME=$( cd "${APP_HOME:-./}" && pwd -P ) || exit
# Discard cd standard output in case $CDPATH is set (https://github.com/gradle/gradle/issues/25036)
APP_HOME=$( cd "${APP_HOME:-./}" > /dev/null && pwd -P ) || exit
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD=maximum
+1
View File
@@ -69,6 +69,7 @@ limitations under the License.
android:allowBackup="true"
android:fullBackupContent="@xml/backup_rules_30_lower"
android:dataExtractionRules="@xml/backup_rules_31_higher"
android:enableOnBackInvokedCallback="true"
android:hardwareAccelerated="true"
android:hasFragileUserData="false"
android:icon="@drawable/ic_launcher"
@@ -40,7 +40,7 @@ public abstract class AbstractActivity extends AppCompatActivity {
@Override
public boolean onSupportNavigateUp() {
onBackPressed();
getOnBackPressedDispatcher().onBackPressed();
return true;
}
@@ -7,6 +7,8 @@ import android.os.Build;
import android.os.StrictMode;
import android.util.Log;
import com.google.android.material.color.DynamicColors;
import java.lang.reflect.Method;
import de.dennisguse.opentracks.settings.PreferencesUtils;
@@ -28,6 +30,11 @@ public class Startup extends Application {
// Include version information into stack traces.
Log.i(TAG, BuildConfig.APPLICATION_ID + "; BuildType: " + BuildConfig.BUILD_TYPE + "; VersionName: " + BuildConfig.VERSION_NAME + "/" + BuildConfig.VERSION_NAME_FULL + " VersionCode: " + BuildConfig.VERSION_CODE);
// In debug builds: show thread and VM warnings.
if (BuildConfig.DEBUG) {
Log.d(TAG, "Enabling strict mode");
StrictMode.enableDefaults();
}
PreferencesUtils.initPreferences(this, getResources());
// Set default values of preferences on first start.
@@ -35,11 +42,8 @@ public class Startup extends Application {
PreferencesUtils.applyDefaultUnit();
PreferencesUtils.applyNightMode();
// In debug builds: show thread and VM warnings.
if (BuildConfig.DEBUG) {
Log.d(TAG, "Enabling strict mode");
StrictMode.enableDefaults();
if (PreferencesUtils.shouldUseDynamicColors()) {
DynamicColors.applyToActivitiesIfAvailable(this);
}
}
@@ -307,6 +307,11 @@ public class PreferencesUtils {
return getBoolean(R.string.stats_fullscreen_while_recording_key, DEFAULT);
}
public static boolean shouldUseDynamicColors() {
final boolean DEFAULT = resources.getBoolean(R.bool.settings_ui_dynamic_colors_default);
return getBoolean(R.string.settings_ui_dynamic_colors_key, DEFAULT);
}
public static boolean shouldVoiceAnnouncementOnDeviceSpeaker() {
final boolean DEFAULT = resources.getBoolean(R.bool.voice_on_device_speaker_default);
return getBoolean(R.string.voice_on_device_speaker_key, DEFAULT);
@@ -2,6 +2,7 @@ package de.dennisguse.opentracks.settings;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Build;
import android.os.Bundle;
import androidx.fragment.app.DialogFragment;
@@ -34,6 +35,9 @@ public class UserInterfaceSettingsFragment extends PreferenceFragmentCompat {
return true;
});
Preference dynamicColors = findPreference(getString(R.string.settings_ui_dynamic_colors_key));
dynamicColors.setEnabled(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU);
setShowOnMapFormatOptions();
}
@@ -245,7 +245,7 @@ public class TrackListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHold
viewBinding.trackListItemCategoryDescription.setText(categoryDescription);
viewBinding.trackListItemCategoryDescription.setVisibility("".equals(categoryDescription) ? View.GONE : View.VISIBLE);
setSelected(selection.get(getLayoutPosition()));
setSelected(selection.get((int) getId()));
}
public void setSelected(boolean isSelected) {
@@ -113,13 +113,13 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
@Override
public boolean onPrepareActionMode(ActionMode actionMode, Menu menu) {
selectionMode = true;
actionModeCallback.onPrepare(menu, getCheckedPositions(), getCheckedIds(), true);
actionModeCallback.onPrepare(menu, null, getCheckedIds(), true);
return true;
}
@Override
public boolean onActionItemClicked(ActionMode actionMode, MenuItem menuItem) {
if (actionModeCallback.onClick(menuItem.getItemId(), getCheckedPositions(), getCheckedIds())) {
if (actionModeCallback.onClick(menuItem.getItemId(), null, getCheckedIds())) {
actionMode.finish();
}
return true;
@@ -130,37 +130,31 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
selectionMode = false;
setAllSelected(false);
selection.clear();
actionModeCallback.onDestroy();
}
public void setAllSelected(boolean isSelected) {
for (int i = 0; i < getItemCount(); i++) {
ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(i);
if (isSelected) {
for (Marker marker : markers) {
selection.put((int) marker.getId().id(), true);
}
} else {
selection.clear();
}
for (int i = 0; i < recyclerView.getChildCount(); i++) {
ViewHolder holder = (ViewHolder) recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
holder.setSelected(isSelected);
}
}
private int[] getCheckedPositions() {
List<Integer> positions = new ArrayList<>();
for (int i = 0; i < selection.size(); i++) {
if (selection.valueAt(i)) {
positions.add(selection.keyAt(i));
}
}
return positions.stream().mapToInt(i -> i).toArray();
}
private long[] getCheckedIds() {
List<Long> ids = new ArrayList<>();
for (int i = 0; i < selection.size(); i++) {
if (selection.valueAt(i)) {
ViewHolder holder = (ViewHolder) recyclerView.findViewHolderForLayoutPosition(selection.keyAt(i));
ids.add(holder.getId());
ids.add((long) selection.keyAt(i));
}
}
@@ -209,11 +203,11 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
String categoryDescription = StringUtils.getCategoryDescription(marker.getCategory(), marker.getDescription());
viewBinding.markerListItemTimeDistance.setText(categoryDescription);
setSelected(selection.get(getLayoutPosition()));
setSelected(selection.get((int) getId()));
}
public void setSelected(boolean isSelected) {
selection.put(getLayoutPosition(), isSelected);
selection.put((int) getId(), isSelected);
view.setActivated(isSelected);
}
@@ -235,8 +229,12 @@ public class MarkerListAdapter extends RecyclerView.Adapter<RecyclerView.ViewHol
@Override
public boolean onLongClick(View view) {
actionMode = context.startSupportActionMode(MarkerListAdapter.this);
setSelected(true);
setSelected(!view.isActivated());
if (!selectionMode) {
actionMode = context.startSupportActionMode(MarkerListAdapter.this);
} else {
actionMode.invalidate();
}
return true;
}
}
@@ -9,77 +9,16 @@ import android.os.Build;
import android.os.VibrationEffect;
import android.os.Vibrator;
import android.util.Log;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.AbsListView;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.appcompat.widget.SearchView;
import java.util.ArrayList;
import de.dennisguse.opentracks.R;
public class ActivityUtils {
private static final String TAG = ActivityUtils.class.getSimpleName();
public static void configureListViewContextualMenu(final ListView listView, final ContextualActionModeCallback contextualActionModeCallback) {
listView.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);
listView.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.getMenuInflater().inflate(R.menu.list_context_menu, menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
contextualActionModeCallback.onPrepare(menu, getCheckedPositions(listView), listView.getCheckedItemIds(), true);
return true;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
contextualActionModeCallback.onDestroy();
}
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
mode.invalidate();
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (contextualActionModeCallback.onClick(item.getItemId(), getCheckedPositions(listView), listView.getCheckedItemIds())) {
mode.finish();
}
return true;
}
/**
* Gets the checked positions in a list view.
*
* @param list the list view
*/
private int[] getCheckedPositions(ListView list) {
SparseBooleanArray positions = list.getCheckedItemPositions();
ArrayList<Integer> arrayList = new ArrayList<>();
for (int i = 0; i < positions.size(); i++) {
int key = positions.keyAt(i);
if (positions.valueAt(i)) {
arrayList.add(key);
}
}
return arrayList.stream().mapToInt(i -> i).toArray();
}
});
}
public static SearchView configureSearchWidget(Activity activity, final MenuItem menuItem) {
final SearchView searchView = (SearchView) menuItem.getActionView();
SearchManager searchManager = (SearchManager) activity.getSystemService(Context.SEARCH_SERVICE);
+31 -15
View File
@@ -30,7 +30,7 @@ limitations under the License.
<string name="activity_type_driving_bus">conducció d\'autobús</string>
<string name="activity_type_driving_car">conducció de cotxe</string>
<string name="activity_type_ferry">ferri</string>
<string name="activity_type_frisbee">frisbee</string>
<string name="activity_type_frisbee">el frisbee</string>
<string name="activity_type_gliding">ala delta</string>
<string name="activity_type_hang_gliding">vol amb ala delta</string>
<string name="activity_type_helicopter">helicòpter</string>
@@ -75,7 +75,7 @@ limitations under the License.
<string name="activity_type_trail_hiking">ruta de senderisme</string>
<string name="activity_type_trail_running">cursa de muntanya</string>
<string name="activity_type_train">tren</string>
<string name="activity_type_ultimate_frisbee">ultimate frisbee</string>
<string name="activity_type_ultimate_frisbee">frisbee definitiu</string>
<string name="activity_type_unknown">desconegut</string>
<string name="activity_type_wakeboarding">esquí-surf</string>
<string name="activity_type_walking">caminar</string>
@@ -121,9 +121,9 @@ limitations under the License.
<string name="generic_save">Desa</string>
<string name="generic_tracks">Rutes</string>
<!-- Gps -->
<string name="gps_starting">El GPS s\'està iniciant.</string>
<string name="gps_wait_for_better_signal">S\'està esperant un senyal GPS de millor qualitat.</string>
<string name="gps_wait_for_signal">S\'està esperant el senyal GPS.</string>
<string name="gps_starting">S \' està iniciant EL GPS</string>
<string name="gps_wait_for_better_signal">Esperant un millor senyal GPS</string>
<string name="gps_wait_for_signal">Esperant el senyal GPS</string>
<!-- Image -->
<string name="image_arrow">Fletxa</string>
<string name="image_marker_count">Recompte de marcadors</string>
@@ -135,23 +135,23 @@ limitations under the License.
<string name="import_progress_message">S\'està important des de %1$s…</string>
<!-- Marker -->
<string name="marker_add_error">No es pot inserir un marcador. No hi ha senyal del GPS. Torneu-ho a provar.</string>
<string name="marker_add_success">S\'ha inserit un marcador.</string>
<string name="marker_add_canceled">L\'acció s\'ha cancel·lat. No s\'ha afegit cap marcador.</string>
<string name="marker_delete_one_confirm_message">El marcador se suprimirà definitivament del dispositiu.</string>
<string name="marker_add_success">S\'ha inserit un marcador</string>
<string name="marker_add_canceled">Cancelat, no s \' ha afegit cap marcador</string>
<string name="marker_delete_one_confirm_message">El marcador se suprimirà permanentment del dispositiu</string>
<string name="marker_delete_one_confirm_title">Voleu suprimir el marcador?</string>
<string name="marker_delete_multiple_confirm_message">Els marcadors seleccionats se suprimiran definitivament del dispositiu.</string>
<string name="marker_delete_multiple_confirm_message">Els marcadors seleccionats se suprimiran permanentment del dispositiu</string>
<string name="marker_name_format">Marcador %1$d</string>
<string name="marker_title">%1$d de %2$d</string>
<!-- Marker Detail -->
<!-- Marker Edit -->
<string name="marker_edit_marker_type">Tipus de marcador (p. ex. cascada)</string>
<!-- Marker List -->
<string name="marker_list_empty_message">No teniu cap marcador.</string>
<string name="marker_list_empty_message">No teniu cap marcador</string>
<!-- Menu -->
<string name="menu_aggregated_statistics">Estadístiques globals</string>
<string name="menu_delete">Suprimeix</string>
<string name="menu_edit">Edita</string>
<string name="menu_export_all">Exporta-ho tot</string>
<string name="menu_export_all">Exporta-ho tot (un fitxer per pista)</string>
<string name="menu_help">ajuda</string>
<string name="menu_import_all">Importa-ho tot</string>
<string name="menu_insert_marker">Insereix un marcador</string>
@@ -176,7 +176,7 @@ limitations under the License.
<string name="settings_chart_by_time">Per temps</string>
<string name="settings_recording_default_activity_title">Activitat predeterminada</string>
<string name="settings_recording_location_frequency_summary">%1$s entre ubicacions registrades</string>
<string name="settings_recording_max_recording_distance_summary">Es crea un tram si la distància entre dues ubicacions és superior a %1$s.</string>
<string name="settings_recording_max_recording_distance_summary">Es crea un segment nou si la distància entre dues ubicacions és més gran que %1$s</string>
<string name="settings_recording_max_recording_distance_title">Distància màxima</string>
<string name="settings_recording_min_recording_distance_title">Interval de distàncies</string>
<string name="settings_recording_min_recording_interval_title">Interval de temps</string>
@@ -188,7 +188,7 @@ limitations under the License.
<!-- Settings Reset -->
<string name="settings_reset_confirm_message">Es tornaran a definir els valors predeterminats de la configuració.</string>
<string name="settings_reset_confirm_title">Voleu restablir-ho ara?</string>
<string name="settings_reset_done">S\'ha recuperat la configuració predeterminada.</string>
<string name="settings_reset_done">Tots els paràmetres s\'han revertit als valors predeterminats</string>
<!-- Settings Sensor -->
<!-- Settings Stats -->
<string name="settings_stats_rate_title">Mesura preferida</string>
@@ -196,7 +196,9 @@ limitations under the License.
<string name="settings_stats_units_metric">Sistema mètric (km, m)</string>
<string name="settings_stats_units_title">Unitats preferides</string>
<!-- Share Track -->
<string name="share_track_share_file_body">Crec que aquesta ruta et podria interessar.\n\nLa pots veure amb Google Earth o qualsevol altre programari de mapatge.\n\n%1$s</string>
<string name="share_track_share_file_body">Crec que aquesta ruta et podria interessar.
\n
\n%1$s</string>
<string name="share_track_subject">Vull compartir una ruta amb tu</string>
<!-- Stats -->
<string name="stats_average_moving_pace">Ritme de moviment mitjà</string>
@@ -228,7 +230,7 @@ limitations under the License.
<string name="track_edit_activity_type">Tipus d\'activitat (p. ex. senderisme)</string>
<string name="track_edit_activity_type_hint">Tipus d\'activitat</string>
<!-- Track List -->
<string name="track_list_empty_message">Comenceu a enregistrar aquí la vostra pròxima aventura.</string>
<string name="track_list_empty_message">Comença a gravar la teva propera aventura aquí</string>
<!-- Track Widget -->
<!-- Tracks -->
<!-- Unit -->
@@ -308,4 +310,18 @@ limitations under the License.
<!-- Share image -->
<string name="share_image_subject">Vull compartir una imatge amb tu</string>
<string name="share_image_body">Crec que aquesta imatge et podria interessar.</string>
<string name="about_libraries">Biblioteques</string>
<string name="help_feature_content">* crear pistes GPS
\n * utilitzeu un sensor de freqüència cardíaca (Només Bluetooth le)
\n * anuncis de veu (per temps o distància)
\n * creeu marcadors (incl. imatges)
\n * funciona completament fora de línia
\n * mostra les pistes en un mapa (vegeu més avall)</string>
<string name="about_version_name">Nom de la versió: %1$s</string>
<string name="about_preference_title">Sobre OpenTracks</string>
<string name="help_track_export_title">Com puc exportar/compartir pistes gravades\?</string>
<string name="help_feature_title">OpenTracks té les següents característiques:</string>
<string name="help_track_map_title">Com mostrar una pista en un mapa\?</string>
<string name="about_version_code">Codi de versió: %1$d</string>
<string name="about_third_party_data">Dades de tercers</string>
</resources>
+22
View File
@@ -535,4 +535,26 @@ limitations under the License.
<string name="settings_announcements_statistics_title">Ääni-ilmoitukset</string>
<string name="settings_announcements_summary">Aika, etäisyys, äänennopeus</string>
<string name="settings_gps_summary">Aikaväli, etäisyysväli, maksimietäisyys, tarkkuus</string>
<string name="activity_type_workout">treeni</string>
<string name="help_data_google_play_services_content">Ei</string>
<string name="settings_public_api_package_title">Julkisen API:n paketin nimi</string>
<string name="voice_on_device_speaker_title">Käytä laitteen kaiutinta</string>
<string name="settings_announcements_average_heart_rate">Keskimääräinen syke</string>
<string name="description_pace_nautical">Tahti (min/NM)</string>
<string name="settings_stats_units_nautical">Merenkulku (NM, ft)</string>
<string name="settings_announcements_lap_heart_rate">Kierroksen syke</string>
<string name="no_compatible_camera_installed">Yhteensopivaa kamerasovellusta ei ole asennettu</string>
<string name="settings_api_summary">Kaukosäädin ja tilastosovellusliittymä muille sovelluksille</string>
<string name="no_compatible_gallery_installed">Yhteensopivaa kuvagalleriasovellusta ei ole asennettu</string>
<string name="show_on_dashboard_not_installed">OpenTracks Dashboard API -sovellusliittymää tukevia sovelluksia ei ole asennettu.</string>
<string name="settings_sensor_bluetooth_service_filter_off">Näytä kaikki löydettävissä olevat Bluetooth-laitteet</string>
<string name="settings_api_title">Julkinen API</string>
<string name="value_float_mile_hour_recommended">%1$.1f mi/h (suositus)</string>
<string name="value_float_kilometer_hour_recommended">%1$.1f km/h (suositus)</string>
<string name="sensor_state_cadence_unit">rpm</string>
<string name="introduction_osm_dashboard">OpenTracks itsessään ei tarjoa karttaa. Asenna OSMDashboard nähdäksesi tallenteet kartalla.</string>
<string name="permission_bluetooth_failed_rejected">Sinun on manuaalisesti myönnettävä OpenTracks-käyttöoikeus lähellä oleville laitteille järjestelmäasetuksissa.</string>
<string name="settings_recording_min_required_accuracy_summary">Sijainti ohitetaan, jos sen tarkkuus on suurempi kuin %1$s</string>
<string name="value_int_seconds">%1$d s (suositus)</string>
<string name="settings_sensor_bluetooth_service_filter_title">Suodata Bluetooth-laitteet</string>
</resources>
+1
View File
@@ -579,4 +579,5 @@ limitations under the License.
<string name="voiceIdle">Blir inaktiv.</string>
<string name="settings_announcements_idle_title">Inaktivitet</string>
<string name="settings_recording_idle_timeout_title">Inaktivitetsterskel</string>
<string name="activity_type_kickscooter">sparkesykkel</string>
</resources>
+22 -5
View File
@@ -232,7 +232,7 @@ limitations under the License.
<string name="generic_to">至</string>
<string name="generic_today">今日</string>
<string name="generic_yesterday">昨日</string>
<string name="generic_dismiss">Dismiss</string>
<string name="generic_dismiss">關閉</string>
<!-- Gps -->
<string name="gps_starting">正在啟用 GPS</string>
<string name="gps_wait_for_better_signal">正在等待更清晰的 GPS 訊號</string>
@@ -247,7 +247,7 @@ limitations under the License.
<string name="image_photo_marker">相片標記</string>
<string name="image_record">記錄</string>
<string name="image_stop">停止</string>
<string name="image_discard">Discard</string>
<string name="image_discard">丟棄</string>
<string name="image_track">蹤跡</string>
<!-- Import -->
<string name="import_thread_interrupted">執行緒中斷</string>
@@ -312,7 +312,6 @@ limitations under the License.
<string name="sensor_state_heart_rate">心率</string>
<string name="sensor_state_heart_rate_avg">平均心率</string>
<string name="sensor_state_heart_rate_max">最大心率</string>
<string name="sensor_state_heart_rate_value">%1$d bpm</string>
<string name="sensor_state_power">功率</string>
<string name="sensor_state_power_avg">平均功率</string>
<string name="sensor_could_not_scan">無法掃描藍牙裝置 (錯誤 %1$i).</string>
@@ -419,8 +418,10 @@ limitations under the License.
<string name="settings_export_section">匯出</string>
<string name="settings_prevent_reimport_tracks_title">防止重新匯入蹤跡</string>
<!-- Share Track -->
<string name="share_track_share_file_body">你應該會喜歡這個蹤跡。\n\n請使用 Google 地球或其他地圖繪製軟體查看蹤跡。\n\n%1$s</string>
<string name="share_track_subject">我想跟你分享蹤跡資訊。</string>
<string name="share_track_share_file_body">我想您應該會對這個路線感興趣。
\n
\n%1$s</string>
<string name="share_track_subject">我想跟你分享蹤跡資訊</string>
<!-- Stats -->
<string name="stats_average_moving_pace">平均移動步速</string>
<string name="stats_average_moving_speed">平均移動速度</string>
@@ -599,4 +600,20 @@ limitations under the License.
<string name="no_compatible_camera_installed">沒有安裝相容的攝影機應用程式</string>
<string name="settings_sensor_bluetooth_service_filter_title">篩選藍芽裝置</string>
<string name="settings_sensor_bluetooth_service_filter_off">顯示所有可發現的藍芽裝置</string>
<string name="voiceDistanceNauticalMilesPlural">{ n, plural, other {{n,number,#.0} 海里} }</string>
<string name="voiceMinutesPlural">{ n, plural, other {{n} 分鐘} }</string>
<string name="settings_announcements_idle_category_title">閒置播報</string>
<string name="voiceSpeedMilesPerHourPlural">{ n, plural, other {每小時 {n,number,#.0} 英里} }</string>
<string name="voiceDistanceMilesPlural">{ n, plural, other {{n,number,#.0} 英里} }</string>
<string name="voiceSpeedKilometersPerHourPlural">{ n, plural, other {每小時 {n,number,#.0} 公里} }</string>
<string name="sensor_state_power_max">最大功率</string>
<string name="activity_type_kickscooter">速克達</string>
<string name="voiceSecondsPlural">{ n, plural, other {{n} 秒} }</string>
<string name="voiceIdle">正在閒置。</string>
<string name="voiceHoursPlural">{ n, plural, other {{n} 小時} }</string>
<string name="settings_announcements_idle_title">閒置</string>
<string name="settings_recording_idle_timeout_title">閒置閾值</string>
<string name="voiceSpeedMKnotsPlural">{ n, plural, other {{n,number,#.0} 節} }</string>
<string name="value_int_seconds">%1$d s (建議值)</string>
<string name="voiceDistanceKilometersPlural">{ n, plural, other {{n,number,#.0} 公里} }</string>
</resources>
+3
View File
@@ -271,6 +271,9 @@
<string name="show_introduction_screen_key" translatable="false">showIntroduction</string>
<bool name="show_introduction_screen_default">true</bool>
<string name="settings_ui_dynamic_colors_key" translatable="false">uiDynamicColors</string>
<bool name="settings_ui_dynamic_colors_default" translatable="false">false</bool>
<!-- androidx.appcompat.app.AppCompatDelegate.setDefaultNightMode() -->
<string name="night_mode_key" translatable="false">nightMode</string>
<string name="night_mode_default" translatable="false">@string/night_mode_system_value</string>
+5
View File
@@ -373,6 +373,9 @@ limitations under the License.
<string name="settings_chart_by_distance">By distance</string>
<string name="settings_chart_by_time">By time</string>
<!-- Settings Recording -->
<string name="settings_recording_title">Recording</string>
<string name="settings_ui_dynamic_colors_title">Dynamic Colors</string>
<string name="settings_ui_dynamic_colors_summary">Use user-defined Dynamic Colors (Android 12+ only; requires a manual restart)</string>
<string name="settings_recording_customize_layout_title">Customize your recording layout</string>
<string name="settings_recording_customize_layout_select_columns">Data fields per row</string>
<string name="settings_recording_show_on_lockscreen_while_recording_title">Show statistics on lockscreen</string>
@@ -407,6 +410,8 @@ limitations under the License.
<string name="settings_announcements_lap_speed_pace">Lap speed/pace</string>
<!-- Custom Layout -->
<string name="custom_layout_list_title">Layouts</string>
<string name="custom_layout_list_edit_name">Type layout\'s name to add</string>
<string name="custom_layout_list_edit_already_exists">Layout\'s name already exists</string>
+3 -3
View File
@@ -40,9 +40,9 @@
app:useSimpleSummaryProvider="true" />
<SwitchPreference
android:defaultValue="@bool/voice_announce_idle_default"
android:key="@string/voice_announce_idle_key"
android:title="@string/settings_announcements_idle_title" />
android:defaultValue="@bool/voice_announce_total_distance_default"
android:key="@string/voice_announce_total_distance_key"
android:title="@string/total_distance" />
<SwitchPreference
android:defaultValue="@bool/voice_announce_moving_time_default"
+38 -29
View File
@@ -12,36 +12,11 @@
android:title="@string/settings_night_mode_title"
app:useSimpleSummaryProvider="true" />
<Preference
app:key="@string/stats_custom_layout_key"
app:title="@string/settings_recording_customize_layout_title" />
<de.dennisguse.opentracks.settings.ResetDialogPreference
android:dialogMessage="@string/settings_layout_reset_confirm_message"
android:dialogTitle="@string/settings_layout_reset_confirm_title"
android:key="@string/settings_layout_reset_key"
android:negativeButtonText="@android:string/cancel"
android:persistent="false"
android:positiveButtonText="@android:string/ok"
android:title="@string/settings_layout_reset" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_show_on_lockscreen_while_recording_default"
android:key="@string/stats_show_on_lockscreen_while_recording_key"
android:summary="@string/settings_recording_show_on_lockscreen_while_recording_summary"
android:title="@string/settings_recording_show_on_lockscreen_while_recording_title" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_keep_screen_on_while_recording_default"
android:key="@string/stats_keep_screen_on_while_recording_key"
android:summary="@string/settings_recording_keep_screen_on_while_recording_summary"
android:title="@string/settings_recording_keep_screen_on_while_recording_title" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_fullscreen_while_recording_default"
android:key="@string/stats_fullscreen_while_recording_key"
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
android:defaultValue="@bool/settings_ui_dynamic_colors_default"
android:key="@string/settings_ui_dynamic_colors_key"
android:summary="@string/settings_ui_dynamic_colors_summary"
android:title="@string/settings_ui_dynamic_colors_title" />
<ListPreference
android:defaultValue="@string/show_on_map_format_ask"
@@ -49,4 +24,38 @@
android:title="@string/select_show_on_map_behavior"
app:useSimpleSummaryProvider="true" />
<PreferenceCategory app:title="@string/settings_recording_title">
<Preference
app:key="@string/stats_custom_layout_key"
app:title="@string/settings_recording_customize_layout_title" />
<de.dennisguse.opentracks.settings.ResetDialogPreference
android:dialogMessage="@string/settings_layout_reset_confirm_message"
android:dialogTitle="@string/settings_layout_reset_confirm_title"
android:key="@string/settings_layout_reset_key"
android:negativeButtonText="@android:string/cancel"
android:persistent="false"
android:positiveButtonText="@android:string/ok"
android:title="@string/settings_layout_reset" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_show_on_lockscreen_while_recording_default"
android:key="@string/stats_show_on_lockscreen_while_recording_key"
android:summary="@string/settings_recording_show_on_lockscreen_while_recording_summary"
android:title="@string/settings_recording_show_on_lockscreen_while_recording_title" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_keep_screen_on_while_recording_default"
android:key="@string/stats_keep_screen_on_while_recording_key"
android:summary="@string/settings_recording_keep_screen_on_while_recording_summary"
android:title="@string/settings_recording_keep_screen_on_while_recording_title" />
<SwitchPreferenceCompat
android:defaultValue="@bool/stats_fullscreen_while_recording_default"
android:key="@string/stats_fullscreen_while_recording_key"
android:summary="@string/settings_recording_fullscreen_on_while_recording_summary"
android:title="@string/settings_recording_fullscreen_on_while_recording_title" />
</PreferenceCategory>
</PreferenceScreen>