Index: utils/ofhttp/OFHTTP.m ================================================================== --- utils/ofhttp/OFHTTP.m +++ utils/ofhttp/OFHTTP.m @@ -72,18 +72,19 @@ OF_APPLICATION_DELEGATE(OFHTTP) static void help(OFStream *stream, bool full, int status) { - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"usage", - @"Usage: %[prog] -[cehHmoOPqv] url1 [url2 ...]\n", + @"Usage: %[prog] -[cehHmoOPqv] url1 [url2 ...]", @"prog", [OFApplication programName])]; - if (full) - [stream writeString: OF_LOCALIZED(@"full_usage", - @"\nOptions:\n " + if (full) { + [stream writeString: @"\n"]; + [stream writeLine: OF_LOCALIZED(@"full_usage", + @"Options:\n " @"-b --body " @" Specify the file to send as body\n " @"-c --continue " @" Continue download of existing file\n " @"-f --force " @@ -103,11 +104,12 @@ @"-q --quiet " @" Quiet mode (no output, except errors)\n " @"-v --verbose " @" Verbose mode (print headers)\n " @" --insecure " - @" Ignore TLS errors\n")]; + @" Ignore TLS errors")]; + } [OFApplication terminateWithStatus: status]; } @implementation OFHTTP @@ -138,12 +140,12 @@ { size_t pos = [header rangeOfString: @":"].location; OFString *name, *value; if (pos == OF_NOT_FOUND) { - [of_stderr writeString: OF_LOCALIZED(@"invalid_input_header", - @"%[prog]: Headers must to be in format name:value!\n", + [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_header", + @"%[prog]: Headers must to be in format name:value!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } name = [header substringWithRange: of_range(0, pos)]; @@ -188,12 +190,12 @@ else if ([method isEqual: @"DELETE"]) _method = OF_HTTP_REQUEST_METHOD_DELETE; else if ([method isEqual: @"TRACE"]) _method = OF_HTTP_REQUEST_METHOD_TRACE; else { - [of_stderr writeString: OF_LOCALIZED(@"invalid_input_method", - @"%[prog]: Invalid request method %[method]!\n", + [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_method", + @"%[prog]: Invalid request method %[method]!", @"prog", [OFApplication programName], @"method", method)]; [OFApplication terminateWithStatus: 1]; } @@ -220,12 +222,12 @@ @throw [OFOutOfRangeException exception]; [OFTCPSocket setSOCKS5Host: host]; [OFTCPSocket setSOCKS5Port: (uint16_t)port]; } @catch (OFInvalidFormatException *e) { - [of_stderr writeString: OF_LOCALIZED(@"invalid_input_proxy", - @"%[prog]: Proxy must to be in format host:port!\n", + [of_stderr writeLine: OF_LOCALIZED(@"invalid_input_proxy", + @"%[prog]: Proxy must to be in format host:port!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } } @@ -270,53 +272,53 @@ case 'P': [self setProxy: [optionsParser argument]]; break; case ':': if ([optionsParser lastLongOption] != nil) - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"long_argument_missing", @"%[prog]: Argument for option --%[opt] " - "missing\n" + @"missing" @"prog", [OFApplication programName], @"opt", [optionsParser lastLongOption])]; else { OFString *optStr = [OFString stringWithFormat: @"%c", [optionsParser lastOption]]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"argument_missing", @"%[prog]: Argument for option -%[opt] " - "missing\n", + @"missing", @"prog", [OFApplication programName], @"opt", optStr)]; } [OFApplication terminateWithStatus: 1]; break; case '=': - [of_stderr writeString: - OF_LOCALIZED(@"takes_no_argument", - @"%[prog]: Option --%[opt] takes no argument\n", + [of_stderr writeLine: + OF_LOCALIZED(@"option_takes_no_argument", + @"%[prog]: Option --%[opt] takes no argument", @"prog", [OFApplication programName], @"opt", [optionsParser lastLongOption])]; [OFApplication terminateWithStatus: 1]; break; case '?': if ([optionsParser lastLongOption] != nil) - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"unknown_long_option", - @"%[prog]: Unknown option: --%[opt]\n", + @"%[prog]: Unknown option: --%[opt]", @"prog", [OFApplication programName], @"opt", [optionsParser lastLongOption])]; else { OFString *optStr = [OFString stringWithFormat: @"%c", [optionsParser lastOption]]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"unknown_option", - @"%[prog]: Unknown option: -%[opt]\n", + @"%[prog]: Unknown option: -%[opt]", @"prog", [OFApplication programName], @"opt", optStr)]; } [OFApplication terminateWithStatus: 1]; @@ -329,22 +331,22 @@ if ([_URLs count] < 1) help(of_stderr, false, 1); if (_quiet && _verbose) { - [of_stderr writeString: OF_LOCALIZED(@"quiet_xor_verbose", + [of_stderr writeLine: OF_LOCALIZED(@"quiet_xor_verbose", @"%[prog]: -q / --quiet and -v / --verbose are mutually " - @"exclusive!\n", + @"exclusive!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } if (_outputPath != nil && [_URLs count] > 1) { - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"output_only_with_one_url", @"%[prog]: Cannot use -o / --output when more than one URL " - @"has been specified!\n", + @"has been specified!", @"prog", [OFApplication programName])]; [OFApplication terminateWithStatus: 1]; } [self performSelector: @selector(downloadNextURL) @@ -400,47 +402,47 @@ response = [_HTTPClient performRequest: request]; } @catch (OFAddressTranslationFailedException *e) { if (!_quiet) [of_stdout writeString: @"\n"]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"download_failed_address_translation", @"%[prog]: Failed to download <%[url]>!\n" - @" Address translation failed: %[exception]\n", + @" Address translation failed: %[exception]", @"prog", [OFApplication programName], @"url", [[request URL] string], @"exception", e)]; } @catch (OFConnectionFailedException *e) { if (!_quiet) [of_stdout writeString: @"\n"]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"download_failed_connection_failed", @"%[prog]: Failed to download <%[url]>!\n" - @" Connection failed: %[exception]\n", + @" Connection failed: %[exception]", @"prog", [OFApplication programName], @"url", [[request URL] string], @"exception", e)]; } @catch (OFInvalidServerReplyException *e) { if (!_quiet) [of_stdout writeString: @"\n"]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"download_failed_invalid_server_reply", @"%[prog]: Failed to download <%[url]>!\n" - @" Invalid server reply!\n", + @" Invalid server reply!", @"prog", [OFApplication programName], @"url", [[request URL] string])]; } @catch (OFUnsupportedProtocolException *e) { if (!_quiet) [of_stdout writeString: @"\n"]; - [of_stderr writeString: OF_LOCALIZED(@"no_ssl_library", + [of_stderr writeLine: OF_LOCALIZED(@"no_ssl_library", @"%[prog]: No TLS library loaded!\n" @" In order to download via https, you need to preload an " @"TLS library for ObjFW\n" - "such as ObjOpenSSL!\n", + @" such as ObjOpenSSL!", @"prog", [OFApplication programName])]; } @catch (OFReadOrWriteFailedException *e) { OFString *error = OF_LOCALIZED( @"download_failed_read_or_write_failed_any", @"Read or write failed"); @@ -455,25 +457,25 @@ else if ([e isKindOfClass: [OFWriteFailedException class]]) error = OF_LOCALIZED( @"download_failed_read_or_write_failed_write", @"Write failed"); - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"download_failed_read_or_write_failed", @"%[prog]: Failed to download <%[url]>!\n" - @" %[error]: %[exception]\n", + @" %[error]: %[exception]", @"prog", [OFApplication programName], @"url", [[request URL] string], @"error", error, @"exception", e)]; } @catch (OFHTTPRequestFailedException *e) { if (!_quiet) [of_stdout writeFormat: @" ➜ %d\n", [[e response] statusCode]]; - [of_stderr writeString: OF_LOCALIZED(@"download_failed", - @"%[prog]: Failed to download <%[url]>!\n", + [of_stderr writeLine: OF_LOCALIZED(@"download_failed", + @"%[prog]: Failed to download <%[url]>!", @"prog", [OFApplication programName], @"url", [[request URL] string])]; } if (!_quiet && response != nil) @@ -617,13 +619,13 @@ if (!_quiet) [of_stdout writeString: @"\n Error!\n"]; URL = [_URLs objectAtIndex: _URLIndex - 1]; - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"download_failed_exception", - @"%[prog]: Failed to download <%[url]>: %[exception]\n", + @"%[prog]: Failed to download <%[url]>: %[exception]", @"prog", [OFApplication programName], @"url", URL, @"exception", e)]; _errorCode = 1; @@ -642,13 +644,15 @@ [_progressBar stop]; [_progressBar draw]; [_progressBar release]; _progressBar = nil; - if (!_quiet) - [of_stdout writeString: - OF_LOCALIZED(@"download_done", @"\n Done!\n")]; + if (!_quiet) { + [of_stdout writeString: @"\n "]; + [of_stdout writeLine: + OF_LOCALIZED(@"download_done", @"Done!")]; + } goto next; } return true; @@ -682,23 +686,23 @@ @try { URLString = [_URLs objectAtIndex: _URLIndex++]; URL = [OFURL URLWithString: URLString]; } @catch (OFInvalidFormatException *e) { - [of_stderr writeString: OF_LOCALIZED(@"invalid_url", - @"%[prog]: Invalid URL: <%[url]>!\n", + [of_stderr writeLine: OF_LOCALIZED(@"invalid_url", + @"%[prog]: Invalid URL: <%[url]>!", @"prog", [OFApplication programName], @"url", URLString)]; _errorCode = 1; goto next; } if (![[URL scheme] isEqual: @"http"] && ![[URL scheme] isEqual: @"https"]) { - [of_stderr writeString: OF_LOCALIZED(@"invalid_scheme", - @"%[prog]: Invalid scheme: <%[scheme]:>!\n", + [of_stderr writeLine: OF_LOCALIZED(@"invalid_scheme", + @"%[prog]: Invalid scheme: <%[scheme]:>!", @"prog", [OFApplication programName], @"scheme", URLString)]; _errorCode = 1; goto next; @@ -812,41 +816,46 @@ OFEnumerator *keyEnumerator = [headers keyEnumerator]; OFEnumerator *objectEnumerator = [headers objectEnumerator]; OFString *key, *object; - [of_stdout writeString: OF_LOCALIZED(@"info_name_nopad", - @" Name: %[name]\n", + [of_stdout writeString: @" "]; + [of_stdout writeLine: OF_LOCALIZED( + @"info_name_unaligned", + @"Name: %[name]", @"name", fileName)]; while ((key = [keyEnumerator nextObject]) != nil && (object = [objectEnumerator nextObject]) != nil) [of_stdout writeFormat: @" %@: %@\n", key, object]; objc_autoreleasePoolPop(pool); } else { - [of_stdout writeString: OF_LOCALIZED(@"info_name", - @" Name: %[name]\n", + [of_stdout writeString: @" "]; + [of_stdout writeLine: OF_LOCALIZED(@"info_name", + @"Name: %[name]", @"name", fileName)]; - [of_stdout writeString: OF_LOCALIZED(@"info_type", - @" Type: %[type]\n", + [of_stdout writeString: @" "]; + [of_stdout writeLine: OF_LOCALIZED(@"info_type", + @"Type: %[type]", @"type", type)]; - [of_stdout writeString: OF_LOCALIZED(@"info_size", - @" Size: %[size]\n", + [of_stdout writeString: @" "]; + [of_stdout writeLine: OF_LOCALIZED(@"info_size", + @"Size: %[size]", @"size", lengthString)]; } } if ([_outputPath isEqual: @"-"]) _output = of_stdout; else { if (!_continue && !_force && [fileManager fileExistsAtPath: fileName]) { - [of_stderr writeString: - OF_LOCALIZED(@"ouput_already_exists", - @"%[prog]: File %[filename] already exists!\n", + [of_stderr writeLine: + OF_LOCALIZED(@"output_already_exists", + @"%[prog]: File %[filename] already exists!", @"prog", [OFApplication programName], @"filename", fileName)]; _errorCode = 1; goto next; @@ -856,14 +865,14 @@ OFString *mode = ([response statusCode] == 206 ? @"ab" : @"wb"); _output = [[OFFile alloc] initWithPath: fileName mode: mode]; } @catch (OFOpenItemFailedException *e) { - [of_stderr writeString: + [of_stderr writeLine: OF_LOCALIZED(@"failed_to_open_output", @"%[prog]: Failed to open file %[filename]: " - @"%[exception]\n", + @"%[exception]", @"prog", [OFApplication programName], @"filename",fileName, @"exception", e)]; _errorCode = 1; Index: utils/ofhttp/ProgressBar.m ================================================================== --- utils/ofhttp/ProgressBar.m +++ utils/ofhttp/ProgressBar.m @@ -177,35 +177,39 @@ } } - (void)_drawReceived { + [of_stdout writeString: @"\r "]; + if (_resumedFrom + _received >= GIBIBYTE) { OFString *num = [OFString stringWithFormat: @"%,7.2f", (float)(_resumedFrom + _received) / GIBIBYTE]; [of_stdout writeString: OF_LOCALIZED(@"progress_gib", - @"\r %[num] GiB ", + @"%[num] GiB", @"num", num)]; } else if (_resumedFrom + _received >= MEBIBYTE) { OFString *num = [OFString stringWithFormat: @"%,7.2f", (float)(_resumedFrom + _received) / MEBIBYTE]; [of_stdout writeString: OF_LOCALIZED(@"progress_mib", - @"\r %[num] MiB ", + @"%[num] MiB", @"num", num)]; } else if (_resumedFrom + _received >= KIBIBYTE) { OFString *num = [OFString stringWithFormat: @"%,7.2f", (float)(_resumedFrom + _received) / KIBIBYTE]; [of_stdout writeString: OF_LOCALIZED(@"progress_kib", - @"\r %[num] KiB ", + @"%[num] KiB", @"num", num)]; } else { OFString *num = [OFString stringWithFormat: @"%jd", _resumedFrom + _received]; [of_stdout writeString: OF_LOCALIZED(@"progress_bytes", - @"\r %[num] bytes ", + @"%[num] bytes", @"num", num)]; } + + [of_stdout writeString: @" "]; if (_stopped) _BPS = (float)_received / -(float)[_startDate timeIntervalSinceNow]; Index: utils/ofhttp/lang/de.json ================================================================== --- utils/ofhttp/lang/de.json +++ utils/ofhttp/lang/de.json @@ -1,9 +1,8 @@ { - "usage": "Benutzung: %[prog] -[cehHmoOPqv] url1 [url2 ...]\n", + "usage": "Benutzung: %[prog] -[cehHmoOPqv] url1 [url2 ...]", "full_usage": [ - "\n", "Optionen:\n", " -b --body Angegebene Datei als Body übergeben\n", " -c --continue Download von existierender Datei ", "fortsetzen\n", " -f --force Existierende Datei überschreiben\n", @@ -13,42 +12,40 @@ " -o --output Ausgabe-Dateiname angeben\n", " -O --detect-filename Dateiname mittels HEAD-Request ermitteln\n", " -P --proxy SOCKS5-Proxy angeben\n", " -q --quiet Ruhiger Modus (keine Ausgabe außer Fehler)", "\n", - " -v --verbose Geschwätziger Modus (gibt Header aus)\n", - " --insecure TLS-Fehler ignorieren\n" - ], - "invalid_input_header": [ - "%[prog]: Header müssen im Format Name:Wert sein!\n" - ], - "invalid_input_method": "%[prog]: Ungültige Request-Methode %[method]!\n", - "invalid_input_proxy": "%[prog]: Proxy muss im Format Host:Port sein!\n", - "long_argument_missing": "%[prog]: Argument für Option --%[opt] fehlt\n", - "argument_missing": "%[prog]: Argument für option -%[opt] fehlt\n", - "takes_no_argument": "%[prog]: Option --%[opt] nimmt kein Argument\n", - "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]\n", - "unknown_option": "%[prog]: Unbekannte Option: -%[opt]\n", + " -v --verbose Ausführlicher Modus (gibt Header aus)\n", + " --insecure TLS-Fehler ignorieren" + ], + "invalid_input_header": "%[prog]: Header müssen im Format Name:Wert sein!", + "invalid_input_method": "%[prog]: Ungültige Request-Methode %[method]!", + "invalid_input_proxy": "%[prog]: Proxy muss im Format Host:Port sein!", + "long_argument_missing": "%[prog]: Argument für Option --%[opt] fehlt", + "argument_missing": "%[prog]: Argument für option -%[opt] fehlt", + "option_takes_no_argument": "%[prog]: Option --%[opt] nimmt kein Argument", + "unknown_long_option": "%[prog]: Unbekannte Option: --%[opt]", + "unknown_option": "%[prog]: Unbekannte Option: -%[opt]", "quiet_xor_verbose": [ "%[prog]: -q / --quiet und -v / --verbose schließen sich gegenseitig ", - "aus!\n" + "aus!" ], "output_only_with_one_url": [ "%[prog]: -o / --output kann nicht mit mehr als einer URL benutzt ", - "werden!\n" + "werden!" ], "download_failed_address_translation": [ "%[prog]: Fehler beim Download von <%[url]>!\n", - " Adressauflösung fehlgeschlagen: %[exception]\n" + " Adressauflösung fehlgeschlagen: %[exception]" ], "download_failed_connection_failed": [ "%[prog]: Fehler beim Download von <%[url]>!\n", - " Verbindung fehlgeschlagen: %[exception]\n" + " Verbindung fehlgeschlagen: %[exception]" ], "download_failed_invalid_server_reply": [ "%[prog]: Fehler beim Download von <%[url]>!\n", - " Ungültige Antwort vom Server!\n" + " Ungültige Antwort vom Server!" ], "no_ssl_library": [ "%[prog]: Keine TLS-Bibliothek geladen!\n", " Um Dateien über https zu laden, müssen Sie eine TLS-Bibliothek für ", "ObjFW,\n", @@ -57,31 +54,31 @@ "download_failed_read_or_write_failed_any": "Lesen oder Schreiben", "download_failed_read_or_write_failed_read": "Lesen", "download_failed_read_or_write_failed_write": "Schreiben", "download_failed_read_or_write_failed": [ "%[prog]: Fehler beim Download von <%[url]>!\n", - " %[error]: %[exception]\n" + " %[error]: %[exception]" ], - "download_failed": "%[prog]: Fehler beim Download von <%[url]>!\n", + "download_failed": "%[prog]: Fehler beim Download von <%[url]>!", "download_failed_exception": [ - "%[prog]: Fehler beim Download von <%[url]>: %[exception]\n" + "%[prog]: Fehler beim Download von <%[url]>: %[exception]" ], - "download_done": "\n Fertig!\n", - "invalid_url": "%[prog]: Ungültige URL: <%[url]>!\n", - "invalid_scheme": "%[prog]: Ungültiges Schema: <%[scheme]:>!\n", + "download_done": "Fertig!", + "invalid_url": "%[prog]: Ungültige URL: <%[url]>!", + "invalid_scheme": "%[prog]: Ungültiges Schema: <%[scheme]:>!", "type_unknown": "unbekannt", "size_gib": "%[num] GiB", "size_mib": "%[num] MiB", "size_kib": "%[num] KiB", "size_bytes": "%[num] Bytes", "size_unknown": "unbekannt", - "info_name_nopad": " Name: %[name]\n", - "info_name": " Name: %[name]\n", - "info_type": " Typ: %[type]\n", - "info_size": " Größe: %[size]\n", - "output_already_exists": "%[prog]: Datei %[filename] existiert bereits!\n", + "info_name_unaligned": "Name: %[name]", + "info_name": "Name: %[name]", + "info_type": "Typ: %[type]", + "info_size": "Größe: %[size]", + "output_already_exists": "%[prog]: Datei %[filename] existiert bereits!", "failed_to_open_output": [ - "%[prog]: Kann Datei %[filename] nicht öffnen: %[exception]\n" + "%[prog]: Kann Datei %[filename] nicht öffnen: %[exception]" ], "eta_days": "%[num] t ", - "progress_bytes": "\r %[num] Bytes" + "progress_bytes": "%[num] Bytes" } Index: utils/ofzip/lang/de.json ================================================================== --- utils/ofzip/lang/de.json +++ utils/ofzip/lang/de.json @@ -28,12 +28,12 @@ "failed_to_create_directory": [ "Fehler beim Erstellen des Verzeichnis %[dir]: %[error]" ], "failed_to_open_file": "Fehler beim Öffnen der Datei %[file]: %[error]", "unknown_archive_type": "Unbekannter Archivtyp: %[type]", - "failed_to_read_file": "Fehler beim Lesen von Datei %[file]: %[error]", - "failed_to_write_file": "Fehler beim Schreiben Datei %[file]: %[error]", + "failed_to_read_file": "Fehler beim Lesen der Datei %[file]: %[error]", + "failed_to_write_file": "Fehler beim Schreiben der Datei %[file]: %[error]", "failed_to_seek_in_file": "Fehler beim Suchen in Datei %[file]: %[error]", "file_is_not_a_valid_archiv": "Datei %[file] ist kein gültiges Archiv!", "file_skipped": "übersprungen", "ask_overwrite": "%[file] überschreiben? [ynAN?]", "ask_overwrite_help": [