mirror of
https://github.com/syncthing/syncthing-android.git
synced 2025-02-03 15:51:37 +00:00
Fix exit code 9 handling in SyncthingRunnable (#25)
Display syncthing native exit code on crash
This commit is contained in:
parent
fb0479e5f2
commit
8fea022982
25 changed files with 110 additions and 71 deletions
|
@ -168,10 +168,10 @@ public class NotificationHandler {
|
||||||
mNotificationManager.cancel(ID_PERSISTENT_WAITING);
|
mNotificationManager.cancel(ID_PERSISTENT_WAITING);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showCrashedNotification(@StringRes int title) {
|
public void showCrashedNotification(@StringRes int title, String extraInfo) {
|
||||||
Intent intent = new Intent(mContext, LogActivity.class);
|
Intent intent = new Intent(mContext, LogActivity.class);
|
||||||
Notification n = getNotificationBuilder(mInfoChannel)
|
Notification n = getNotificationBuilder(mInfoChannel)
|
||||||
.setContentTitle(mContext.getString(title))
|
.setContentTitle(mContext.getString(title, extraInfo))
|
||||||
.setContentText(mContext.getString(R.string.notification_crash_text))
|
.setContentText(mContext.getString(R.string.notification_crash_text))
|
||||||
.setSmallIcon(R.drawable.ic_stat_notify)
|
.setSmallIcon(R.drawable.ic_stat_notify)
|
||||||
.setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0))
|
.setContentIntent(PendingIntent.getActivity(mContext, 0, intent, 0))
|
||||||
|
|
|
@ -109,9 +109,14 @@ public class SyncthingRunnable implements Runnable {
|
||||||
|
|
||||||
@SuppressLint("WakelockTimeout")
|
@SuppressLint("WakelockTimeout")
|
||||||
public String run(boolean returnStdOut) {
|
public String run(boolean returnStdOut) {
|
||||||
trimLogFile();
|
Boolean sendStopToService = false;
|
||||||
int ret;
|
Boolean restartSyncthingNative = false;
|
||||||
|
int exitCode;
|
||||||
String capturedStdOut = "";
|
String capturedStdOut = "";
|
||||||
|
|
||||||
|
// Trim Syncthing log.
|
||||||
|
trimLogFile();
|
||||||
|
|
||||||
// Make sure Syncthing is executable
|
// Make sure Syncthing is executable
|
||||||
try {
|
try {
|
||||||
ProcessBuilder pb = new ProcessBuilder("chmod", "500", mSyncthingBinary.getPath());
|
ProcessBuilder pb = new ProcessBuilder("chmod", "500", mSyncthingBinary.getPath());
|
||||||
|
@ -161,31 +166,52 @@ public class SyncthingRunnable implements Runnable {
|
||||||
|
|
||||||
niceSyncthing();
|
niceSyncthing();
|
||||||
|
|
||||||
ret = process.waitFor();
|
exitCode = process.waitFor();
|
||||||
Log.i(TAG, "Syncthing exited with code " + ret);
|
Log.i(TAG, "Syncthing exited with code " + exitCode);
|
||||||
mSyncthing.set(null);
|
mSyncthing.set(null);
|
||||||
if (lInfo != null)
|
if (lInfo != null) {
|
||||||
lInfo.join();
|
lInfo.join();
|
||||||
if (lWarn != null)
|
}
|
||||||
|
if (lWarn != null) {
|
||||||
lWarn.join();
|
lWarn.join();
|
||||||
|
}
|
||||||
|
|
||||||
switch (ret) {
|
switch (exitCode) {
|
||||||
case 0:
|
case 0:
|
||||||
case 137:
|
case 137:
|
||||||
// Syncthing was shut down (via API or SIGKILL), do nothing.
|
Log.i(TAG, "Syncthing was shut down normally via API or SIGKILL. Exit code = " + exitCode);
|
||||||
break;
|
break;
|
||||||
case 1:
|
case 1:
|
||||||
Log.w(TAG, "Another Syncthing instance is already running, requesting restart via SyncthingService intent");
|
Log.w(TAG, "exit reason = exitError. Another Syncthing instance may be already running.");
|
||||||
//fallthrough
|
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title, Integer.toString(exitCode));
|
||||||
|
sendStopToService = true;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
// This should not happen as STNOUPGRADE is set.
|
||||||
|
Log.w(TAG, "exit reason = exitNoUpgradeAvailable. Another Syncthing instance may be already running.");
|
||||||
|
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title, Integer.toString(exitCode));
|
||||||
|
sendStopToService = true;
|
||||||
|
break;
|
||||||
case 3:
|
case 3:
|
||||||
// Restart was requested via Rest API call.
|
// Restart was requested via Rest API call.
|
||||||
Log.i(TAG, "Restarting syncthing");
|
Log.i(TAG, "exit reason = exitRestarting. Restarting syncthing.");
|
||||||
mContext.startService(new Intent(mContext, SyncthingService.class)
|
restartSyncthingNative = true;
|
||||||
.setAction(SyncthingService.ACTION_RESTART));
|
break;
|
||||||
|
case 9:
|
||||||
|
// Native was force killed.
|
||||||
|
Log.w(TAG, "exit reason = exitForceKill.");
|
||||||
|
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title, Integer.toString(exitCode));
|
||||||
|
sendStopToService = true;
|
||||||
|
break;
|
||||||
|
case 64:
|
||||||
|
Log.w(TAG, "exit reason = exitInvalidCommandLine.");
|
||||||
|
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title, Integer.toString(exitCode));
|
||||||
|
sendStopToService = true;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
Log.w(TAG, "Syncthing has crashed (exit code " + ret + ")");
|
Log.w(TAG, "Syncthing exited unexpectedly. Exit code = " + exitCode);
|
||||||
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title);
|
mNotificationHandler.showCrashedNotification(R.string.notification_crash_title, Integer.toString(exitCode));
|
||||||
|
sendStopToService = true;
|
||||||
}
|
}
|
||||||
} catch (IOException | InterruptedException e) {
|
} catch (IOException | InterruptedException e) {
|
||||||
Log.e(TAG, "Failed to execute syncthing binary or read output", e);
|
Log.e(TAG, "Failed to execute syncthing binary or read output", e);
|
||||||
|
@ -195,6 +221,20 @@ public class SyncthingRunnable implements Runnable {
|
||||||
if (process != null)
|
if (process != null)
|
||||||
process.destroy();
|
process.destroy();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Restart syncthing if it exited unexpectedly while running on a separate thread.
|
||||||
|
if (!returnStdOut && restartSyncthingNative) {
|
||||||
|
mContext.startService(new Intent(mContext, SyncthingService.class)
|
||||||
|
.setAction(SyncthingService.ACTION_RESTART));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Notify {@link SyncthingService} that service state State.ACTIVE is no longer valid.
|
||||||
|
if (!returnStdOut && sendStopToService) {
|
||||||
|
mContext.startService(new Intent(mContext, SyncthingService.class)
|
||||||
|
.setAction(SyncthingService.ACTION_STOP));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Return captured command line output.
|
||||||
return capturedStdOut;
|
return capturedStdOut;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -299,40 +339,26 @@ public class SyncthingRunnable implements Runnable {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public interface OnSyncthingKilled {
|
|
||||||
void onKilled();
|
|
||||||
}
|
|
||||||
/**
|
/**
|
||||||
* Look for running libsyncthing.so processes and kill them.
|
* Look for running libsyncthing.so processes and end them gracefully.
|
||||||
* Try a SIGINT first, then try again with SIGKILL.
|
|
||||||
*/
|
*/
|
||||||
public void killSyncthing() {
|
public void killSyncthing() {
|
||||||
for (int i = 0; i < 2; i++) {
|
int exitCode;
|
||||||
List<String> syncthingPIDs = getSyncthingPIDs();
|
List<String> syncthingPIDs = getSyncthingPIDs();
|
||||||
if (syncthingPIDs.isEmpty()) {
|
if (syncthingPIDs.isEmpty()) {
|
||||||
Log.d(TAG, "killSyncthing: Found no more running instances of " + Constants.FILENAME_SYNCTHING_BINARY);
|
Log.d(TAG, "killSyncthing: Found no more running instances of " + Constants.FILENAME_SYNCTHING_BINARY);
|
||||||
break;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int exitCode;
|
|
||||||
for (String syncthingPID : syncthingPIDs) {
|
for (String syncthingPID : syncthingPIDs) {
|
||||||
if (i > 0) {
|
|
||||||
// Force termination of the process by sending SIGKILL.
|
|
||||||
SystemClock.sleep(3000);
|
|
||||||
exitCode = Util.runShellCommand("kill -SIGKILL " + syncthingPID + "\n", mUseRoot);
|
|
||||||
} else {
|
|
||||||
exitCode = Util.runShellCommand("kill -SIGINT " + syncthingPID + "\n", mUseRoot);
|
exitCode = Util.runShellCommand("kill -SIGINT " + syncthingPID + "\n", mUseRoot);
|
||||||
SystemClock.sleep(1000);
|
|
||||||
}
|
|
||||||
if (exitCode == 0) {
|
if (exitCode == 0) {
|
||||||
Log.d(TAG, "Killed Syncthing process " + syncthingPID);
|
Log.d(TAG, "Sent kill SIGINT to process " + syncthingPID);
|
||||||
} else {
|
} else {
|
||||||
Log.w(TAG, "Failed to kill Syncthing process " + syncthingPID +
|
Log.w(TAG, "Failed to send kill SIGINT to process " + syncthingPID +
|
||||||
" exit code " + Integer.toString(exitCode));
|
" exit code " + Integer.toString(exitCode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Logs the outputs of a stream to logcat and mNativeLog.
|
* Logs the outputs of a stream to logcat and mNativeLog.
|
||||||
|
|
|
@ -44,6 +44,12 @@ public class SyncthingService extends Service {
|
||||||
public static final String ACTION_RESTART =
|
public static final String ACTION_RESTART =
|
||||||
"com.nutomic.syncthingandroid.service.SyncthingService.RESTART";
|
"com.nutomic.syncthingandroid.service.SyncthingService.RESTART";
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Intent action to perform a Syncthing stop.
|
||||||
|
*/
|
||||||
|
public static final String ACTION_STOP =
|
||||||
|
"com.nutomic.syncthingandroid.service.SyncthingService.STOP";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Intent action to reset Syncthing's database.
|
* Intent action to reset Syncthing's database.
|
||||||
*/
|
*/
|
||||||
|
@ -95,6 +101,10 @@ public class SyncthingService extends Service {
|
||||||
public static final String EXTRA_FOLDER_ID =
|
public static final String EXTRA_FOLDER_ID =
|
||||||
"com.nutomic.syncthingandroid.service.SyncthingService.EXTRA_FOLDER_ID";
|
"com.nutomic.syncthingandroid.service.SyncthingService.EXTRA_FOLDER_ID";
|
||||||
|
|
||||||
|
public interface OnSyncthingKilled {
|
||||||
|
void onKilled();
|
||||||
|
}
|
||||||
|
|
||||||
public interface OnServiceStateChangeListener {
|
public interface OnServiceStateChangeListener {
|
||||||
void onServiceStateChange(State currentState);
|
void onServiceStateChange(State currentState);
|
||||||
}
|
}
|
||||||
|
@ -221,11 +231,14 @@ public class SyncthingService extends Service {
|
||||||
}
|
}
|
||||||
mNotificationHandler.updatePersistentNotification(this);
|
mNotificationHandler.updatePersistentNotification(this);
|
||||||
|
|
||||||
if (intent == null)
|
if (intent == null) {
|
||||||
return START_STICKY;
|
return START_STICKY;
|
||||||
|
}
|
||||||
|
|
||||||
if (ACTION_RESTART.equals(intent.getAction()) && mCurrentState == State.ACTIVE) {
|
if (ACTION_RESTART.equals(intent.getAction()) && mCurrentState == State.ACTIVE) {
|
||||||
shutdown(State.INIT, () -> launchStartupTask());
|
shutdown(State.INIT, () -> launchStartupTask());
|
||||||
|
} else if (ACTION_STOP.equals(intent.getAction()) && mCurrentState == State.ACTIVE) {
|
||||||
|
shutdown(State.DISABLED, () -> {});
|
||||||
} else if (ACTION_RESET_DATABASE.equals(intent.getAction())) {
|
} else if (ACTION_RESET_DATABASE.equals(intent.getAction())) {
|
||||||
shutdown(State.INIT, () -> {
|
shutdown(State.INIT, () -> {
|
||||||
new SyncthingRunnable(this, SyncthingRunnable.Command.resetdatabase).run();
|
new SyncthingRunnable(this, SyncthingRunnable.Command.resetdatabase).run();
|
||||||
|
@ -337,7 +350,7 @@ public class SyncthingService extends Service {
|
||||||
syncthingService.mConfig = new ConfigXml(syncthingService);
|
syncthingService.mConfig = new ConfigXml(syncthingService);
|
||||||
syncthingService.mConfig.updateIfNeeded();
|
syncthingService.mConfig.updateIfNeeded();
|
||||||
} catch (ConfigXml.OpenConfigException e) {
|
} catch (ConfigXml.OpenConfigException e) {
|
||||||
syncthingService.mNotificationHandler.showCrashedNotification(R.string.config_read_failed);
|
syncthingService.mNotificationHandler.showCrashedNotification(R.string.config_read_failed, "ConfigXml.OpenConfigException");
|
||||||
synchronized (syncthingService.mStateLock) {
|
synchronized (syncthingService.mStateLock) {
|
||||||
syncthingService.onServiceStateChange(State.ERROR);
|
syncthingService.onServiceStateChange(State.ERROR);
|
||||||
}
|
}
|
||||||
|
@ -473,7 +486,7 @@ public class SyncthingService extends Service {
|
||||||
*
|
*
|
||||||
* Sets {@link #mCurrentState} to newState, and calls onKilledListener once Syncthing is killed.
|
* Sets {@link #mCurrentState} to newState, and calls onKilledListener once Syncthing is killed.
|
||||||
*/
|
*/
|
||||||
private void shutdown(State newState, SyncthingRunnable.OnSyncthingKilled onKilledListener) {
|
private void shutdown(State newState, OnSyncthingKilled onKilledListener) {
|
||||||
Log.i(TAG, "Shutting down background service");
|
Log.i(TAG, "Shutting down background service");
|
||||||
synchronized(mStateLock) {
|
synchronized(mStateLock) {
|
||||||
onServiceStateChange(newState);
|
onServiceStateChange(newState);
|
||||||
|
|
|
@ -349,7 +349,7 @@ Ens podeu informar dels problemes que trobeu a través de Github.</string>
|
||||||
<string name="default_folder_label">Càmera</string>
|
<string name="default_folder_label">Càmera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-fotos</string>
|
<string name="default_folder_id">%1$s-fotos</string>
|
||||||
<string name="notification_crash_title">El Syncthing s\'ha bloquejat</string>
|
<string name="notification_crash_title">El Syncthing s\'ha bloquejat %1$s</string>
|
||||||
<string name="notification_crash_text">Feu clic per veure els registres</string>
|
<string name="notification_crash_text">Feu clic per veure els registres</string>
|
||||||
<string name="notifications_persistent_channel">El Syncthing està actiu</string>
|
<string name="notifications_persistent_channel">El Syncthing està actiu</string>
|
||||||
<string name="notification_persistent_waiting_channel">Vigilant les condicions d\'execució</string>
|
<string name="notification_persistent_waiting_channel">Vigilant les condicions d\'execució</string>
|
||||||
|
|
|
@ -327,7 +327,7 @@ Všechny zaznamenané chyby prosím hlašte přes Github.</string>
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-foto</string>
|
<string name="default_folder_id">%1$s-foto</string>
|
||||||
<string name="notification_crash_title">Syncthing spadl</string>
|
<string name="notification_crash_title">Syncthing spadl %1$s</string>
|
||||||
<string name="notification_crash_text">Pro prohlížení logů klikněte</string>
|
<string name="notification_crash_text">Pro prohlížení logů klikněte</string>
|
||||||
<string name="notifications_other_channel">Ostatní upozornění</string>
|
<string name="notifications_other_channel">Ostatní upozornění</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -314,7 +314,7 @@ Vær venlig at rapportere ethvert problem, du støder på, via Github. </string>
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-fotos</string>
|
<string name="default_folder_id">%1$s-fotos</string>
|
||||||
<string name="notification_crash_title">Syncthing crashede</string>
|
<string name="notification_crash_title">Syncthing crashede %1$s</string>
|
||||||
<string name="notification_crash_text">Klik for at se logs</string>
|
<string name="notification_crash_text">Klik for at se logs</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
<!--Title of the notification shown when a restart is needed-->
|
<!--Title of the notification shown when a restart is needed-->
|
||||||
|
|
|
@ -366,7 +366,7 @@ Bitte melden Sie auftretende Probleme via GitHub.</string>
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-Bilder</string>
|
<string name="default_folder_id">%1$s-Bilder</string>
|
||||||
<string name="notification_crash_title">Syncthing ist abgestürzt</string>
|
<string name="notification_crash_title">Syncthing ist abgestürzt (Exit-Code %1$s)</string>
|
||||||
<string name="notification_crash_text">Klicken um Logs anzuzeigen</string>
|
<string name="notification_crash_text">Klicken um Logs anzuzeigen</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing läuft</string>
|
<string name="notifications_persistent_channel">Syncthing läuft</string>
|
||||||
<string name="notification_persistent_waiting_channel">Laufkonditionen werden überwacht</string>
|
<string name="notification_persistent_waiting_channel">Laufkonditionen werden überwacht</string>
|
||||||
|
|
|
@ -318,7 +318,7 @@
|
||||||
<string name="default_folder_label">Φωτογραφική μηχανή</string>
|
<string name="default_folder_label">Φωτογραφική μηχανή</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
<string name="notification_crash_title">Το Syncthing κατέρρευσε</string>
|
<string name="notification_crash_title">Το Syncthing κατέρρευσε %1$s</string>
|
||||||
<string name="notification_crash_text">Πατήστε για να δείτε την καταγραφή συμβάντων</string>
|
<string name="notification_crash_text">Πατήστε για να δείτε την καταγραφή συμβάντων</string>
|
||||||
<string name="notifications_other_channel">Άλλες ειδοποιήσεις</string>
|
<string name="notifications_other_channel">Άλλες ειδοποιήσεις</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -292,7 +292,7 @@
|
||||||
<string name="default_folder_label">Cámara</string>
|
<string name="default_folder_label">Cámara</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
<string name="notification_crash_title">Syncthing se ha estrellado</string>
|
<string name="notification_crash_title">Syncthing se ha estrellado %1$s</string>
|
||||||
<string name="notification_crash_text">Haga clic para ver los registros</string>
|
<string name="notification_crash_text">Haga clic para ver los registros</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
<!--Title of the notification shown when a restart is needed-->
|
<!--Title of the notification shown when a restart is needed-->
|
||||||
|
|
|
@ -288,7 +288,7 @@ Ilmoitathan ystävällisesti kaikista havaitsemistasi ongelmista Githubin kautta
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-kuvat</string>
|
<string name="default_folder_id">%1$s-kuvat</string>
|
||||||
<string name="notification_crash_title">Syncthing kaatui</string>
|
<string name="notification_crash_title">Syncthing kaatui %1$s</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
<!--Title of the notification shown when a restart is needed-->
|
<!--Title of the notification shown when a restart is needed-->
|
||||||
<string name="restart_title">Uudelleenkäynnistys tarvitaan</string>
|
<string name="restart_title">Uudelleenkäynnistys tarvitaan</string>
|
||||||
|
|
|
@ -350,7 +350,7 @@ S\'il vous plaît, soumettez les problèmes que vous rencontrez via Github.</str
|
||||||
<string name="default_folder_label">Caméra</string>
|
<string name="default_folder_label">Caméra</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
<string name="notification_crash_title">Syncthing s\'est planté</string>
|
<string name="notification_crash_title">Syncthing s\'est planté %1$s</string>
|
||||||
<string name="notification_crash_text">Cliquer pour voir les journaux</string>
|
<string name="notification_crash_text">Cliquer pour voir les journaux</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing en marche</string>
|
<string name="notifications_persistent_channel">Syncthing en marche</string>
|
||||||
<string name="notification_persistent_waiting_channel">Surveillance des conditions de fonctionnement</string>
|
<string name="notification_persistent_waiting_channel">Surveillance des conditions de fonctionnement</string>
|
||||||
|
|
|
@ -352,7 +352,7 @@ VIGYÁZAT! Más alkalmazások kiolvashatják a backupból a titkos kulcsot, és
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-kepek</string>
|
<string name="default_folder_id">%1$s-kepek</string>
|
||||||
<string name="notification_crash_title">A Syncthing összeomlott</string>
|
<string name="notification_crash_title">A Syncthing összeomlott %1$s</string>
|
||||||
<string name="notification_crash_text">Koppints a naplók megtekintéséhez</string>
|
<string name="notification_crash_text">Koppints a naplók megtekintéséhez</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing aktív</string>
|
<string name="notifications_persistent_channel">Syncthing aktív</string>
|
||||||
<string name="notification_persistent_waiting_channel">Futási feltételek monitorozása</string>
|
<string name="notification_persistent_waiting_channel">Futási feltételek monitorozása</string>
|
||||||
|
|
|
@ -350,7 +350,7 @@ Si prega di segnalare eventuali problemi che si incontrano via Github.</string>
|
||||||
<string name="default_folder_label">Camera</string>
|
<string name="default_folder_label">Camera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
<string name="notification_crash_title">Syncthing è andato in crash</string>
|
<string name="notification_crash_title">Syncthing è andato in crash %1$s</string>
|
||||||
<string name="notification_crash_text">Clicca per visualizzare i log</string>
|
<string name="notification_crash_text">Clicca per visualizzare i log</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing attivo</string>
|
<string name="notifications_persistent_channel">Syncthing attivo</string>
|
||||||
<string name="notification_persistent_waiting_channel">Monitoraggio delle condizioni di esecuzione</string>
|
<string name="notification_persistent_waiting_channel">Monitoraggio delle condizioni di esecuzione</string>
|
||||||
|
|
|
@ -315,7 +315,7 @@
|
||||||
<string name="default_folder_label">カメラ</string>
|
<string name="default_folder_label">カメラ</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-写真</string>
|
<string name="default_folder_id">%1$s-写真</string>
|
||||||
<string name="notification_crash_title">Syncthing がクラッシュしました</string>
|
<string name="notification_crash_title">Syncthing がクラッシュしました %1$s</string>
|
||||||
<string name="notification_crash_text">クリックしてログを表示</string>
|
<string name="notification_crash_text">クリックしてログを表示</string>
|
||||||
<string name="notifications_other_channel">他の通知</string>
|
<string name="notifications_other_channel">他の通知</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -314,7 +314,7 @@
|
||||||
<string name="default_folder_label">카메라</string>
|
<string name="default_folder_label">카메라</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-사진</string>
|
<string name="default_folder_id">%1$s-사진</string>
|
||||||
<string name="notification_crash_title">Syncthing이 충돌하였습니다.</string>
|
<string name="notification_crash_title">Syncthing이 충돌하였습니다. %1$s</string>
|
||||||
<string name="notification_crash_text">클릭해서 로그 보기</string>
|
<string name="notification_crash_text">클릭해서 로그 보기</string>
|
||||||
<string name="notifications_other_channel">기타 알림</string>
|
<string name="notifications_other_channel">기타 알림</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -350,7 +350,7 @@ Als je problemen tegenkomt, meld ze dan via GitHub.</string>
|
||||||
<string name="default_folder_label">Camera</string>
|
<string name="default_folder_label">Camera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-foto\'s</string>
|
<string name="default_folder_id">%1$s-foto\'s</string>
|
||||||
<string name="notification_crash_title">Syncthing is gecrasht</string>
|
<string name="notification_crash_title">Syncthing is gecrasht %1$s</string>
|
||||||
<string name="notification_crash_text">Tik om logboeken te bekijken</string>
|
<string name="notification_crash_text">Tik om logboeken te bekijken</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing is actief</string>
|
<string name="notifications_persistent_channel">Syncthing is actief</string>
|
||||||
<string name="notification_persistent_waiting_channel">Uitvoervoorwaarden controleren</string>
|
<string name="notification_persistent_waiting_channel">Uitvoervoorwaarden controleren</string>
|
||||||
|
|
|
@ -322,7 +322,7 @@ Proszę zgłaszać napotkane błędy programu za pośrednictwem serwisu Github.<
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-zdjęcia</string>
|
<string name="default_folder_id">%1$s-zdjęcia</string>
|
||||||
<string name="notification_crash_title">Syncthing spadło z rowerka :(</string>
|
<string name="notification_crash_title">Syncthing spadło z rowerka %1$s</string>
|
||||||
<string name="notification_crash_text">Dotknij, by zobaczyć logi</string>
|
<string name="notification_crash_text">Dotknij, by zobaczyć logi</string>
|
||||||
<string name="notifications_other_channel">Inne powiadomienia</string>
|
<string name="notifications_other_channel">Inne powiadomienia</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -340,7 +340,7 @@ Por favor, nos avise sobre quaisquer problemas que você encontrar via Github.</
|
||||||
<string name="default_folder_label">Câmera</string>
|
<string name="default_folder_label">Câmera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-fotos</string>
|
<string name="default_folder_id">%1$s-fotos</string>
|
||||||
<string name="notification_crash_title">O Syncthing fechou inesperadamente</string>
|
<string name="notification_crash_title">O Syncthing fechou inesperadamente %1$s</string>
|
||||||
<string name="notification_crash_text">Clique para ver os logs</string>
|
<string name="notification_crash_text">Clique para ver os logs</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing ativado</string>
|
<string name="notifications_persistent_channel">Syncthing ativado</string>
|
||||||
<string name="notification_persistent_waiting_channel">Monitorando condições de execução</string>
|
<string name="notification_persistent_waiting_channel">Monitorando condições de execução</string>
|
||||||
|
|
|
@ -373,7 +373,7 @@ Vă rugăm să raportați orice problemă întâlniți, prin intermediul GitHub.
|
||||||
<string name="default_folder_label">Camera</string>
|
<string name="default_folder_label">Camera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-fotografii</string>
|
<string name="default_folder_id">%1$s-fotografii</string>
|
||||||
<string name="notification_crash_title">Syncthing s-a oprit neașteptat</string>
|
<string name="notification_crash_title">Syncthing s-a oprit neașteptat %1$s</string>
|
||||||
<string name="notification_crash_text">Atingeți pentru a vedea jurnalele de erori</string>
|
<string name="notification_crash_text">Atingeți pentru a vedea jurnalele de erori</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing este activ</string>
|
<string name="notifications_persistent_channel">Syncthing este activ</string>
|
||||||
<string name="notification_persistent_waiting_channel">Monitorizare condiții rulare</string>
|
<string name="notification_persistent_waiting_channel">Monitorizare condiții rulare</string>
|
||||||
|
|
|
@ -355,7 +355,7 @@
|
||||||
<string name="default_folder_label">Камера</string>
|
<string name="default_folder_label">Камера</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s фото</string>
|
<string name="default_folder_id">%1$s фото</string>
|
||||||
<string name="notification_crash_title">Syncthing завершился из-за сбоя</string>
|
<string name="notification_crash_title">Syncthing завершился из-за сбоя %1$s</string>
|
||||||
<string name="notification_crash_text">Нажмите для просмотра логов</string>
|
<string name="notification_crash_text">Нажмите для просмотра логов</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing работает</string>
|
<string name="notifications_persistent_channel">Syncthing работает</string>
|
||||||
<string name="notification_persistent_waiting_channel">Отслеживание условий работы</string>
|
<string name="notification_persistent_waiting_channel">Отслеживание условий работы</string>
|
||||||
|
|
|
@ -368,7 +368,7 @@ Vänligen rapportera eventuella problem du stöter på via Github.</string>
|
||||||
<string name="default_folder_label">Kamera</string>
|
<string name="default_folder_label">Kamera</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s foton</string>
|
<string name="default_folder_id">%1$s foton</string>
|
||||||
<string name="notification_crash_title">Syncthing har kraschat</string>
|
<string name="notification_crash_title">Syncthing har kraschat %1$s</string>
|
||||||
<string name="notification_crash_text">Klicka för att visa loggar</string>
|
<string name="notification_crash_text">Klicka för att visa loggar</string>
|
||||||
<string name="notifications_persistent_channel">Syncthing är aktiv</string>
|
<string name="notifications_persistent_channel">Syncthing är aktiv</string>
|
||||||
<string name="notification_persistent_waiting_channel">Övervakar körvillkor</string>
|
<string name="notification_persistent_waiting_channel">Övervakar körvillkor</string>
|
||||||
|
|
|
@ -243,7 +243,7 @@
|
||||||
<!--Label of the default folder created of first start (camera folder).-->
|
<!--Label of the default folder created of first start (camera folder).-->
|
||||||
<string name="default_folder_label">Камера</string>
|
<string name="default_folder_label">Камера</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="notification_crash_title">Роботу Syncthing аварійно завершено </string>
|
<string name="notification_crash_title">Роботу Syncthing аварійно завершено %1$s</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
<!--Title of the notification shown when a restart is needed-->
|
<!--Title of the notification shown when a restart is needed-->
|
||||||
<string name="restart_title">Необхідний перезапуск</string>
|
<string name="restart_title">Необхідний перезапуск</string>
|
||||||
|
|
|
@ -317,7 +317,7 @@
|
||||||
<string name="default_folder_label">摄像机</string>
|
<string name="default_folder_label">摄像机</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-照片</string>
|
<string name="default_folder_id">%1$s-照片</string>
|
||||||
<string name="notification_crash_title">Syncthing 已崩溃</string>
|
<string name="notification_crash_title">Syncthing 已崩溃 %1$s</string>
|
||||||
<string name="notification_crash_text">点击查看日志</string>
|
<string name="notification_crash_text">点击查看日志</string>
|
||||||
<string name="notifications_other_channel">其他通知</string>
|
<string name="notifications_other_channel">其他通知</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -314,7 +314,7 @@
|
||||||
<string name="default_folder_label">相機</string>
|
<string name="default_folder_label">相機</string>
|
||||||
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!--ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
<string name="notification_crash_title">Syncthing 已經當機</string>
|
<string name="notification_crash_title">Syncthing 已經當機 %1$s</string>
|
||||||
<string name="notification_crash_text">觸碰檢視日誌</string>
|
<string name="notification_crash_text">觸碰檢視日誌</string>
|
||||||
<string name="notifications_other_channel">其他通知</string>
|
<string name="notifications_other_channel">其他通知</string>
|
||||||
<!--RestApi-->
|
<!--RestApi-->
|
||||||
|
|
|
@ -663,7 +663,7 @@ Please report any problems you encounter via Github.</string>
|
||||||
<!-- ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
<!-- ID of the default folder created on first start (camera folder). Must only contain 'a-z0-9_-'. Parameter is the device name-->
|
||||||
<string name="default_folder_id">%1$s-photos</string>
|
<string name="default_folder_id">%1$s-photos</string>
|
||||||
|
|
||||||
<string name="notification_crash_title">Syncthing has crashed</string>
|
<string name="notification_crash_title">Syncthing has crashed (exit code %1$s)</string>
|
||||||
|
|
||||||
<string name="notification_crash_text">Click to view logs</string>
|
<string name="notification_crash_text">Click to view logs</string>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue