diff --git a/lib/gson-2.6.2.jar b/lib/gson-2.6.2.jar deleted file mode 100644 index 9d78626..0000000 Binary files a/lib/gson-2.6.2.jar and /dev/null differ diff --git a/lib/gson-2.8.5.jar b/lib/gson-2.8.5.jar new file mode 100644 index 0000000..0d5baf3 Binary files /dev/null and b/lib/gson-2.8.5.jar differ diff --git a/lib/metadata-extractor-2.11.0.jar b/lib/metadata-extractor-2.11.0.jar new file mode 100644 index 0000000..49da45e Binary files /dev/null and b/lib/metadata-extractor-2.11.0.jar differ diff --git a/lib/metadata-extractor-2.9.1.jar b/lib/metadata-extractor-2.9.1.jar deleted file mode 100644 index 5d87108..0000000 Binary files a/lib/metadata-extractor-2.9.1.jar and /dev/null differ diff --git a/lib/xmpcore-5.1.2.jar b/lib/xmpcore-5.1.2.jar deleted file mode 100644 index ecd5db1..0000000 Binary files a/lib/xmpcore-5.1.2.jar and /dev/null differ diff --git a/lib/xmpcore-5.1.3.jar b/lib/xmpcore-5.1.3.jar new file mode 100644 index 0000000..dfd0f37 Binary files /dev/null and b/lib/xmpcore-5.1.3.jar differ diff --git a/nbproject/project.properties b/nbproject/project.properties index e134ab2..135e237 100644 --- a/nbproject/project.properties +++ b/nbproject/project.properties @@ -31,11 +31,11 @@ endorsed.classpath= excludes= file.reference.BrowserLauncher2-1_3.jar=lib/BrowserLauncher2-1_3.jar file.reference.freemarker.jar=lib/freemarker.jar -file.reference.gson-2.6.2.jar=lib/gson-2.6.2.jar +file.reference.gson-2.8.5.jar=lib/gson-2.8.5.jar file.reference.jxl.jar=lib/jxl.jar -file.reference.metadata-extractor-2.9.1.jar=lib/metadata-extractor-2.9.1.jar +file.reference.metadata-extractor-2.11.0.jar=lib/metadata-extractor-2.11.0.jar file.reference.pattypan-src=src -file.reference.xmpcore-5.1.2.jar=lib/xmpcore-5.1.2.jar +file.reference.xmpcore-5.1.3.jar=lib/xmpcore-5.1.3.jar includes=** # Non-JavaFX jar file creation is deactivated in JavaFX 2.0+ projects jar.archive.disabled=true @@ -44,10 +44,10 @@ javac.classpath=\ ${javafx.classpath.extension}:\ ${file.reference.BrowserLauncher2-1_3.jar}:\ ${file.reference.freemarker.jar}:\ - ${file.reference.gson-2.6.2.jar}:\ + ${file.reference.gson-2.8.5.jar}:\ ${file.reference.jxl.jar}:\ - ${file.reference.metadata-extractor-2.9.1.jar}:\ - ${file.reference.xmpcore-5.1.2.jar} + ${file.reference.metadata-extractor-2.11.0.jar}:\ + ${file.reference.xmpcore-5.1.3.jar} # Space-separated list of extra javac options javac.compilerargs= javac.deprecation=false diff --git a/src/org/wikipedia/Wiki.java b/src/org/wikipedia/Wiki.java index cd33916..50e3d73 100644 --- a/src/org/wikipedia/Wiki.java +++ b/src/org/wikipedia/Wiki.java @@ -3678,7 +3678,7 @@ public LogEntry[] getUploads(User user) throws IOException * @return a list of all live images the user has uploaded * @throws IOException if a network error occurs */ - public LogEntry[] getUploads(User user, OffsetDateTime start, OffsetDateTime end) throws IOException + public LogEntry[] getUploads(User user, OffsetDateTime start, OffsetDateTime end) throws IOException { StringBuilder url = new StringBuilder(query); url.append("list=allimages&aisort=timestamp&aiprop=timestamp%7Ccomment&aiuser="); @@ -3713,6 +3713,30 @@ public LogEntry[] getUploads(User user, OffsetDateTime start, OffsetDateTime end log(Level.INFO, "getUploads", "Successfully retrieved uploads of " + user.getUsername() + " (" + size + " uploads)"); return uploads.toArray(new LogEntry[size]); } + + public LogEntry[] getChecksumDuplicates(String checksum) throws IOException + { + StringBuilder url = new StringBuilder(query); + url.append("list=allimages&aisha1="); + url.append(encode(checksum, false)); + + List uploads = queryAPIResult("ai", url, "getChecksumDuplicates", (line, results) -> + { + for (int i = line.indexOf(" 0; i = line.indexOf("", i); + LogEntry le = parseLogEntry(line.substring(i, b)); + le.type = UPLOAD_LOG; + le.action = "upload"; // unless it's an overwrite? + le.user = user; + results.add(le); + } + }); + + int size = uploads.size(); + log(Level.INFO, "getChecksumDuplicates", "Successfully retrieved files based on checksum " + checksum); + return uploads.toArray(new LogEntry[size]); + } /** * Uploads an image. Equivalent to [[Special:Upload]]. Supported diff --git a/src/pattypan/Settings.java b/src/pattypan/Settings.java index 8988e1c..e807012 100644 --- a/src/pattypan/Settings.java +++ b/src/pattypan/Settings.java @@ -148,6 +148,41 @@ public final class Settings { + "" ) ); + TEMPLATES.put( + "Art Photo", + new Template("Art Photo", + new TemplateField[]{ + new TemplateField("wikidata", "Wikidata"), + new TemplateField("artwork_license", "Artwork license"), + new TemplateField("photo_description", "Photo description"), + new TemplateField("photo_date", "Photo date"), + new TemplateField("photographer", "Photographer"), + new TemplateField("source", "Source"), + new TemplateField("photo_license", "Photo license"), + new TemplateField("other_versions", "Other versions"), + new TemplateField("partnership", "Partnership") + }, "=={{int:filedesc}}==\n" + + "{{Art Photo\n" + + " |wikidata = ${wikidata}\n" + + " |artwork license = ${artwork_license}\n" + + " |photo description = ${photo_description}\n" + + " |photo date = ${photo_date}\n" + + " |photographer = ${photographer}\n" + + " |source = ${source}\n" + + " |photo license = ${photo_license}\n" + + " |other_versions = ${other_versions}\n" + + "}}\n\n" + + "=={{int:license-header}}==\n" + + "${artwork_license}${photo_license}${partnership}" + + "\n\n" + + "<#if categories ? has_content>\n" + + "<#list categories ? split(\";\") as category>\n" + + "[[Category:${category?trim}]]\n" + + "\n" + + "<#else>{{subst:unc}}\n" + + "" + ) + ); TEMPLATES.put( "Book", new Template("Book", diff --git a/src/pattypan/UploadElement.java b/src/pattypan/UploadElement.java index acdad50..a27a6cf 100644 --- a/src/pattypan/UploadElement.java +++ b/src/pattypan/UploadElement.java @@ -24,10 +24,14 @@ package pattypan; import java.io.File; +import java.io.IOException; import java.net.URL; import java.net.MalformedURLException; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.Map; import java.util.logging.Level; +import java.util.logging.Logger; public final class UploadElement { @@ -58,6 +62,18 @@ public Map getData() { public File getFile() { return new File(getData("path")); } + + public String getFileChecksum() { + File file = this.getFile(); + try { + MessageDigest shaDigest = MessageDigest.getInstance("SHA-1"); + String shaChecksum = Util.getFileChecksum(shaDigest, file); + return shaChecksum; + } catch (NoSuchAlgorithmException | IOException e) { + Session.LOGGER.log(Level.SEVERE, null, e); + return null; + } + } public URL getUrl() { try { diff --git a/src/pattypan/Util.java b/src/pattypan/Util.java index 07266c0..84b9186 100644 --- a/src/pattypan/Util.java +++ b/src/pattypan/Util.java @@ -29,14 +29,17 @@ import java.awt.Desktop; import java.io.BufferedReader; import java.io.File; +import java.io.FileInputStream; import java.io.IOException; import java.io.InputStreamReader; +import java.io.UnsupportedEncodingException; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; +import java.security.MessageDigest; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; @@ -60,9 +63,12 @@ private Util() {} public static String text(String key) { try { - return bundle.getString(key); + String val = bundle.getString(key); + return new String(val.getBytes("ISO-8859-1"), "UTF-8"); } catch (final MissingResourceException ex) { return ""; + } catch (UnsupportedEncodingException ex) { + return ""; } } @@ -130,9 +136,9 @@ public static ColumnConstraints newColumn(int value, String unit, HPos position) } /* file utils */ - private final static ArrayList allowedExtentionImage = new ArrayList<>( + private final static ArrayList allowedFileExtension = new ArrayList<>( Arrays.asList("djvu", "flac", "gif", "jpg", "jpeg", "mid", - "oga", "ogg","ogv", "opus", "pdf", "png", "svg", "tiff", + "mkv", "oga", "ogg","ogv", "opus", "pdf", "png", "svg", "tiff", "tif", "wav", "webm", "webp", "xcf", "mp3", "stl") ); @@ -144,7 +150,7 @@ public static ColumnConstraints newColumn(int value, String unit, HPos position) ); public static boolean stringHasValidFileExtension(String string) { - return allowedExtentionImage.parallelStream().anyMatch(string::endsWith); + return allowedFileExtension.parallelStream().anyMatch(string::endsWith); } public static boolean isPossibleBadFilename(String name) { @@ -207,13 +213,46 @@ public static Map getFilesByExtention(File[] files) { return map; } + // @TODO: remove fancy chars public static String getNormalizedName(String name) { return name.trim().replaceAll(" +", " "); } public static boolean isFileAllowedToUpload(String name) { - return allowedExtentionImage.indexOf(getExtFromFilename(name)) > -1; + return allowedFileExtension.indexOf(getExtFromFilename(name)) > -1; } + + // @source: https://howtodoinjava.com/java/io/how-to-generate-sha-or-md5-file-checksum-hash-in-java/ + public static String getFileChecksum(MessageDigest digest, File file) throws IOException { + //Get file input stream for reading the file content + FileInputStream fis = new FileInputStream(file); + + //Create byte array to read data in chunks + byte[] byteArray = new byte[1024]; + int bytesCount = 0; + + //Read file data and update in message digest + while ((bytesCount = fis.read(byteArray)) != -1) { + digest.update(byteArray, 0, bytesCount); + }; + + //close the stream; We don't need it now. + fis.close(); + + //Get the hash's bytes + byte[] bytes = digest.digest(); + + //This bytes[] has bytes in decimal format; + //Convert it to hexadecimal format + StringBuilder sb = new StringBuilder(); + for(int i=0; i< bytes.length ;i++) + { + sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1)); + } + + //return complete hash + return sb.toString(); +} public static String readUrl(String urlString) throws Exception { BufferedReader reader = null; diff --git a/src/pattypan/panes/ChooseColumnsPane.java b/src/pattypan/panes/ChooseColumnsPane.java index 0cca500..5d9ae4b 100644 --- a/src/pattypan/panes/ChooseColumnsPane.java +++ b/src/pattypan/panes/ChooseColumnsPane.java @@ -142,7 +142,7 @@ private WikiPane setContent() { wikicodeLink = new Hyperlink(Util.text("choose-columns-wikicode")); rightContainer.getChildren().addAll( new Region(), - new WikiLabel("Advanced").setClass("bold"), + new WikiLabel("choose-columns-advanced").setClass("bold"), wikicodeLink ); diff --git a/src/pattypan/panes/UploadPane.java b/src/pattypan/panes/UploadPane.java index 5054ae0..4397a64 100644 --- a/src/pattypan/panes/UploadPane.java +++ b/src/pattypan/panes/UploadPane.java @@ -40,6 +40,7 @@ import javafx.scene.layout.VBox; import javafx.stage.Stage; import javax.security.auth.login.LoginException; +import org.wikipedia.Wiki; import pattypan.Session; import pattypan.Settings; import pattypan.UploadElement; @@ -123,6 +124,11 @@ public void changed(ObservableValue ov, String oldValue, Strin WikiLabel label = new WikiLabel(text).setAlign("left"); addInfo(label); addInfo(new WikiLabel("")); + } else if (value.contains("FILE_DUPLICATE")) { + String text = String.format("[%s/%s] ", data[1], max) + Util.text("upload-log-error", Util.text("upload-log-error-file-duplicate", data[3])); + WikiLabel label = new WikiLabel(text).setAlign("left"); + addInfo(label); + addInfo(new WikiLabel("")); } else if (value.contains("UPLOAD_SUCCESS")) { String text = String.format("[%s/%s] ", data[1], max) + Util.text("upload-log-success"); WikiLabel label = new WikiLabel(text).setAlign("left"); @@ -234,6 +240,29 @@ private boolean isFileNameTaken(String name) { return false; } } + + private String isFileUploaded(UploadElement ue) { + String checksum = ue.getFileChecksum(); + try { + Wiki.LogEntry[] entries = Session.WIKI.getChecksumDuplicates(checksum); + if(entries.length > 0) { + return entries[0].getTarget(); + } + return null; + } catch (UnknownHostException ex) { + Session.LOGGER.log(Level.WARNING, + "Error occurred during file SHA1 check: {0}", + new String[]{"no internet connection"} + ); + return null; + } catch (IOException ex) { + Session.LOGGER.log(Level.WARNING, + "Error occurred during file SHA1 check: {0}", + new String[]{ex.getLocalizedMessage()} + ); + return null; + } + } private void uploadFiles(ArrayList fileList) { Task task = new Task() { @@ -261,6 +290,17 @@ protected Object call() { skipped++; continue; } + + String duplicate = isFileUploaded(ue); + if (duplicate != null) { + updateMessage(String.format( + "FILE_DUPLICATE | %s | %s | %s", + current + 1, name, duplicate + )); + Thread.sleep(500); + skipped++; + continue; + } if (ue.getData("path").startsWith("https://") || ue.getData("path").startsWith("http://")) { Session.WIKI.upload(ue.getUrl(), name, ue.getWikicode(), summary); diff --git a/src/pattypan/resources/gear.png b/src/pattypan/resources/gear.png index 6e63053..73a9f67 100644 Binary files a/src/pattypan/resources/gear.png and b/src/pattypan/resources/gear.png differ diff --git a/src/pattypan/resources/image.png b/src/pattypan/resources/image.png index 810b4ff..e294df8 100644 Binary files a/src/pattypan/resources/image.png and b/src/pattypan/resources/image.png differ diff --git a/src/pattypan/resources/logo.png b/src/pattypan/resources/logo.png index cd73d9f..4fc7b02 100644 Binary files a/src/pattypan/resources/logo.png and b/src/pattypan/resources/logo.png differ diff --git a/src/pattypan/resources/refresh.png b/src/pattypan/resources/refresh.png index e20c566..3a0d1fc 100644 Binary files a/src/pattypan/resources/refresh.png and b/src/pattypan/resources/refresh.png differ diff --git a/src/pattypan/text/messages.properties b/src/pattypan/text/messages.properties index 7bfc9df..a648747 100644 --- a/src/pattypan/text/messages.properties +++ b/src/pattypan/text/messages.properties @@ -54,6 +54,7 @@ upload-log-canceled=Upload cancel requested. No more images will be uploaded aft upload-log-done=Upload completed. %s files uploaded, %s files skipped. upload-log-error=Error: %s. upload-log-error-name-taken=This file name is already used +upload-log-error-file-duplicate=This file is already uploaded as %s upload-log-success=File uploaded! upload-log-uploading=Uploading %s upload-name=Upload diff --git a/src/pattypan/text/messages_cs_CZ.properties b/src/pattypan/text/messages_cs_CZ.properties index c82d093..7ad405b 100644 --- a/src/pattypan/text/messages_cs_CZ.properties +++ b/src/pattypan/text/messages_cs_CZ.properties @@ -1,65 +1,65 @@ -check-intro=Kliknut\u00edm na ka\u017ed\u00fd z odkaz\u016f n\u00ed\u017ee uvid\u00edte n\u00e1hled popisku, kter\u00fd se se souborem nahraje. +check-intro=Kliknutím na každý z odkazů níže uvidíte náhled popisku, který se se souborem nahraje. check-name=Kontrola -check-preview=N\u00e1hled -choose-columns-advanced=Pokro\u010dil\u00e9 -choose-columns-fields-name=N\u00e1zev pole -choose-columns-intro=V tomto kroce m\u016f\u017eete zvolit zdroj pro vkl\u00e1dan\u00fd wikik\u00f3d. Na v\u00fdb\u011br jsou data z ji\u017e p\u0159edp\u0159ipraven\u00fdch \u0161ablon, k\u00f3d tak\u00e9 m\u016f\u017eete napsat sami +check-preview=Náhled +choose-columns-advanced=Pokročilé +choose-columns-fields-name=Název pole +choose-columns-intro=V tomto kroce můžete zvolit zdroj pro vkládaný wikikód. Na výběr jsou data z již předpřipravených šablon, kód také můžete napsat sami choose-columns-name=Zvolte sloupce -choose-columns-radio-buttons=Ano / Pevn\u011b dan\u00fd / Ne -choose-columns-template=\u0160ablona -choose-columns-template-doc=Dokumentace \u0161ablony -choose-columns-template-intro=Zvolte pole, kter\u00e1 pova\u017eujete za nezbytn\u00e1. Pokud vyberete volbu "Ano" m\u016f\u017eete si sami zvolit obsah pole. S volbou "Pevn\u011b dan\u00fd" se bude opakovat jedna p\u0159eddefinovan\u00e1 hodnota u v\u0161ech soubor\u016f. +choose-columns-radio-buttons=Ano / Pevně daný / Ne +choose-columns-template=Šablona +choose-columns-template-doc=Dokumentace šablony +choose-columns-template-intro=Zvolte pole, která považujete za nezbytná. Pokud vyberete volbu "Ano" můžete si sami zvolit obsah pole. S volbou "Pevně daný" se bude opakovat jedna předdefinovaná hodnota u všech souborů. choose-columns-value=Hodnota -choose-columns-wikicode=Napi\u0161te wikik\u00f3d -choose-directory-include-subdirectories=Zahrnout soubory z podadres\u00e1\u0159\u016f. -choose-directory-intro=Vyberte slo\u017eku, kter\u00e1 obsahuje soubory k nahr\u00e1n\u00ed. Klikn\u011bte "Proch\u00e1zet" pro vybr\u00e1n\u00ed slo\u017eky. -choose-directory-name=Vyberte slo\u017eku -choose-directory-no-files=\u017d\u00e1dn\u00e9 soubory nejsou vhodn\u00e9 pro nahr\u00e1v\u00e1n\u00ed. -choose-directory-window-name=Vyberte slo\u017eku -create-file-back-to-start=Pokra\u010dovat a nahr\u00e1t -create-file-button=Vytvo\u0159it soubor -create-file-error=Vytvo\u0159en\u00ed tabulky se nezda\u0159ilo! -create-file-filename=N\u00e1zev souboru (bez p\u0159\u00edpony) -create-file-name=Vytvo\u0159it soubor -create-file-open=Otev\u0159\u00edt soubor -create-file-success=Tabulka byla \u00fasp\u011b\u0161n\u011b vytvo\u0159ena. -create-file-summary=Bude vytvo\u0159ena tabulka obsahuj\u00edc\u00ed %s soubor\u016f ze slo\u017eky %s. -generic-back=Zp\u011bt -generic-browse=Proch\u00e1zet +choose-columns-wikicode=Napište wikikód +choose-directory-include-subdirectories=Zahrnout soubory z podadresářů. +choose-directory-intro=Vyberte složku, která obsahuje soubory k nahrání. Klikněte "Procházet" pro vybrání složky. +choose-directory-name=Vyberte složku +choose-directory-no-files=Žádné soubory nejsou vhodné pro nahrávání. +choose-directory-window-name=Vyberte složku +create-file-back-to-start=Pokračovat a nahrát +create-file-button=Vytvořit soubor +create-file-error=Vytvoření tabulky se nezdařilo! +create-file-filename=Název souboru (bez přípony) +create-file-name=Vytvořit soubor +create-file-open=Otevřít soubor +create-file-success=Tabulka byla úspěšně vytvořena. +create-file-summary=Bude vytvořena tabulka obsahující %s souborů ze složky %s. +generic-back=Zpět +generic-browse=Procházet generic-cancel=Storno -generic-next=Dal\u0161\u00ed -generic-summary=Shrnut\u00ed +generic-next=Další +generic-summary=Shrnutí log-file=Soubor logu -login-2fa=Klikn\u011bte sem, pokud jste povolili dvouf\u00e1zovou autentizaci. -login-failed=P\u0159ihl\u00e1\u0161en\u00ed se nezda\u0159ilo -login-intro=P\u0159ihla\u0161te se k va\u0161emu \u00fa\u010dtu pros\u00edm. -login-load=Prob\u00edh\u00e1 p\u0159ihla\u0161ov\u00e1n\u00ed... -login-login-button=P\u0159ihla\u0161te se -login-login-field=U\u017eivatelsk\u00e9 jm\u00e9no -login-name=P\u0159ihl\u00e1\u0161en\u00ed +login-2fa=Klikněte sem, pokud jste povolili dvoufázovou autentizaci. +login-failed=Přihlášení se nezdařilo +login-intro=Přihlašte se k vašemu účtu prosím. +login-load=Probíhá přihlašování... +login-login-button=Přihlašte se +login-login-field=Uživatelské jméno +login-name=Přihlášení login-password-field=Heslo start-bug-found=Nalezli jste chybu? -start-bug-report=Nahla\u0161te j\u00ed! +start-bug-report=Nahlašte jí! start-generate-button=Vygenerovat tabulku -start-generate-description=Vyberte slo\u017eku ve va\u0161em po\u010d\u00edta\u010di a podle dat v n\u00ed vygenerujte tabulku. -start-new-version-available=Je k dispozici nov\u00e1 verze -start-new-version-available-download=St\u00e1hn\u011bte si ji nyn\u00ed -start-validate-button=Zkontrolovat a nahr\u00e1t +start-generate-description=Vyberte složku ve vašem počítači a podle dat v ní vygenerujte tabulku. +start-new-version-available=Je k dispozici nová verze +start-new-version-available-download=Stáhněte si ji nyní +start-validate-button=Zkontrolovat a nahrát start-validate-description=Zkontrolujte, zda-li je tabulka bez chyb, a nahrajte soubory. -upload-button=Nahr\u00e1t -upload-continue=Pokra\u010dovat +upload-button=Nahrát +upload-continue=Pokračovat upload-intro=Please click "Upload" in order to upload files. You can stop upload in any time clicking "Stop" button. upload-log-canceled=Upload cancel requested. No more images will be uploaded after currently uploading one. upload-log-done=Upload completed. %s files uploaded, %s files skipped. upload-log-error=Chyba: %s. -upload-log-error-name-taken=Tento n\u00e1zev se u\u017e pou\u017e\u00edv\u00e1 -upload-log-success=Soubor nahr\u00e1n! -upload-log-uploading=Nahr\u00e1v\u00e1 se: %s -upload-name=Nahr\u00e1t -upload-next-sheet=Nahr\u00e1t data z dal\u0161\u00ed tabulky +upload-log-error-name-taken=Tento název se už používá +upload-log-success=Soubor nahrán! +upload-log-uploading=Nahrává se: %s +upload-name=Nahrát +upload-next-sheet=Nahrát data z další tabulky upload-retry=Zkusit znovu upload-stop=Zastavit validate-file-select=Vybrat soubor validate-file-type=soubory XLS (*.xls) -validate-intro=Vyberte tabulku se soubory, kter\u00e9 jsou p\u0159ipraveny k nahr\u00e1n\u00ed. Klikn\u011bte na "Proch\u00e1zet" pro vybr\u00e1n\u00ed soubor\u016f. -validate-name=Na\u010d\u00edst +validate-intro=Vyberte tabulku se soubory, které jsou připraveny k nahrání. Klikněte na "Procházet" pro vybrání souborů. +validate-name=Načíst diff --git a/src/pattypan/text/messages_de.properties b/src/pattypan/text/messages_de.properties new file mode 100644 index 0000000..318d98a --- /dev/null +++ b/src/pattypan/text/messages_de.properties @@ -0,0 +1,66 @@ +check-intro=Anklicken der Links öffnet eine Vorschau der Beschreibung, die hochgeladen wird +check-name=Kontrollieren +check-preview=Vorschau +choose-columns-advanced=Erweitert +choose-columns-exif=Datum aus Exif laden +choose-columns-fields-name=Feldname +choose-columns-intro=In diesem Schritt kann der Wikitext eingeben werden. Es können bestehende oder neue Vorlagen verwendet werden +choose-columns-name=Spalte auswählen +choose-columns-radio-buttons=Ja / Konstant / Nein +choose-columns-template=Vorlage +choose-columns-template-doc=Vorlagendokumentation +choose-columns-template-intro=Notwendige Felder können unterhalb ausgewählt werden. Die Option "Ja" füllt Felder automatisch aus. Die Option "Konstant" befüllt das Feld mit einem Text, der nicht für einzelne Felder angepasst wird +choose-columns-value=Wert +choose-columns-wikicode=Wikitext schreiben +choose-directory-include-subdirectories=Datein aus Unterordnern inkludieren +choose-directory-intro=Order auswählen, der die Datein enthält, die in der Tabelle beschrieben werden. Mit "Browse" kann ein Ordner gewählt werden. +choose-directory-name=Ordner auswählen +choose-directory-no-files=Keine uploadbaren Datein gefunden. +choose-directory-window-name=Ordner auswählen +create-file-back-to-start=Weiter und Upload +create-file-button=Datei erstellen +create-file-error=Ein Fehler ist während der Erstellung der Tabelle aufgetreten! +create-file-filename=Dateiname (Ohne Endung) +create-file-name=Datei erstellen +create-file-open=Datei öffnen +create-file-success=Tabelle erfolgreich erstellt. +create-file-summary=Tabelle mit %s Dateien im Ordner %s erstellt. +generic-back=Zurück +generic-browse=Durchsuchen +generic-cancel=Abbrechen +generic-next=Weiter +generic-summary=Zusammenfassung +login-2fa=Hier klicken wenn Ihr Account 2-Faktor-Authentifizierung verwendet. +login-failed=Login fehlgeschlagen +log-file=Log-Datei +login-intro=Bitte mit dem Upload-Account einloggen. +login-load=Warten auf einloggen ... +login-login-button=Einloggen +login-login-field=Einloggen +login-name=Einloggen +login-password-field=Passwort +start-bug-found=Bug gefunden? +start-bug-report=Melde ihn hier! +start-generate-button=Tabelle generieren +start-generate-description=Durch auswählen eines Verzeichnisses wird eine Tabelle auf die Festplatte geschrieben. +start-new-version-available=Eine neue Version ist verfügbar! +start-new-version-available-download=Jetzt herunterladen. +start-validate-button=Validieren & Upload +start-validate-description=Tabelle auf Fehler überprüfen und Datein uploaden. +upload-button=Uploaden +upload-continue=Weiter +upload-intro=Klick auf "Upload" lädt die Datein hoch. Der Upload kann jederzeit mit "Stop" abgebrochen werden. +upload-log-canceled=Upload wird abgebrochen. Nach dieser Datei werden keine weiteren hochgeladen. +upload-log-done=Upload abgeschlossen. %s Datein hochgeladen, %s Dateien übersprungen. +upload-log-error=Fehler: %s. +upload-log-error-name-taken=Dieser Dateiname wird bereits verwendet +upload-log-success=Datei hochgeladen! +upload-log-uploading=Wird hochgeladen %s +upload-name=Upload +upload-next-sheet=Nächste Tabelle hochladen +upload-retry=Wiederholen +upload-stop=Stop +validate-file-select=Datei auswählen +validate-file-type=XLS Dateien (*.xls) +validate-intro=Tabelle auswählen, die zum Upload bereite Datein enthält. "Durchsuchen" erlaubt es Datein auszuwählen. +validate-name=Laden diff --git a/src/pattypan/text/messages_fr_FR.properties b/src/pattypan/text/messages_fr_FR.properties new file mode 100644 index 0000000..3c0de77 --- /dev/null +++ b/src/pattypan/text/messages_fr_FR.properties @@ -0,0 +1,66 @@ +check-intro=Cliquez sur chaque lien ci-dessous pour voir un aperçu de la description qui sera téléchargée. +check-name=Vérifier +check-preview=Aperçu +choose-columns-advanced=Avancé +choose-columns-exif=Précharger la date depuis les métadonnées Exif +choose-columns-fields-name=Nom du champ +choose-columns-intro=A cette étape, vous pouvez définir le wikicode source. Vous pouvez choisir entre les modèles déjà créés et écrire votre propre wikicode. +choose-columns-name=Choisir les colonnes +choose-columns-radio-buttons=Oui / Const / Non +choose-columns-template=Modèle +choose-columns-template-doc=Documentation du modèle +choose-columns-template-intro=Sélectionnez les champs que vous jugez nécessaires en utilisant les boutons radio ci-dessous. Si vous choisissez "Oui", vous pouvez pré-remplir les champs à l'aide du champ texte. Si vous choisissez "Const", la valeur du champ texte sera appliquée à tous les fichiers sans possibilité de la modifier par fichier. +choose-columns-value=Valeur +choose-columns-wikicode=Écrire le wikicode +choose-directory-include-subdirectories=Inclure les fichiers des sous-répertoires +choose-directory-intro=Sélectionnez le répertoire qui contient les fichiers qui seront décrits dans le tableur. Cliquez sur "Parcourir" pour sélectionner le répertoire. +choose-directory-name=Choisir un répertoire +choose-directory-no-files=Aucun fichier ne peut être téléversé. +choose-directory-window-name=Choisir un répertoire +create-file-back-to-start=Continuer et envoyer +create-file-button=Créer un fichier +create-file-error=Une erreur s'est produite lors de la création du fichier tableur ! +create-file-filename=Nom de fichier (sans extension) +create-file-name=Créer un fichier +create-file-open=Ouvrir le fichier +create-file-success=Tableur créé avec succès. +create-file-summary=Vous allez créer un tableur avec %s fichiers à partir du répertoire %s. +generic-back=Retour +generic-browse=Parcourir +generic-cancel=Annuler +generic-next=Suivant +generic-summary=Résumé +login-2fa=Cliquez ici si vous avez activé l'authentification à deux facteurs. +login-failed=Échec de la connexion +log-file=Fichier log +login-intro=Veuillez vous connecter à votre compte de téléversement. +login-load=Connexion... +login-login-button=Connexion +login-login-field=Identifiant +login-name=Identifiant +login-password-field=Mot de passe +start-bug-found=Vous avez trouvé un bug ? +start-bug-report=Le signaler ! +start-generate-button=Générer un tableur +start-generate-description=Générer un tableur en sélectionnant un répertoire sur votre disque dur. +start-new-version-available=Nouvelle version disponible ! +start-new-version-available-download=Télécharger maintenant. +start-validate-button=Valider et envoyer +start-validate-description=Vérifier l'exactitude de votre tableur et envoyer les fichiers. +upload-button=Envoyer +upload-continue=Continuer +upload-intro=Veuillez cliquer sur "Envoyer" pour envoyer les fichiers. Vous pouvez arrêter le téléchargement à tout moment en cliquant sur le bouton "Arrêter". +upload-log-canceled=Annulation de l'envoi demandée. Aucune autre image ne sera envoyée après l'envoi courant. +upload-log-done=Envoi terminé. %s fichiers téléchargés, %s fichiers ignorés. +upload-log-error=Erreur : %s. +upload-log-error-name-taken=Ce nom de fichier est déjà utilisé +upload-log-success=Fichier envoyé ! +upload-log-uploading=Envoi de %s +upload-name=Envoi +upload-next-sheet=Envoyer le tableur suivant +upload-retry=Réessayer +upload-stop=Arrêter +validate-file-select=Sélectionner un fichier +validate-file-type=Fichiers XLS (*.xls) +validate-intro=Choisissez un tableur avec les données des fichiers prêts à être envoyés. Cliquez sur "Parcourir" pour sélectionner le fichier. +validate-name=Charger diff --git a/src/pattypan/text/messages_nl.properties b/src/pattypan/text/messages_nl.properties index d411e5e..1182401 100644 --- a/src/pattypan/text/messages_nl.properties +++ b/src/pattypan/text/messages_nl.properties @@ -1,4 +1,4 @@ -check-intro=Klik op elke link hieronder om een voorbeeld van de beschrijving, welke ge\u00fcpload wordt, te zien. +check-intro=Klik op elke link hieronder om een voorbeeld van de beschrijving, welke geüpload wordt, te zien. check-name=Controleren check-preview=Voorbeeld choose-columns-advanced=Geavanceerd @@ -14,7 +14,7 @@ choose-columns-wikicode=Wikitekst invoeren choose-directory-include-subdirectories=Inclusief bestanden uit submappen choose-directory-intro=Selecteer een map die de bestanden bevat welke in het spreadsheet moeten worden beschreven. choose-directory-name=Map kiezen -choose-directory-no-files=Geen bestanden die ge\u00fcpload kunnen worden gevonden. +choose-directory-no-files=Geen bestanden die geüpload kunnen worden gevonden. choose-directory-window-name=Kies map create-file-back-to-start=Doorgaan en uploaden create-file-button=Maak bestand @@ -46,8 +46,8 @@ start-validate-button=Valideren en uploaden start-validate-description=Controleer of uw spreadsheet geldig is en upload bestanden. upload-button=Upload upload-intro=Klik op "upload" om uw bestanden te uploaden. Dit kan op elk moment worden stopgezet door op "stop" te klikken. -upload-log-canceled=Verzoek om upload te stoppen, er worden geen bestanden meer ge\u00fcpload na het huidige bestand. -upload-log-done=Upload afgerond: %s bestanden ge\u00fcpload, %s bestanden overgeslagen. +upload-log-canceled=Verzoek om upload te stoppen, er worden geen bestanden meer geüpload na het huidige bestand. +upload-log-done=Upload afgerond: %s bestanden geüpload, %s bestanden overgeslagen. upload-log-error=Foutmelding: %s. upload-log-error-name-taken=Deze bestandsnaam is al in gebruik upload-log-success=Bestand geupload! diff --git a/src/pattypan/text/messages_pl_PL.properties b/src/pattypan/text/messages_pl_PL.properties index d5e9dd3..6f98f99 100644 --- a/src/pattypan/text/messages_pl_PL.properties +++ b/src/pattypan/text/messages_pl_PL.properties @@ -1,65 +1,65 @@ -check-intro=Kliknij linki poni\u017cej, aby zobaczy\u0107 podgl\u0105d opisu \u0142adowanych plik\u00f3w. -check-name=Sprawd\u017a opis -check-preview=Podgl\u0105d +check-intro=Kliknij linki poniżej, aby zobaczyć podgląd opisu ładowanych plików. +check-name=Sprawdź opis +check-preview=Podgląd choose-columns-advanced=Zaawansowane -choose-columns-exif=Za\u0142aduj dat\u0119 z Exif +choose-columns-exif=Załaduj datę z Exif choose-columns-fields-name=Nazwa pola -choose-columns-intro=Mo\u017cesz teraz wybra\u0107, jaki opis pasuje do \u0142adowanych plik\u00f3w\: mo\u017cesz wybra\u0107 jeden z domy\u015blnie stosowanych szablon\u00f3w lub samodzielnie utworzy\u0107 dowolny opis w wikikodzie. +choose-columns-intro=Możesz teraz wybrać, jaki opis pasuje do ładowanych plików\: możesz wybrać jeden z domyślnie stosowanych szablonów lub samodzielnie utworzyć dowolny opis w wikikodzie. choose-columns-name=Wybierz kolumny -choose-columns-radio-buttons=Tak / Sta\u0142a / Nie +choose-columns-radio-buttons=Tak / Stała / Nie choose-columns-template=Szablon choose-columns-template-doc=Dokumentacja szablonu -choose-columns-template-intro=Wybierz pola kt\u00f3re zamierzasz u\u017cywa\u0107 korzystaj\u0105c z p\u00f3l jednokrotnego wyboru poni\u017cej. Je\u015bli wybierzesz "Tak", akrusz zostanie uzupe\u0142niony warto\u015bci\u0105 z pola tekstowego. Je\u015bli wybierzesz "Sta\u0142a", warto\u015b\u0107 z pola tekstowego zostanie zastosowana bez mo\u017cliwo\u015bci p\u00f3\u017aniejszej zmiany dla pojedynczego pliku. -choose-columns-value=Warto\u015b\u0107 +choose-columns-template-intro=Wybierz pola które zamierzasz używać korzystając z pól jednokrotnego wyboru poniżej. Jeśli wybierzesz "Tak", akrusz zostanie uzupełniony wartością z pola tekstowego. Jeśli wybierzesz "Stała", wartość z pola tekstowego zostanie zastosowana bez możliwości późniejszej zmiany dla pojedynczego pliku. +choose-columns-value=Wartość choose-columns-wikicode=Wpisz wikikod -choose-directory-include-subdirectories=Uwzgl\u0119dnij pliki z podfolder\u00f3w -choose-directory-intro=Wybierz folder, kt\u00f3ry zawiera pliki do opisania w arkuszu kalkulacyjnym. Kliknij "Przegl\u0105daj" aby wybra\u0107 folder na komputerze. +choose-directory-include-subdirectories=Uwzględnij pliki z podfolderów +choose-directory-intro=Wybierz folder, który zawiera pliki do opisania w arkuszu kalkulacyjnym. Kliknij "Przeglądaj" aby wybrać folder na komputerze. choose-directory-name=Wybierz folder -choose-directory-no-files=Brak plik\u00f3w spe\u0142niaj\u0105cych kryteria wyszukiwania. +choose-directory-no-files=Brak plików spełniających kryteria wyszukiwania. choose-directory-window-name=Wybierz folder -create-file-back-to-start=Kontynuuj i prze\u015blij -create-file-button=Utw\u00f3rz arkusz -create-file-error=Wyst\u0105pi\u0142 b\u0142\u0105d podczas generowania arkusza\! +create-file-back-to-start=Kontynuuj i prześlij +create-file-button=Utwórz arkusz +create-file-error=Wystąpił błąd podczas generowania arkusza\! create-file-filename=Nazwa pliku (bez rozszerzenia) -create-file-name=Utw\u00f3rz arkusz -create-file-open=Otw\u00f3rz plik -create-file-success=Arkusz zosta\u0142 pomy\u015blnie utworzony. -create-file-summary=Zostanie utworzony arkusz z opisami %s plik\u00f3w z katalogu %s. +create-file-name=Utwórz arkusz +create-file-open=Otwórz plik +create-file-success=Arkusz został pomyślnie utworzony. +create-file-summary=Zostanie utworzony arkusz z opisami %s plików z katalogu %s. generic-back=Wstecz -generic-browse=Przegl\u0105daj +generic-browse=Przeglądaj generic-cancel=Anuluj generic-next=Dalej generic-summary=Podsumowanie -login-failed=B\u0142\u0105d logowania -login-intro=Zaloguj si\u0119 swoj\u0105 nazw\u0105 u\u017cytkownika i has\u0142em w Wikimedia Commons. +login-failed=Błąd logowania +login-intro=Zaloguj się swoją nazwą użytkownika i hasłem w Wikimedia Commons. login-load=Logowanie... -login-login-button=Zaloguj si\u0119 +login-login-button=Zaloguj się login-login-field=Login login-name=Zaloguj -login-password-field=Has\u0142o -start-bug-found=Widzisz b\u0142\u0105d? -start-bug-report=Zg\u0142o\u015b go! +login-password-field=Hasło +start-bug-found=Widzisz błąd? +start-bug-report=Zgłoś go! start-generate-button=Generuj arkusz -start-generate-description=Aby utworzy\u0107 arkusz kalkulacyjny, wybierz folder na komputerze zawieraj\u0105cy pliki do za\u0142adowania. -start-new-version-available=Nowa wersja programu jest dost\u0119pna! +start-generate-description=Aby utworzyć arkusz kalkulacyjny, wybierz folder na komputerze zawierający pliki do załadowania. +start-new-version-available=Nowa wersja programu jest dostępna! start-new-version-available-download=Pobierz teraz. -start-validate-button=Sprawd\u017a i prze\u015blij -start-validate-description=Sprawd\u017a, czy wprowadzone dane s\u0105 poprawne, i za\u0142aduj pliki. -upload-button=Prze\u015blij +start-validate-button=Sprawdź i prześlij +start-validate-description=Sprawdź, czy wprowadzone dane są poprawne, i załaduj pliki. +upload-button=Prześlij upload-continue=Kontynuuj -upload-intro=Kliknij przycisk "Prze\u015blij", aby przes\u0142a\u0107 pliki do Wikimedia Commons. Przesy\u0142anie mo\u017cna przerwa\u0107 klikaj\u0105c przycisk "Zatrzymaj". -upload-log-canceled=Przesy\u0142anie plik\u00f3w zosta\u0142o zatrzymane. Kolejne pliki nie b\u0119d\u0105 \u0142adowane. -upload-log-done=Przesy\u0142anie zako\u0144czone. Za\u0142adowano %s plik\u00f3w, nie za\u0142adowano %s plik\u00f3w. -upload-log-error=B\u0142\u0105d: %s. -upload-log-error-name-taken=Podana nazwa pliku jest ju\u017c w u\u017cyciu -upload-log-success=Plik przes\u0142any! -upload-log-uploading=Przesy\u0142anie %s -upload-name=Prze\u015blij -upload-next-sheet=Prze\u015blij nast\u0119pny arkusz -upload-retry=Pon\u00f3w +upload-intro=Kliknij przycisk "Prześlij", aby przesłać pliki do Wikimedia Commons. Przesyłanie można przerwać klikając przycisk "Zatrzymaj". +upload-log-canceled=Przesyłanie plików zostało zatrzymane. Kolejne pliki nie będą ładowane. +upload-log-done=Przesyłanie zakończone. Załadowano %s plików, nie załadowano %s plików. +upload-log-error=Błąd: %s. +upload-log-error-name-taken=Podana nazwa pliku jest już w użyciu +upload-log-success=Plik przesłany! +upload-log-uploading=Przesyłanie %s +upload-name=Prześlij +upload-next-sheet=Prześlij następny arkusz +upload-retry=Ponów upload-stop=Zatrzymaj validate-file-select=Wybierz plik validate-file-type=pliki XLS (*.xls) -validate-intro=Wybierz arkusz kalkulacyjny z opisami plik\u00f3w gotowych do przes\u0142ania. Kliknij "Przegl\u0105daj" aby wybra\u0107 plik. -validate-name=Za\u0142aduj +validate-intro=Wybierz arkusz kalkulacyjny z opisami plików gotowych do przesłania. Kliknij "Przeglądaj" aby wybrać plik. +validate-name=Załaduj log-file=Plik logu diff --git a/src/pattypan/text/messages_sv.properties b/src/pattypan/text/messages_sv.properties new file mode 100644 index 0000000..fd310df --- /dev/null +++ b/src/pattypan/text/messages_sv.properties @@ -0,0 +1,66 @@ +check-intro=Klicka på varje länk nedan för att se en förhandsvisning av beskrivningen som kommer laddas upp. +check-name=Kontrollera +check-preview=Förhandsvisa +choose-columns-advanced=Avancerad +choose-columns-exif=Hämtatum från Exif +choose-columns-fields-name=Fältnamn +choose-columns-intro=Vidtta steg kan du välja källan till wikikoden. Du kan välja mellan en av redan skapade mallarna eller skriva din egen wikikod. +choose-columns-name=Välj kolumner +choose-columns-radio-buttons=Ja / Konstant / Nej +choose-columns-template=Mall +choose-columns-template-doc=Mall dokumentation +choose-columns-template-intro=Välj fälten du har Bähov av genom att använda radioknapparna nedan. Om du väljer "Ja" så kan du genom textfältet förhandsvälja ett standard värde. Om du väljer "Konstant" så kommer värdet från textfältet att användas för alla filer utan att du har möjlighet att ändrat per fil. +choose-columns-value=Värde +choose-columns-wikicode=Skriv wikikod +choose-directory-include-subdirectories=Inkludera filer från undermappar +choose-directory-intro=Välj mappen som innehåller filerna som du vill beskriva i kalkylarket. Klicka "Bläddra" för att välja mapp. +choose-directory-name=Välj mapp +choose-directory-no-files=Inga filer är lämpliga för uppladdning. +choose-directory-window-name=Välj mapp +create-file-back-to-start=Fortsätt och ladda upp +create-file-button=Skapa fil +create-file-error= EttconvertUTF82Char: error1 FE!l inträffade under skapandet av kalkylarksfilen! +create-file-filename=Filnamn (utan filändelse) +create-file-name=Skapa fil +create-file-open=öppna fil +create-file-success=Kalkylarket skapades framgångsrikt. +create-file-summary=Du kommer att skapa ett kalkylark med %s filer från mappen %s. +generic-back=Tillbaka +generic-browse=Bläddra +generic-cancel=Avbryt +generic-next=Nästa +generic-summary=Sammanfattning +login-2fa=Klicka här om du har tvåfaktorsautentisering aktiverat. +login-failed=Inloggningen misslyckades +log-file=Loggfil +login-intro=Logga in med ditt tänkta uppladdningskonto. +login-load=Loggar in... +login-login-button=Logga in +login-login-field=Logga in +login-name=Logga in +login-password-field=Lösenord +start-bug-found=Hittat en bugg? +start-bug-report=Rapporteran! +start-generate-button=Generera kalkylark +start-generate-description=Generera kalkylark genom att välja en mapp på din hårddisk. +start-new-version-available=En ny version är tillgänglig! +start-new-version-available-download=Ladda ner nu. +start-validate-button=Validera och ladda upp +start-validate-description=Kolla riktigheten för informationen i ditt kalkylark och ladda upp filer. +upload-button=Ladda upp +upload-continue=Fortsätt +upload-intro=Klicka på "Ladda upp" för att ladda upp filer. Du kan när som helst avbryta genom att klicka "Stopp". +upload-log-canceled=Uppladdningen avbryts. Inga fler filer änn som just nu laddas upp kommer att laddas upp. +upload-log-done=Uppladdningen är klar. %s filer laddades upp, %s. +upload-log-error=Fel: %s. +upload-log-error-name-taken=Detta filnamn används redan +upload-log-success=Filen är uppladdad! +upload-log-uploading=Laddar upp %s +upload-name=Ladda upp +upload-next-sheet=Ladda upp nästa kalkylark +upload-retry=Försök igen +upload-stop=Stopp +validate-file-select=Välj fil +validate-file-type=XLS filer (*.xls) +validate-intro=Välj kalkylark med informationen om filerna du vill ladda upp. Klicka "Blädda" för att välja fil. +validate-name=Ladda \ No newline at end of file