Index: 3thparty/jupload/.classpath
===================================================================
--- 3thparty/jupload/.classpath	(revision 3951)
+++ 3thparty/jupload/.classpath	(revision 3951)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+	<classpathentry kind="lib" path="/home/alexandrecorreia/workspace/workspace_java/jupload/lib/plugin.jar"/>       
+</classpath>
Index: 3thparty/jupload/.classpath_template_for_and_build
===================================================================
--- 3thparty/jupload/.classpath_template_for_and_build	(revision 3951)
+++ 3thparty/jupload/.classpath_template_for_and_build	(revision 3951)
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="src" output="target/classes" path="src/main/java"/>
+	<classpathentry excluding="**" kind="src" output="target/classes" path="src/main/resources"/>
+	<classpathentry kind="src" output="target/test-classes" path="src/test/java"/>
+	<classpathentry excluding="**" kind="src" output="target/test-classes" path="src/test/resources"/>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
+	<classpathentry kind="con" path="org.maven.ide.eclipse.MAVEN2_CLASSPATH_CONTAINER"/>
+	<classpathentry kind="output" path="target/classes"/>
+	#dependencyJarFile#
+</classpath>
Index: 3thparty/jupload/maven-build.xml
===================================================================
--- 3thparty/jupload/maven-build.xml	(revision 3951)
+++ 3thparty/jupload/maven-build.xml	(revision 3951)
@@ -0,0 +1,288 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- ====================================================================== -->
+<!-- Ant build file (http://ant.apache.org/) for Ant 1.6.2 or above.        -->
+<!-- ====================================================================== -->
+
+<!-- ====================================================================== -->
+<!-- ===================== - DO NOT EDIT THIS FILE! - ===================== -->
+<!-- ====================================================================== -->
+<!--                                                                        -->
+<!-- Any modifications will be overwritten.                                 -->
+<!--                                                                        -->
+<!-- Generated by Maven Ant Plugin on 6/1/10 8:14 PM                        -->
+<!-- See: http://maven.apache.org/plugins/maven-ant-plugin/                 -->
+<!--                                                                        -->
+<!-- ====================================================================== -->
+
+<project name="jupload-from-maven" default="package" basedir=".">
+
+	<!-- ====================================================================== -->
+	<!-- Build environment properties                                           -->
+	<!-- ====================================================================== -->
+
+	<property file="${user.home}/.m2/maven.properties" />
+	<property file="maven-build.properties" />
+
+	<property name="maven.build.finalName" value="wjhk.jupload" />
+	<property name="maven.build.dir" value="target" />
+	<property name="maven.build.outputDir" value="${maven.build.dir}/classes" />
+	<property name="maven.build.srcDir.0" value="src/main/java" />
+	<property name="maven.build.resourceDir.0" value="src/main/resources" />
+	<property name="maven.build.testOutputDir"
+	          value="${maven.build.dir}/test-classes" />
+	<property name="maven.build.testDir.0" value="src/test/java" />
+	<property name="maven.build.testResourceDir.0" value="src/test/resources" />
+	<property name="maven.test.reports"
+	          value="${maven.build.dir}/test-reports" />
+	<property name="maven.reporting.outputDirectory"
+	          value="${maven.build.dir}/site" />
+
+	<property name="maven.repo.local" value="${user.home}/.m2/repository" />
+	<property name="maven.settings.offline" value="false" />
+	<property name="maven.settings.interactiveMode" value="true" />
+
+	<!-- ====================================================================== -->
+	<!-- Defining classpaths                                                    -->
+	<!-- ====================================================================== -->
+
+	<path id="build.classpath">
+		<fileset dir="${maven.repo.local}">
+			<include name="commons-net/commons-net/1.4.1/commons-net-1.4.1.jar" />
+			<include name="oro/oro/2.0.8/oro-2.0.8.jar" />
+			<!-- include name="com/sun/runtime/java-plugin/1.5.0/java-plugin-1.5.0.jar"/ -->
+		</fileset>
+		<fileset file="./lib/plugin.jar" />
+	</path>
+	<path id="build.test.classpath">
+		<fileset dir="${maven.repo.local}">
+			<include name="junit/junit/4.5/junit-4.5.jar" />
+			<include name="commons-net/commons-net/1.4.1/commons-net-1.4.1.jar" />
+			<include name="oro/oro/2.0.8/oro-2.0.8.jar" />
+			<!-- include name="com/sun/runtime/java-plugin/1.5.0/java-plugin-1.5.0.jar" / -->
+			<include name="log4j/log4j/1.2.13/log4j-1.2.13.jar" />
+		</fileset>
+		<fileset file="./lib/plugin.jar" />
+	</path>
+
+	<!-- ====================================================================== -->
+	<!-- Cleaning up target                                                     -->
+	<!-- ====================================================================== -->
+
+	<target name="clean" description="Clean the output directory">
+		<delete dir="${maven.build.dir}" />
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Compilation target                                                     -->
+	<!-- ====================================================================== -->
+
+	<target name="compile" depends="get-deps" description="Compile the code">
+		<mkdir dir="${maven.build.outputDir}" />
+		<javac destdir="${maven.build.outputDir}"
+		       nowarn="false"
+		       debug="true"
+		       optimize="false"
+		       deprecation="true"
+		       target="1.5"
+		       verbose="false"
+		       fork="false"
+		       source="1.5">
+			<src>
+				<pathelement location="${maven.build.srcDir.0}" />
+			</src>
+			<classpath refid="build.classpath" />
+		</javac>
+		<copy todir="${maven.build.outputDir}">
+			<fileset dir="${maven.build.resourceDir.0}" />
+		</copy>
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Test-compilation target                                                -->
+	<!-- ====================================================================== -->
+
+	<target name="compile-tests"
+	        depends="compile"
+	        description="Compile the test code"
+	        unless="maven.test.skip">
+		<mkdir dir="${maven.build.testOutputDir}" />
+		<javac destdir="${maven.build.testOutputDir}"
+		       nowarn="false"
+		       debug="true"
+		       optimize="false"
+		       deprecation="true"
+		       target="1.5"
+		       verbose="false"
+		       fork="false"
+		       source="1.5">
+			<src>
+				<pathelement location="${maven.build.testDir.0}" />
+			</src>
+			<classpath>
+				<path refid="build.test.classpath" />
+				<pathelement location="${maven.build.outputDir}" />
+			</classpath>
+		</javac>
+		<copy todir="${maven.build.testOutputDir}">
+			<fileset dir="${maven.build.testResourceDir.0}" />
+		</copy>
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Run all tests                                                          -->
+	<!-- ====================================================================== -->
+
+	<target name="test"
+	        depends="compile-tests, junit-missing"
+	        unless="junit.skipped"
+	        description="Run the test cases">
+		<mkdir dir="${maven.test.reports}" />
+		<junit printSummary="yes"
+		       haltonerror="true"
+		       haltonfailure="true"
+		       fork="true"
+		       dir=".">
+			<sysproperty key="basedir" value="." />
+			<formatter type="xml" />
+			<formatter type="plain" usefile="false" />
+			<classpath>
+				<path refid="build.test.classpath" />
+				<pathelement location="${maven.build.outputDir}" />
+				<pathelement location="${maven.build.testOutputDir}" />
+			</classpath>
+			<batchtest todir="${maven.test.reports}" unless="test">
+				<fileset dir="${maven.build.testDir.0}">
+					<include name="**/Test*.java" />
+					<include name="**/*Test.java" />
+					<include name="**/*TestCase.java" />
+					<exclude name="**/*Abstract*Test.java" />
+				</fileset>
+			</batchtest>
+			<batchtest todir="${maven.test.reports}" if="test">
+				<fileset dir="${maven.build.testDir.0}">
+					<include name="**/${test}.java" />
+					<exclude name="**/*Abstract*Test.java" />
+				</fileset>
+			</batchtest>
+		</junit>
+	</target>
+
+	<target name="test-junit-present">
+		<available classname="org.junit.Test" property="junit.present" />
+	</target>
+
+	<target name="test-junit-status" depends="test-junit-present">
+		<condition property="junit.missing">
+			<and>
+				<isfalse value="${junit.present}" />
+				<isfalse value="${maven.test.skip}" />
+			</and>
+		</condition>
+		<condition property="junit.skipped">
+			<or>
+				<isfalse value="${junit.present}" />
+				<istrue value="${maven.test.skip}" />
+			</or>
+		</condition>
+	</target>
+
+	<target name="junit-missing" depends="test-junit-status" if="junit.missing">
+		<echo>=================================== WARNING ===================================</echo>
+		<echo> JUnit is not present in your $ANT_HOME/lib directory. Tests not executed.</echo>
+		<echo>===============================================================================</echo>
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Javadoc target                                                         -->
+	<!-- ====================================================================== -->
+
+	<target name="javadoc"
+	        description="Generates the Javadoc of the application">
+		<javadoc sourcepath="${maven.build.srcDir.0}"
+		         packagenames="*"
+		         destdir="${maven.reporting.outputDirectory}/apidocs"
+		         access="protected"
+		         old="false"
+		         verbose="false"
+		         version="true"
+		         use="true"
+		         author="true"
+		         splitindex="false"
+		         nodeprecated="false"
+		         nodeprecatedlist="false"
+		         notree="false"
+		         noindex="false"
+		         nohelp="false"
+		         nonavbar="false"
+		         serialwarn="false"
+		         charset="ISO-8859-1"
+		         linksource="false"
+		         breakiterator="false" />
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Package target                                                         -->
+	<!-- ====================================================================== -->
+
+	<target name="package"
+	        depends="compile,test"
+	        description="Package the application">
+		<jar jarfile="${maven.build.dir}/${maven.build.finalName}.jar"
+		     compress="true"
+		     index="false"
+		     basedir="${maven.build.outputDir}"
+		     excludes="**/package.html" />
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- A dummy target for the package named after the type it creates         -->
+	<!-- ====================================================================== -->
+
+	<target name="jar"
+	        depends="package"
+	        description="Builds the jar for the application" />
+
+	<!-- ====================================================================== -->
+	<!-- Download dependencies target                                           -->
+	<!-- ====================================================================== -->
+
+	<target name="test-offline">
+		<condition property="maven.mode.offline">
+			<equals arg1="${maven.settings.offline}" arg2="true" />
+		</condition>
+	</target>
+
+	<target name="get-deps"
+	        depends="test-offline"
+	        description="Download all dependencies"
+	        unless="maven.mode.offline">
+		<mkdir dir="${maven.repo.local}" />
+		<mkdir dir="${maven.repo.local}/junit/junit/4.5" />
+		<get src="http://repo1.maven.org/maven2/junit/junit/4.5/junit-4.5.jar"
+		     dest="${maven.repo.local}/junit/junit/4.5/junit-4.5.jar"
+		     usetimestamp="false"
+		     ignoreerrors="true" />
+		<mkdir dir="${maven.repo.local}/commons-net/commons-net/1.4.1" />
+		<get src="http://repo1.maven.org/maven2/commons-net/commons-net/1.4.1/commons-net-1.4.1.jar"
+		     dest="${maven.repo.local}/commons-net/commons-net/1.4.1/commons-net-1.4.1.jar"
+		     usetimestamp="false"
+		     ignoreerrors="true" />
+		<mkdir dir="${maven.repo.local}/oro/oro/2.0.8" />
+		<get src="http://repo1.maven.org/maven2/oro/oro/2.0.8/oro-2.0.8.jar"
+		     dest="${maven.repo.local}/oro/oro/2.0.8/oro-2.0.8.jar"
+		     usetimestamp="false"
+		     ignoreerrors="true" />
+		<mkdir dir="${maven.repo.local}/com/sun/runtime/java-plugin/1.5.0" />
+		<!-- get src="http://repo1.maven.org/maven2/com/sun/runtime/java-plugin/1.5.0/java-plugin-1.5.0.jar"
+		     dest="${maven.repo.local}/com/sun/runtime/java-plugin/1.5.0/java-plugin-1.5.0.jar"
+		     usetimestamp="false"
+		     ignoreerrors="true" / -->
+		<mkdir dir="${maven.repo.local}/log4j/log4j/1.2.13" />
+		<get src="http://repo1.maven.org/maven2/log4j/log4j/1.2.13/log4j-1.2.13.jar"
+		     dest="${maven.repo.local}/log4j/log4j/1.2.13/log4j-1.2.13.jar"
+		     usetimestamp="false"
+		     ignoreerrors="true" />
+	</target>
+
+</project>
Index: 3thparty/jupload/.project
===================================================================
--- 3thparty/jupload/.project	(revision 3951)
+++ 3thparty/jupload/.project	(revision 3951)
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>jupload</name>
+	<comment></comment>
+	<projects>
+	</projects>
+	<buildSpec>
+		<buildCommand>
+			<name>org.eclipse.jdt.core.javabuilder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+		<buildCommand>
+			<name>org.maven.ide.eclipse.maven2Builder</name>
+			<arguments>
+			</arguments>
+		</buildCommand>
+	</buildSpec>
+	<natures>
+		<nature>org.maven.ide.eclipse.maven2Nature</nature>
+		<nature>org.eclipse.jdt.core.javanature</nature>
+	</natures>
+</projectDescription>
Index: 3thparty/jupload/target/classes/lang/lang_pt.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_pt.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_pt.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Portugese
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_da.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_da.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_da.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Danish
+contributor = Jeppe Bundsgaard
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = danish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = S\u00f8g ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter mod uret
+buttonRotateRight = Roter med uret
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Uploader filer %1$s
+infoUploaded = Filen/filerne %1$s er uploadet. Venter p\u00e5 serversvar ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d filer uploadet
+errDuringUpload = Upload stoppede med fejl
+errHttpResponse = Serverens HTTP-svar m\u00f8der ikke succeskriterierne. Uploaden fejlede.
+questionSendMailOnError = En fejl opstod under upload. Vil du sende al relevant information til webmasteren?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Mappe
+colModified = \u00c6ndret
+colReadable = L\u00e6sbar?
+errForbiddenExtension = Ulovlig fil endelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = En fejl opstod under log-h\u00e5ndteringen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6lg venligst et album f\u00f8rst.
+coppermineUploadOk = Billederne er blevet lagt op p\u00e5 serveren i det valgte album.\n\nKlik p\u00e5 Ok nu for at associere navne og kommentarer til disse billeder.\n\nGlem ikke at klikke p\u00e5 \u2018Udf\u00f8r \u00e6ndringer\u2019-knappen for at gemme dine \u00e6ndringer p\u00e5 serveren!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Billedet '%1$s' er for stort. Det bliver uploadet u\u00e6ndret (ingen rotation, st\u00f8rrelses\u00e6ndring...).
+notAPicture = Filen med navnet '%1$s' er ikke et billede. Det er ikke tilf\u00f8jet til listen af filer der skal uploades.
+
+#PictureDialog
+buttonClose = Luk
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_tr.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_tr.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_tr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Turkish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = turkish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = G\u00f6zat...
+buttonRemoveSelected = Se\u00e7ileni \u00c7\u0131kar
+buttonRemoveAll = Hepsini \u00c7\u0131kar
+buttonRotateLeft = Sola \u00c7evir
+buttonRotateRight = Sa\u011fa \u00c7evir
+buttonUpload = G\u00f6nder
+buttonStop = DURDUR
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d Dosya Haz\u0131rlan\u0131yor
+infoUploading = Dosyalar g\u00f6nderiliyor %1$s
+infoUploaded = %1$s Dosya g\u00f6nderildi. Sunucudan yan\u0131t bekleniyor
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+#MISSING  nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = G\u00f6nderim hata verip sona erdi.
+errHttpResponse = Sunucu HTTP cevab\u0131 kriterlere uymad\u0131. G\u00f6nderim ba\u015far\u0131s\u0131z.
+questionSendMailOnError = G\u00f6nderim s\u0131ras\u0131nda hatayla kar\u015f\u0131la\u015f\u0131ld\u0131. Bu durumla ilgili bilgileri webmaster\u2019a g\u00f6ndermek istermisiniz?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ad
+colSize = Boyut
+colDirectory = Dizin
+colModified = De\u011fi\u015ftirilme
+colReadable = Okunabilir mi?
+errForbiddenExtension = Yasak olan uzant\u0131.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0130\u015flem kay\u0131t y\u00f6netiminde bir sorun olu\u015ftu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = L\u00fctfen \u00f6nce bir alb\u00fcm se\u00e7iniz.
+coppermineUploadOk = Resimler sunucuda se\u00e7ili alb\u00fcme ba\u015far\u0131yla g\u00f6nderildi. \n\n Yapaca\u011f\u0131n\u0131z de\u011fi\u015fiklikleri kaydetmek i\u00e7in \u2018De\u011fi\u015fiklikleri Kaydet\u2019e t\u0131klamay\u0131 unutmay\u0131n\u0131z!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = '%1$s' adl\u0131 g\u00f6r\u00fcnt\u00fc dosyas\u0131 \u00e7ok b\u00fcy\u00fck. Herhangi bir de\u011fi\u015fiklik yapmadan (d\u00f6nd\u00fcrme, boyut de\u011fi\u015ftirme vb.) g\u00f6nderilecek.
+notAPicture = '%1$s' adl\u0131 dosya bir g\u00f6r\u00fcnt\u00fc dosyas\u0131 de\u011fildir. Bu dosya, g\u00f6nderilecek dosyalar listesine eklenmedi.
+
+#PictureDialog
+buttonClose = Kapat
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_ar_SA.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_ar_SA.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_ar_SA.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/target/classes/lang/lang_ru.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_ru.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_ru.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Russian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = russian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041e\u0431\u0437\u043e\u0440 ...
+buttonRemoveSelected = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+buttonRemoveAll = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435
+buttonRotateLeft = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043b\u0435\u0432\u043e
+buttonRotateRight = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e
+buttonUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+buttonStop = \u0421\u0422\u041e\u041f
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 %1$s
+infoUploaded = \u0424\u0430\u0439\u043b(\u044b) %1$s \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d(\u044b). \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: %1$d
+errDuringUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438
+errHttpResponse = \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c.
+questionSendMailOnError = \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432\u0435\u0431\u043c\u0430\u0441\u0442\u0435\u0440\u0443?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u044f
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u0418\u0437\u043c\u0435\u043d\u0435\u043d
+colReadable = \u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d?
+errForbiddenExtension = \u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u043b\u044c\u0431\u043e\u043c.
+coppermineUploadOk = \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u044c\u0431\u043e\u043c.\n\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ok, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u044d\u0442\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c.\n\n\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f' \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0430. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432...).
+notAPicture = \u0424\u0430\u0439\u043b '%1$s' \u043d\u0435 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430. \u041e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u043a\u0440\u044b\u0442\u044c
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_sv.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_sv.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_sv.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Swedish
+contributor = Erik Lindahl erik@fisensmosse.se
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = swedish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bl\u00e4ddra...
+buttonRemoveSelected = Ta bort markerad
+buttonRemoveAll = Ta bort alla
+buttonRotateLeft = Rotera v\u00e4nster
+buttonRotateRight = Rotera h\u00f6ger
+buttonUpload = Ladda upp
+buttonStop = STOPPA
+messageLogWindowCopiedToClipboard = Ett avlusningsmeddelande har kopierats till urklipp.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. och %3$d sek.
+timefmt_ms = %1$d min. och %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ok\u00e4nd
+status_msg = %1$d%% klart, \u00f6verf\u00f6ringshastighet: %2$s, ETA: %3$s
+menuitem_paste = Klistra in
+
+#JUploadExceptionTooBigFile
+errFileTooBig = '%1$s' \u00e4r f\u00f6r stor (%2$s)
+
+#FileUploadThread
+preparingFile = F\u00f6rbereder fil %1$d/%2$d
+infoUploading = Laddar upp filer %1$s
+infoUploaded = %1$s fil(er) uppladdade. V\u00e4ntar p\u00e5 att servern ska svara...
+infoAborted = Avbr\u00f6ts efter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) uppladdade
+errDuringUpload = Stannade med fel.
+errHttpResponse = Uppladdningen misslyckades: ov\u00e4ntat HTTP-svar
+questionSendMailOnError = Ett fel uppstod. Vill du s\u00e4nda ett mejl med felet till ansvarig?
+
+#DialogUploadRetry
+dialogUploadRetryText = Ett fel uppstod under uppladdningen av filerna till servern. Vill du f\u00f6rs\u00f6ka igen?\n\nUppladdningen kommer att \u00e5terstarta automatiskt om %1$d  sekunder.
+dialogUploadRetryTitle = F\u00f6rs\u00f6ka att ladda upp igen?
+buttonDetails = Detaljer
+buttonYes = Ja
+buttonNo = Nej
+
+#FileUploadManagerThread
+errorDuringUpload = F\u00f6ljande fel uppstod under uppladdningen:\n%1$s\n\nVill du forts\u00e4tta med aktuell uppladdning?
+
+#FilePanelDataModel
+colName = Namn
+colSize = Storlek
+colDirectory = Mapp
+colModified = Senast \u00e4ndrad
+colReadable = L\u00e4sbar?
+errForbiddenExtension = Ogiltig filnamns\u00e4ndelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ett fel uppstod med logghanteringen.
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e4lj ett album f\u00f6rst.
+coppermineUploadOk = Bilden har blivit \u00f6verf\u00f6rd och sparad i \n\nKlicka p\u00e5 OK f\u00f6r att namnge och kommentera bilderna.\n\nGl\u00f6m inte att verkst\u00e4lla namn\u00e4ndringar f\u00f6r att de ska sparas p\u00e5 servern.
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Dra mappar och filer hit
+
+#PictureFileData
+tooBigPicture = Bilden '%1$s' \u00e4r f\u00f6r stor. Den kommer att laddas upp of\u00f6r\u00e4ndrad (rotation, storlek...).
+notAPicture = Filen '%1$s' \u00e4r ingen bild. Den kommer inte att laddas upp.
+
+#PictureDialog
+buttonClose = St\u00e4ng
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Godk\u00e4nn
+
+#InteractiveTrustManager
+itm_title_pass = Ange %1$s l\u00f6senord
+itm_prompt_pass = %1$s l\u00f6senord:
+itm_cert_alert = Varning g\u00e4llande SSL-certifikat
+itm_cert_details = Certifikatdetaljer:
+itm_cert_subject = \u00c4mne:
+itm_cert_issuer = Utf\u00e4rdat av:
+itm_cert_nbefore = Inte f\u00f6re:
+itm_cert_nafter = Inte efter:
+itm_cert_serial = Serienummer:
+itm_cert_fprint = %1$s fingeravtryck:
+itm_cert_C = Land:
+itm_cert_CN = Gemensamt namn:
+itm_cert_L = Plats:
+itm_cert_ST = Region:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisationsnummer:
+itm_reasons = Anledning:
+itm_reason_cnmatch = Certifikatet matchar inte servern (%1$s).
+itm_reason_itrust = Certifikatutf\u00e4rdaren \u00e4r inte trov\u00e4rdig.
+itm_reason_expired = Certifikatet har g\u00e5tt ut.
+itm_reason_notyet = Certifikatet \u00e4r inte giltigt.
+itm_fail_verify = Certifikatet fr\u00e5n servern kunde inte verifieras.
+itm_accept_prompt = Vill du acceptera certifikatet?
+itm_accept_always = Alltid
+itm_accept_now = Bara f\u00f6r den h\u00e4r sessionen
+itm_accept_no = Nej
+itm_new_tstore = Ny TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_bg.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_bg.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_bg.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Bulgarian
+contributor = \u0418\u043b\u0438\u0430\u043d \u0425\u0440\u0438\u0441\u0442\u043e\u0434\u043e\u0440\u043e\u0432 (zulix@zulix.net)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = bulgarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041f\u0440\u0435\u0433\u043b\u0435\u0434 ...
+buttonRemoveSelected = \u0418\u0437\u0442\u0440\u0438\u0439 \u0438\u0437\u0431\u0440\u0430\u043d\u043e\u0442\u043e
+buttonRemoveAll = \u0418\u0437\u0440\u0438\u0439 \u0432\u0441\u0438\u0447\u043a\u043e
+buttonRotateLeft = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u043b\u044f\u0432\u043e
+buttonRotateRight = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u0434\u044f\u0441\u043d\u043e
+buttonUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435
+buttonStop = \u0421\u0422\u041e\u041f
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u0413\u0431/\u0441
+speedunit_mb_per_second = \u041c\u0431/\u0441
+speedunit_kb_per_second = \u041a\u0431/\u0441
+speedunit_b_per_second = \u0431/\u0441
+timefmt_hms = %1$d\u0447, %2$d \u043c\u0438\u043d. \u0438 %3$d \u0441\u0435\u043a.
+timefmt_ms = %1$d \u043c\u0438\u043d. \u0438 %2$d \u0441\u0435\u043a.
+timefmt_s = %1$d \u0441\u0435\u043a\u0443\u043d\u0434\u0438
+timefmt_unknown = \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e
+status_msg = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e %1$d%% \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438, \u0422\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u0441\u0442\u0430\u0442\u0443\u0441: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0413\u043e\u043b\u0435\u043c\u0438\u043d\u0430\u0442\u0430 \u043d\u0430 \u0445\u0430\u0439\u043b\u0430 '%1$s' \u0435 \u043c\u043d\u043e\u0433\u043e \u0433\u043e\u043b\u044f\u043c\u0430 (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u041a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u0435 %1$s
+infoUploaded = %1$s \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0432\u0430\u043d\u0435. \u0427\u0430\u043a\u0430\u043d\u0435 \u043e\u0442\u0433\u043e\u0432\u043e\u0440 \u043e\u0442 \u0441\u044a\u0440\u0432\u0430\u0440\u0430 ...
+infoAborted = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0435\u043d\u043e \u0441\u043b\u0435\u0434 %1$d \u0424\u0430\u0439\u043b(\u0430).
+nbUploadedFiles = %1$d \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0435\u043d\u0438
+errDuringUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u0441\u043f\u0440\u044f \u0437\u0430\u0440\u0430\u0434\u0438 \u0433\u0440\u0435\u0448\u043a\u0438
+errHttpResponse = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u043e\u043f\u0430\u0434\u043d\u0430: \u043d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0438 HTTP \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u0438
+questionSendMailOnError = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u043a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u0438\u0442\u0435 \u0446\u044f\u043b\u0430\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0443\u0435\u0431\u043c\u0430\u0441\u0442\u044a\u0440\u0430?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u0435
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u041f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u043e
+colReadable = \u0427\u0435\u0442\u043b\u0438\u0432\u043e?
+errForbiddenExtension = \u0417\u0430\u0431\u0440\u0430\u043d\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438\u0435.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041c\u043e\u043b\u044f, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0430\u043b\u0431\u0443\u043c.
+coppermineUploadOk = \u0421\u043d\u0438\u043c\u043a\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u0440\u0435\u0434\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430, \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f \u0430\u043b\u0431\u0443\u043c. .\n\n\u041a\u043b\u0438\u043a\u043d\u0435\u0442\u0430 \u043d\u0430 Ok \u0441\u0435\u0433\u0430 \u0437\u0430 \u0434\u0430 \u0441\u0435 \u0430\u0441\u043e\u0446\u0438\u0438\u0440\u0430\u0442 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u0438 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0437\u0438 \u0441\u043d\u0438\u043c\u043a\u0438.\n\n\u041d\u0435 \u0437\u0430\u0431\u0440\u0430\u0432\u044f\u0439\u0442\u0435 \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443'Apply modification button' , \u0437\u0430 \u0434\u0430 \u0437\u0430\u043f\u0430\u0437\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0421\u043d\u0438\u043c\u043a\u0430\u0442\u0430 '%1$s' \u0435 \u043f\u0440\u0435\u043a\u0430\u043b\u0435\u043d\u043e \u0433\u043e\u043b\u044f\u043c\u0430. \u0422\u0447 \u0449\u0435 \u0431\u044a\u0434\u0435 \u043a\u0430\u0447\u0435\u043d\u0430 \u043d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u0430 (\u043d\u044f\u043c\u0430 \u0432\u044a\u0440\u0442\u0435\u043d\u0435, \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 ...).
+notAPicture = \u0418\u043c\u0435\u0442\u043e\u043d\u0430 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u043d\u0435 \u0435 \u0441\u043d\u0438\u043c\u043a\u0430. \u0422\u043e\u0432\u0430 \u043d\u0435 \u0435 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\u043e \u043a\u044a\u043c \u0441\u043f\u0438\u0441\u044a\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u0435.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u0442\u0432\u043e\u0440\u0438
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438
+
+#InteractiveTrustManager
+itm_title_pass = \u041d\u0430\u043f\u0438\u0448\u0438 %1$s \u043f\u0430\u0440\u043e\u043b\u0430
+itm_prompt_pass = %1$s \u043f\u0430\u0440\u043e\u043b\u0430:
+itm_cert_alert = SSL \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435
+itm_cert_details = \u0414\u0435\u0442\u0430\u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430:
+itm_cert_subject = \u0422\u0435\u043c\u0430:
+itm_cert_issuer = \u0415\u043c\u0438\u0442\u0435\u043d\u0442:
+itm_cert_nbefore = \u041d\u0435, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430:
+itm_cert_nafter = \u041d\u0435 \u0441\u043b\u0435\u0434:
+itm_cert_serial = \u0421\u0435\u0440\u0438\u0435\u043d:
+itm_cert_fprint = %1$s \u041e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u043a:
+itm_cert_C = \u0414\u044a\u0440\u0436\u0430\u0432\u0430:
+itm_cert_CN = \u041e\u0431\u0449\u043e\u043f\u0440\u0438\u0435\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435:
+itm_cert_L = \u041c\u0435\u0441\u0442\u043d\u043e\u0441\u0442:
+itm_cert_ST = \u0429\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0438\u043d\u0446\u0438\u044f:
+itm_cert_O = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f:
+itm_cert_OU = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u043e \u0437\u0432\u0435\u043d\u043e:
+itm_reasons = \u041f\u0440\u0438\u0447\u0438\u043d\u0430(\u0438):
+itm_reason_cnmatch = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u043e\u0431\u0449\u043e\u0442\u043e \u0438\u043c\u0435 \u043d\u0435 \u0441\u044a\u0432\u043f\u0430\u0434\u0430 \u0441 \u0438\u043c\u0435\u0442\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0430 (%1$s).
+itm_reason_itrust = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u0435\u043d.
+itm_reason_expired = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0435 \u0441 \u0438\u0437\u0442\u0435\u043a\u044a\u043b \u0441\u0440\u043e\u043a.
+itm_reason_notyet = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0432\u0441\u0435 \u043e\u0449\u0435 \u043d\u0435 \u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d.
+itm_fail_verify = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 \u0441\u044a\u0440\u0432\u044a\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d.
+itm_accept_prompt = \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043f\u0440\u0438\u0435\u043c\u0435\u0442\u0435 \u0442\u043e\u0437\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442?
+itm_accept_always = \u0412\u0438\u043d\u0430\u0433\u0438
+itm_accept_now = \u0421\u0430\u043c\u043e \u0437\u0430 \u0442\u0430\u0437\u0438 \u0441\u0435\u0441\u0438\u044f
+itm_accept_no = \u041d\u0435
+itm_new_tstore = \u041d\u043e\u0432\u0430 TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_de.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_de.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_de.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = German
+contributor = Fritz Elfert <felfert@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = german
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Durchsuchen ...
+buttonRemoveSelected = Ausgew\u00e4hlte entfernen
+buttonRemoveAll = Alle entfernen
+buttonRotateLeft = Gegen den Uhrzeigersinn drehen
+buttonRotateRight = Im Uhrzeigersinn drehen
+buttonUpload = Hochladen
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d Std., %2$d Min. und %3$d Sec.
+timefmt_ms = %1$d Min. und %2$d Sek.
+timefmt_s = %1$d Sekunden
+timefmt_unknown = unbekannt
+status_msg = JUpload %1$d%% abgeschlossen, Transferrate: %2$s, Verbleibend: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Die Datei '%1$s' ist zu gro\u00df (%2$s)
+
+#FileUploadThread
+preparingFile = Datei vorbereiten:  %1$d/%2$d
+infoUploading = \u00dcbertrage Datei: %1$s
+infoUploaded = %1$s Datei(en) hochgeladen. Warte auf Server Antwort ...
+infoAborted = Upload nach %1$d Dateien(en) abgebrochen.
+nbUploadedFiles = %1$d Datei(en) hochgeladen
+errDuringUpload = Upload-Vorgang wegen eines Fehlers gestoppt
+errHttpResponse = Die HTTP Antwort erf\u00fcllt nicht die Kriterien. Vorgang fehlgeschlagen.
+questionSendMailOnError = Es ist ein Fehler aufgetreten. Soll das\nFehlerprotokoll an den Webmaster gesendet werden?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Gr\u00f6\u00dfe
+colDirectory = Verzeichnis
+colModified = Ge\u00e4ndert
+colReadable = Lesbar?
+errForbiddenExtension = Keine erlaubte Dateiendung.
+
+#DefaultUploadPolicy
+errDuringLogManagement = W\u00e4hrend des Log Managements ist ein Fehler aufgetreten
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bitte zuerst ein Album ausw\u00e4hlen.
+coppermineUploadOk = Die Dateien wurden erfolgreich in das ausgew\u00e4hlte Album hochgeladen. \n\nBitte auf OK klicken um zu den Dateien Name und Beschreibung hinzuzuf\u00fcgen.\n\nNach der Eingabe auf '\u00c4nderungen \u00dcbernehmen' klicken, um die Informationen zu speichern !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Das Bild '%1$s' ist zu gro\u00df und wird ohne \u00c4nderungen hochgeladen (ohne Drehung, Gr\u00f6\u00dfen\u00e4nderung...).
+notAPicture = Die Datei '%1$s' ist kein Bild. Sie wird nicht der Liste der hochzuladenden Dateien hinzugef\u00fcgt.
+
+#PictureDialog
+buttonClose = Schlie\u00dfen
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Best\u00e4tigen
+
+#InteractiveTrustManager
+itm_title_pass = %1$s Password eingeben
+itm_prompt_pass = %1$s Passwort:
+itm_cert_alert = SSL Zertificats-Warnung
+itm_cert_details = Zertifikats-Details:
+itm_cert_subject = Inhaber:
+itm_cert_issuer = Aussteller:
+itm_cert_nbefore = G\u00fcltig ab:
+itm_cert_nafter = G\u00fcltig bis:
+itm_cert_serial = Seriennr.:
+itm_cert_fprint = %1$s Fingerabdruck:
+itm_cert_C = Land:
+itm_cert_CN = Allgemeiner Name:
+itm_cert_L = Stadt:
+itm_cert_ST = Staat oder Provinz:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations-Abteilung:
+itm_reasons = Gr\u00fcnde:
+itm_reason_cnmatch = Der allgemaine Name passt nicht zum Hostnamen (%1$s).
+itm_reason_itrust = Dem Aussteller des Zertifikats wird nicht vertraut.
+itm_reason_expired = Das Zertifikat ist abgelaufen.
+itm_reason_notyet = Das Zertifikat ist noch nicht g\u00fcltig.
+itm_fail_verify = Das Zertifikat des Servers konnte nicht \u00fcberpr\u00fcft werden.
+itm_accept_prompt = Wollen Sie dieses Zertifikat annehmen?
+itm_accept_always = Immer
+itm_accept_now = Nur f\u00fcr diese Sitzung
+itm_accept_no = Nein
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_ja.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_ja.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_ja.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Japanese
+contributor = Takashi Yukawa: takashi_922 at yahoo dot co dot jp
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = japanese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f..
+buttonRemoveSelected = \u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664
+buttonRemoveAll = \u3059\u3079\u3066\u524a\u9664
+buttonRotateLeft = \u5de6\u3078\u56de\u8ee2
+buttonRotateRight = \u53f3\u3078\u56de\u8ee2
+buttonUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
+buttonStop = \u505c\u6b62
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d \u306e\u6e96\u5099\u4e2d
+infoUploading = %1$s \u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d
+infoUploaded = %1$s \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002\u30b5\u30fc\u30d0\u304b\u3089\u306e\u5fdc\u7b54\u3092\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u7d42\u4e86
+errDuringUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u30a8\u30e9\u30fc\u3067\u505c\u6b62\u3057\u307e\u3057\u305f\u3002
+errHttpResponse = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5931\u6557: \u4e0d\u6b63\u306a HTTP \u30ec\u30b9\u30dd\u30f3\u30b9
+questionSendMailOnError = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30a8\u30e9\u30fc\u60c5\u5831\u3092WEB\u7ba1\u7406\u8005\u3078\u9001\u4fe1\u3057\u307e\u3059\u304b?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u524d
+colSize = \u30b5\u30a4\u30ba
+colDirectory = \u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240
+colModified = \u66f4\u65b0\u65e5\u6642
+colReadable = \u8aad\u8fbc\u53ef?
+errForbiddenExtension = \u4f7f\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u3067\u3059\u3002
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u30ed\u30b0\u7ba1\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u6700\u521d\u306b\u30a2\u30eb\u30d0\u30e0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+coppermineUploadOk = \u9078\u629e\u3057\u305f\u30a2\u30eb\u30d0\u30e0\u306b\u3001\u753b\u50cf\u304c\u6b63\u3057\u304f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u3002\n\nOk \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u753b\u50cf\u306b\u540d\u524d\u3084\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n'Apply modification button' \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30b5\u30fc\u30d0\u306e\u60c5\u5831\u3082\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = '%1$s' \u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u3059\u304e\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306f\u5909\u66f4\u3055\u308c\u305a\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3059 (\u56de\u8ee2, \u30b5\u30a4\u30ba\u5909\u66f4\u306a\u3069\u306a\u3057)\u3002
+notAPicture = '%1$s' \u306f\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30ea\u30b9\u30c8\u306b\u306f\u8ffd\u52a0\u3055\u308c\u307e\u305b\u3093\u3002
+
+#PictureDialog
+buttonClose = \u9589\u3058\u308b
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_zh_TW.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_zh_TW.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_zh_TW.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/target/classes/lang/lang_he.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_he.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_he.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hebrew
+contributor = liorda@gmail.com
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hebrew
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u05e2\u05d9\u05d5\u05df...
+buttonRemoveSelected = \u05d4\u05e1\u05e8 \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05de\u05e1\u05d5\u05de\u05e0\u05d9\u05dd
+buttonRemoveAll = \u05d4\u05e1\u05e8 \u05d4\u05db\u05dc
+buttonRotateLeft = \u05e1\u05d5\u05d1\u05d1 \u05e9\u05de\u05d0\u05dc\u05d4
+buttonRotateRight = \u05e1\u05d5\u05d1\u05d1 \u05d9\u05de\u05d9\u05e0\u05d4
+buttonUpload = \u05d4\u05e2\u05dc\u05d4
+buttonStop = \u05e2\u05e6\u05d5\u05e8
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_mb_per_second = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_kb_per_second = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_b_per_second = \u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+timefmt_hms = %1$d\u05e9, %2$d \u05d3\u05e7\u05d5\u05ea \u05d5-  %3$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_ms = %1$d \u05d3\u05e7\u05d5\u05ea -\u05d5  %2$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_s = %1$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_unknown = \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2
+status_msg = JUpload %1$d%% \u05d4\u05d5\u05e9\u05dc\u05de\u05d5, \u05e7\u05e6\u05d1 \u05d4\u05e2\u05d1\u05e8\u05d4: %2$s, \u05e0\u05d5\u05ea\u05e8: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u05d2\u05d5\u05d3\u05dc \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d2\u05d3\u05d5\u05dc \u05de\u05d3\u05d9 (%2$s)
+
+#FileUploadThread
+preparingFile = \u05de\u05db\u05d9\u05df \u05e7\u05d5\u05d1\u05e5 %1$d/%2$d
+infoUploading = \u05de\u05e2\u05dc\u05d4 \u05e7\u05d1\u05e6\u05d9\u05dd %1$s
+infoUploaded = %1$s \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5. \u05de\u05de\u05ea\u05d9\u05df \u05dc\u05ea\u05d2\u05d5\u05d1\u05ea \u05d4\u05e9\u05e8\u05ea...
+infoAborted = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05dc\u05d0\u05d7\u05e8 %1$d \u05e7\u05d1\u05e6\u05d9\u05dd.
+nbUploadedFiles = %1$d \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5
+errDuringUpload = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05e2\u05dd \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea
+errHttpResponse = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4: \u05ea\u05d2\u05d5\u05d1\u05ea HTTP \u05dc\u05d0-\u05e6\u05e4\u05d5\u05d9\u05d4
+questionSendMailOnError = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05d4\u05d4\u05e2\u05dc\u05d0\u05d4. \u05d4\u05d0\u05dd \u05ea\u05e8\u05e6\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05db\u05dc \u05d4\u05de\u05d9\u05d3\u05e2 \u05d4\u05e8\u05dc\u05d5\u05d5\u05e0\u05d8\u05d9 \u05dc\u05de\u05e0\u05d4\u05dc \u05d4\u05d0\u05ea\u05e8?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u05e9\u05dd
+colSize = \u05d2\u05d5\u05d3\u05dc
+colDirectory = \u05e1\u05e4\u05e8\u05d9\u05d4
+colModified = \u05ea\u05d0\u05e8\u05d9\u05da \u05e9\u05d9\u05e0\u05d5\u05d9
+colReadable = \u05e0\u05d9\u05ea\u05df \u05dc\u05e7\u05e8\u05d9\u05d0\u05d4?
+errForbiddenExtension = \u05e1\u05d9\u05d5\u05de\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05e1\u05d5\u05e8\u05d4.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05e0\u05d9\u05d4\u05d5\u05dc \u05d4\u05d9\u05d5\u05de\u05df
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u05d0\u05e0\u05d0, \u05d1\u05d7\u05e8 \u05d0\u05dc\u05d1\u05d5\u05dd \u05ea\u05d7\u05d9\u05dc\u05d4.
+coppermineUploadOk = \u05d4\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d4\u05d5\u05e2\u05dc\u05d5 \u05dc\u05e9\u05e8\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4, \u05dc\u05d0\u05dc\u05d1\u05d5\u05dd \u05d4\u05e0\u05d1\u05d7\u05e8.\n\n\u05dc\u05d7\u05e5 \u05e2\u05dc OK \u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05d9\u05d9\u05da \u05e9\u05de\u05d5\u05ea \u05d5\u05d4\u05e2\u05e8\u05d5\u05ea \u05dc\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05d5.\n\n\u05d0\u05dc \u05ea\u05e9\u05db\u05d7 \u05dc\u05dc\u05d7\u05d5\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 '\u05d4\u05d7\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd' \u05db\u05d3\u05d9 \u05dc\u05e9\u05de\u05d5\u05e8 \u05d0\u05ea \u05d4\u05db\u05dc \u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05dc\u05e9\u05e8\u05ea!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 '%1$s' \u05d2\u05d3\u05d5\u05dc\u05d4 \u05de\u05d3\u05d9. \u05d4\u05d9\u05d0 \u05ea\u05d5\u05e2\u05dc\u05d4 \u05dc\u05dc\u05d0 \u05db\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9 (\u05e1\u05d9\u05d1\u05d5\u05d1, \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc...).
+notAPicture = \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d0\u05d9\u05e0\u05d5 \u05ea\u05de\u05d5\u05e0\u05d4. \u05d4\u05d5\u05d0 \u05dc\u05d0 \u05d9\u05ea\u05d5\u05d5\u05e1\u05e3 \u05dc\u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05dc\u05e9\u05dc\u05d9\u05d7\u05d4.
+
+#PictureDialog
+buttonClose = \u05e1\u05d2\u05d5\u05e8
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = \u05d1\u05d9\u05d8
+unitGigabytes = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8
+unitMegabytes = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8
+unitKilobytes = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8
+
+#sendDebugInformation
+Confirm = \u05d0\u05d9\u05e9\u05d5\u05e8
+
+#InteractiveTrustManager
+itm_title_pass = \u05d4\u05db\u05e0\u05e1 \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s
+itm_prompt_pass = \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05ea\u05e2\u05d5\u05d3\u05d4 \u05d6\u05d5?
+itm_accept_always = \u05ea\u05de\u05d9\u05d3
+itm_accept_now = \u05e8\u05e7 \u05e2\u05d1\u05d5\u05e8 \u05d4\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea
+itm_accept_no = \u05dc\u05d0
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_ar.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_ar.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_ar.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/target/classes/lang/lang_en.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_en.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_en.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = English
+contributor = No maintainer (same content as lang.properties)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_eo.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_eo.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_eo.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Esperanto
+contributor = Chuck Smith
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = esperanto
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Foliumi ...
+buttonRemoveSelected = Forigu Elektita(j)
+buttonRemoveAll = Forigu \u0109iujn
+buttonRotateLeft = Turnigu maldekstren
+buttonRotateRight = Turnigu dekstren
+buttonUpload = Al\u015duti
+buttonStop = HALTI
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. kaj %3$d sek.
+timefmt_ms = %1$d min. kaj %2$d sek.
+timefmt_s = %1$d sekundoj
+timefmt_unknown = nekonata
+status_msg = JUpload %1$d%% finita, transferrapideco: %2$s, restas: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparante dosierojn %1$d/%2$d
+infoUploading = Al\u015dutante dosierojn %1$s
+infoUploaded = Dosiero(j) %1$s al\u015dutita(j). Atendante servilan respondon ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d dosieroj al\u015dutitaj
+errDuringUpload = Al\u015dutado haltita pro eraroj
+errHttpResponse = La HTTP-respondo de la servilo ne ta\u016dgas. La al\u015duto malsukcesis.
+questionSendMailOnError = Eraro okazis al\u015dutante.  \u0109u vi volas sendi \u0109iujn rilatajn informojn al la retestro?
+
+#DialogUploadRetry
+dialogUploadRetryText = Eraro okazis dum al\u015duto de la dosieroj al la servilo. \u0108u vi volas reprovi al\u015duti la dosierojn?\n\nLa al\u015duto a\u016dtomate rekomencos post %1$d sekundoj.
+dialogUploadRetryTitle = Reprovi la al\u015duton?
+buttonDetails = Detaloj
+buttonYes = Jes
+buttonNo = Ne
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nomo
+colSize = Grandeco
+colDirectory = Dosierujo
+colModified = \u015can\u011dita
+colReadable = Legebla?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Eraro okazis dum log-administrado
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bonvolu unue elekti fotoalbumon.
+coppermineUploadOk = La fotoj bone al\u015duti\u011dis al la servilo en la elektita fotoalbumo.\n\nKlaku sur Bone nun por asociigi nomojn kaj komentojn al tiujn fotojn.\n\nNe forgesu klaki sur la 'Butono de Aktivigu \u015dan\u011don' por konservi viajn \u015dan\u011dojn al la servilo!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Bildo '%1$s' tro grandas. \u011di al\u015duti\u011dos ne\u015dan\u011dite (sen turno, \u015dan\u011deco de grandeco ktp).
+notAPicture = La dosiero nomata '%1$s' ne estas bildo. \u011di ne aldoni\u011das al la al\u015dutota dosieraro.
+
+#PictureDialog
+buttonClose = Fermi
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Konfirmi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_cs.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_cs.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_cs.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Czech
+contributor = Vladan Zajda
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = czech
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Proch\u00e1zet ...
+buttonRemoveSelected = Odstranit ozna\u010den\u00e9
+buttonRemoveAll = Odstranit v\u0161e
+buttonRotateLeft = Oto\u010dit vlevo
+buttonRotateRight = Oto\u010dit vpravo
+buttonUpload = P\u0159en\u00e9st
+buttonStop = UKON\u010cIT
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Soubor %1$s je p\u0159\u00edli\u0161 velik\u00fd (%2 byt\u016f)
+
+#FileUploadThread
+preparingFile = P\u0159ipravuji soubor %1$d/%2$d
+infoUploading = P\u0159en\u00e1\u0161\u00edm soubory %1$s
+infoUploaded = %1$s soubor(\u016f) p\u0159eneseno. \u010cek\u00e1m na odpov\u011b\u010f serveru ...
+infoAborted = P\u0159enos byl p\u0159eru\u0161en po %1$d souborech.
+nbUploadedFiles = %1$d soubor(\u016f) p\u0159eneseno
+errDuringUpload = P\u0159enos byl ukon\u010den s chybami
+errHttpResponse = P\u0159enos byl ukon\u010den: neo\u010dek\u00e1van\u00e1 odpov\u011b\u010f HTTP
+questionSendMailOnError = Nastala chyba p\u0159i p\u0159enosu. P\u0159ejete si odeslat detailn\u00ed informace spr\u00e1vci serveru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zev
+colSize = Velikost
+colDirectory = Adres\u00e1\u0159
+colModified = Modifikov\u00e1no
+colReadable = \u010citeln\u00fd?
+errForbiddenExtension = Zak\u00a0zan\u00a0 souborov\u00a0 pr\u00a1pona.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Nastala chyba p\u0159i zpracov\u00e1n\u00ed logu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Nejprve pros\u00edm vyberte album.
+coppermineUploadOk = Obr\u00e1zky byly \u00fasp\u011b\u0161n\u011b p\u0159eneseny do vybran\u00e9ho alba na serveru.\n\nNyn\u00ed klikn\u011bte OK abyste mohli p\u0159i\u0159adit n\u00e1zvy a koment\u00e1\u0159e k obr\u00e1zk\u016fm.\n\nNezapome\u0148te kliknout na tla\u010d\u00edtko 'Ulo\u017eit \u00fapravy', aby do\u0161lo k ulo\u017een\u00ed \u00faprav na serveru !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zek '%1$s' je p\u0159\u00edli\u0161 velk\u00fd. Bude p\u0159enesen neupraven\u00fd (bez oto\u010den\u00ed, zm\u011bny velikosti...).
+notAPicture = Soubor s n\u00e1zvem '%1$s' nen\u00ed obr\u00e1zek. Nebyl tedy vlo\u017een do seznamu soubor\u016f k p\u0159enesen\u00ed.
+
+#PictureDialog
+buttonClose = Zav\u0159\u00edt
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdit
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_pt_BR.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_pt_BR.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_pt_BR.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Brasilian (Protugese)
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = brazilian_portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_fr.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_fr.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_fr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = French
+contributor = Etienne <etienne_sf@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = french
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Parcourir...
+buttonRemoveSelected = Suppr s\u00e9lectionn\u00e9s
+buttonRemoveAll = Suppr tous
+buttonRotateLeft = Tourner gauche
+buttonRotateRight = Tourner droite
+buttonUpload = Envoyer
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Les messages de debug ont \u00e9t\u00e9 copi\u00e9s dans le presse-papier.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Go/s
+speedunit_mb_per_second = Mo/s
+speedunit_kb_per_second = Ko/s
+speedunit_b_per_second = o/s
+timefmt_hms = %1$d h., %2$d min. et %3$d sec.
+timefmt_ms = %1$d min. et %2$d sec.
+timefmt_s = %1$d secondes
+timefmt_unknown = inconnu
+status_msg = JUpload %1$d%% effectu\u00e9, debit: %2$s, dur\u00e9e restante: %3$s
+menuitem_paste = Coller
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Le fichier '%1$s' est trop gros (%2$s)
+
+#FileUploadThread
+preparingFile = Pr\u00e9paration du fichier %1$d/%2$d
+infoUploading = Upload du(des) fichier(s) %1$s en cours
+infoUploaded = Fichier(s) %1$s upload\u00e9. En attente de la r\u00e9ponse du serveur ...
+infoAborted = Upload interrompu apr\u00e8s %1$d fichier(s).
+nbUploadedFiles = %1$d fichier(s) upload\u00e9(s)
+errDuringUpload = Upload arr\u00eat\u00e9 avec erreur
+errHttpResponse = La r\u00e9ponse HTTP du serveur ne correspond pas aux crit\u00e8res de succ\u00e8s. L'upload a \u00e9chou\u00e9.
+questionSendMailOnError = Une erreur s'est produite durant l'upload. Voulez-vous envoyer un mail au webmaster, lui donnant toutes les informations disponibles ?
+
+#DialogUploadRetry
+dialogUploadRetryText = Une erreur s'est produite lors de l'envoi (upload) des fichiers vers le serveur. Voulez-vous r\u00e9ssayer l'upload de ces fichiers ?\n\nL'upload sera automatiquement r\u00e9-ex\u00e9cut\u00e9s dans %1$d secondes.
+dialogUploadRetryTitle = R\u00e9-essayer l'upload ?
+buttonDetails = D\u00e9tails
+buttonYes = Oui
+buttonNo = Non
+
+#FileUploadManagerThread
+errorDuringUpload = L'erreur suivante est survenue durant l'upload :\n%1$s\n\nVoulez-vous continuer cet upload vers le serveur ?
+
+#FilePanelDataModel
+colName = Nom
+colSize = Taille
+colDirectory = R\u00e9pertoire
+colModified = Modifi\u00e9 le
+colReadable = Lisible?
+errForbiddenExtension = Extention de fichier interdite
+
+#DefaultUploadPolicy
+errDuringLogManagement = Une erreur est survenue durant la gestion des logs
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Choisissez d'abord un album.
+coppermineUploadOk = Les images ont \u00e9t\u00e9 charg\u00e9es sur le serveur, dans l'album s\u00e9lectionn\u00e9.\n\nCliquez sur Ok pour aller mettre des noms et commentaires \u00e0 ces images.\n\nN'oubliez pas ensuite de cliquer sur le bouton 'Appliquer les modifications' pour envoyer vos commentaires sur le serveur!
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Glissez-d\u00e9posez des r\u00e9pertoires ou fichiers ici
+
+#PictureFileData
+tooBigPicture = L'image '%1$s' est trop grosse. Elle sera envoy\u00e9e sans modification (rotation...)
+notAPicture = Le fichier '%1$s' n'est pas une image. Il n'est pas ajout\u00e9 \u00e0 la liste des fichiers \u00e0 transf\u00e9rer.
+
+#PictureDialog
+buttonClose = Fermer
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = o
+unitGigabytes = Go
+unitMegabytes = Mo
+unitKilobytes = ko
+
+#sendDebugInformation
+Confirm = Confirmez
+
+#InteractiveTrustManager
+itm_title_pass = Entrez mot de passe pour %1$s
+itm_prompt_pass = Mot de passe pour %1$s:
+itm_cert_alert = Alerte pour le SSL Certificate
+itm_cert_details = D\u00e9tails du certificat:
+itm_cert_subject = Sujet:
+itm_cert_issuer = Emetteur:
+itm_cert_nbefore = Pas avant:
+itm_cert_nafter = Pas apr\u00e8s:
+itm_cert_serial = Num\u00e9ro de s\u00e9rie:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Pays:
+itm_cert_CN = Nom commun:
+itm_cert_L = Localit\u00e9:
+itm_cert_ST = Etat ou province:
+itm_cert_O = Organisation:
+itm_cert_OU = Unit\u00e9 d'Organisation:
+itm_reasons = Raison(s):
+itm_reason_cnmatch = Le nom commun du certificate ne correspond pas au nom de domaine (%1$s).
+itm_reason_itrust = L'\u00e9metteur du Certificat n'est pas de confiance.
+itm_reason_expired = Le certificat aas expir\u00e9.
+itm_reason_notyet = Le certificate n'est pas encore valide.
+itm_fail_verify = Le certificat present\u00e9 par le serveur ne peut pas \u00eatre verifi\u00e9.
+itm_accept_prompt = Voulez-vous accepter ce certificat ?
+itm_accept_always = Toujours
+itm_accept_now = Uniquement pour cette session
+itm_accept_no = Non
+itm_new_tstore = Nouveau magasin
+itm_tstore = Magasin
Index: 3thparty/jupload/target/classes/lang/lang_es.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_es.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_es.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Spanish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = spanish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Examinar ...
+buttonRemoveSelected = Eliminar seleccionados
+buttonRemoveAll = Eliminar todos
+buttonRotateLeft = Girar izqda
+buttonRotateRight = Girar drcha
+buttonUpload = Subir
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando fichero %1$d/%2$d
+infoUploading = Subiendo ficheros %1$s
+infoUploaded = %1$s fichero(s) subidos. Esperando la respuesta del servidor...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d ficheros subidos
+errDuringUpload = La carga se detuvo con errores
+errHttpResponse = La respuesta del servidor HTTP no cumple los requisitos. La carga ha fallado.
+questionSendMailOnError = Ocurri\u00f3 un error durante la carga. \u00bfDesea enviar la informaci\u00f3n relevante al webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nombre
+colSize = Tama\u00f1o
+colDirectory = Carpeta
+colModified = Modificado
+colReadable = \u00bfLegible?
+errForbiddenExtension = Extensi\u00a2n de archivo prohibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ocurri\u00f3 un error durante la gesti\u00f3n del log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, seleccione antes un \u00e1lbum.
+coppermineUploadOk = Las im\u00e1genes han sido subidas correctamente al servidor y colocadas en el \u00e1lbum seleccionado.\n\nPulse sobre OK para a\u00f1adir nombres y comentarios a estas im\u00e1genes.\n\nNo olvide pulsar sobre el bot\u00f3n 'Aplicar cambios' para guardar los cambios en el servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = La imagen '%1$s' es demasiado grande. Ser\u00e1 subida sin cambios (rotaciones, cambio de tama\u00f1o...).
+notAPicture = El fichero denominado '%1$s' no es una imagen. No se a\u00f1adir\u00e1 a la lista de ficheros para subir.
+
+#PictureDialog
+buttonClose = Cerrar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_hr.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_hr.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_hr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Croatian
+contributor = Bruno Simic
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = croatian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Pretra\u017ei...
+buttonRemoveSelected = Obri\u0161i izbor
+buttonRemoveAll = Obri\u0161i sve
+buttonRotateLeft = Rotiraj lijevo
+buttonRotateRight = Rotiraj desno
+buttonUpload = Po\u0161alji
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Datoteka %1$s je prevelika (%2$s)
+
+#FileUploadThread
+preparingFile = Pripremam datoteku %1$d/%2$d
+infoUploading = \u0160aljem datoteku %1$s
+infoUploaded = Datoteka %1$s poslana. \u010cekam informacije sa servera ...
+infoAborted = Slanje prekinuto nakon %1$d. datoteke.
+nbUploadedFiles = %1$d datoteka poslano
+errDuringUpload = Slanje prekinuto sa gre\u0161kom
+errHttpResponse = Slanje neuspje\u0161no: nepoznati HTTP odgovor
+questionSendMailOnError = Gre\u0161ka priliko slanja datoteka. Da li do informacije o gre\u0161ki po\u0161aljem webmasteru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Veli\u010dina
+colDirectory = Direktorij
+colModified = Promjenjeno
+colReadable = \u010citljivo?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Gre\u0161ka u log zapisu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Molimo prvo izaberite album.
+coppermineUploadOk = Slike uspje\u0161no poslane na server u izabrani album.\n\nKliknite OK za pridru\u017eenje imena i komentara tim slikama.\n\nNe zaboravite potvrditi promjene klikom na 'Primijeni izmjene'. Samo nakon toga \u0107e promjene biti pohranjene na server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Datoteka '%1$s' je prevelika i biti \u0107e poslana nepromijenjena (bez rotacije, promjene veli\u010dine...).
+notAPicture = '%1$s' nije u grafi\u010dkom formatu i ne\u0107e biti dodana u listu za slanje.
+
+#PictureDialog
+buttonClose = Zatvori
+
+#DateRenderer
+dateformat = dd.MM.yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_nl.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_nl.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_nl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Dutch
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = dutch
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bladeren ...
+buttonRemoveSelected = Selectie verwijderen
+buttonRemoveAll = Alles verwijderen
+buttonRotateLeft = Roteer linksom
+buttonRotateRight = Roteer rechtsom
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Bestand klaarmaken %1$d/%2$d
+infoUploading = Bestanden uploaden %1$s
+infoUploaded = Bestand(en) %1$s geuploaded. Wachten op server ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d bestanden geuploaded
+errDuringUpload = Upload afgebroken met fouten
+errHttpResponse = Verkeerde HTTP reactie van de server. Upload mislukt.
+questionSendMailOnError = Er is een fout opgetreden tijdens de upload. Wilt u een mail met alle relevante informatie naar de webmaster versturen?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Naam
+colSize = Bestandsgrootte
+colDirectory = Map
+colModified = Gewijzigd
+colReadable = Leesbaar?
+errForbiddenExtension = Verboden bestandstype.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Er is een fout opgetreden tijdens logboek beheer
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Selecteer eerst een album.
+coppermineUploadOk = De afbeeldingen zijn succesvol geplaatst op de server, in het geslecteerde album. \n\nKlik OK om bestandsnamen en opmerkingen te koppelen aan deze afbeeldingen.\n\nVergeet niet om op de knop \u2018Wijzigingen toepassen\u2019 te drukken!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Afbeelding '%1$s' is te groot. Het zal ongewijzigd geupload worden (geen rotatie, formaatwijziging...).
+notAPicture = Bestand '%1$s' is geen afbeelding. Het bestand is niet toegevoegd aan de lijst van uploads.
+
+#PictureDialog
+buttonClose = Sluiten
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_pl.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_pl.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_pl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Polish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = polish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Przegl\u0105daj ...
+buttonRemoveSelected = Usu\u0144 zaznaczone
+buttonRemoveAll = Usu\u0144 wszystkie
+buttonRotateLeft = Obr\u00f3\u0107 w lewo
+buttonRotateRight = Obr\u00f3\u0107 w prawo
+buttonUpload = Prze\u015blij
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Uruchamianie transferu %1$d/%2$d
+infoUploading = Przesy\u0142anie plik\u00f3w %1$s
+infoUploaded = Plik(i) %1$s przes\u0142ane. Oczekiwanie na odpowied\u017a serwera ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d pliki przes\u0142ane
+errDuringUpload = Przesy\u0142anie przerwane z powodu b\u0142\u0119d\u00f3w
+errHttpResponse = Nie oczekiwana odpowied\u017a serwera HTTP. Przesy\u0142anie przerwane.
+questionSendMailOnError = W czasie przesy\u0142ania pojawi\u0142 si\u0119 b\u0142\u0105d. Czy chcesz przes\u0142a\u0107 do administratora informacje dotycz\u0105ce okoliczno\u015bci awarii?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nazwa
+colSize = Wielko\u015b\u0107
+colDirectory = Katalog
+colModified = Czas
+colReadable = Dost\u0119pny?
+errForbiddenExtension = Ulovlig filending.
+
+#DefaultUploadPolicy
+errDuringLogManagement = B\u0142\u0105d w czasie zarz\u0105dzania logiem
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosz\u0119 najpierw wybra\u0107 album..
+coppermineUploadOk = Zdj\u0119cia z wybranego albumu zosta\u0142y pomy\u015blnie przes\u0142ane na serwer. \n\nNaci\u015bnij przycisk Ok aby doda\u0107 nazwy i komentarze do tych zdj\u0119\u0107. \n\nNie zapomnij nacisn\u0105\u0107 przycisku 'Zapisz modyfikacj\u0119' aby zachowa\u0107 zmiany na serwerze !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Zdj\u0119cie '%1$s' jest za du\u017ce. Zostanie przes\u0142ane bez zmian (bez obracania, zmiany rozmiaru ...).
+notAPicture = Plik o nazwie '%1$s' nie jest zdj\u0119ciem. Nie zostanie dodany do listy plik\u00f3w do przes\u0142ania.
+
+#PictureDialog
+buttonClose = Zamknij
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_it.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_it.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_it.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Italian
+contributor = Manuele Grueff mgrueff@atipica.it
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = italian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Sfoglia...
+buttonRemoveSelected = Rimuovi selezionati
+buttonRemoveAll = Rimuovi tutto
+buttonRotateLeft = Ruota a sinistra
+buttonRotateRight = Ruota a destra
+buttonUpload = Carica
+buttonStop = FERMA
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d ore, %2$d min. e %3$d sec.
+timefmt_ms = %1$d min. e %2$d sec.
+timefmt_s = %1$d secondi
+timefmt_unknown = sconosciuto
+status_msg = JUpload %1$d%% eseguito, Velocit&#225;: %2$s, Tempo rimanente: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = La lunghezza del file '%1$s' &#232; eccessiva (%2$s)
+
+#FileUploadThread
+preparingFile = Preparazione file %1$d/%2$d
+infoUploading = Caricamento dei file %1$s
+infoUploaded = File %1$s pubblicato/i. In attesa della risposta del server ...
+infoAborted = Upload interrotto dopo %1$d file.
+nbUploadedFiles = %1$d file pubblicati
+errDuringUpload = Upload bloccato per errori
+errHttpResponse = La risposta del server HTTP ha segnalato un errore. L'upload &#232; fallito.
+questionSendMailOnError = Si &#232; verificato un errore durante l'upload. Vuoi segnalarlo al tuo webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Dimensioni
+colDirectory = Cartella
+colModified = Ultima modifica
+colReadable = Leggibile?
+errForbiddenExtension = Estensione file non consentita.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Si &#232; verificato un errore durante il log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Per favore scegli prima un album.
+coppermineUploadOk = Le immagini sono state caricate correttamente nel server, nell'album selezionato\n\nClicca su Ok per associare nomi e commenti alle immagini.\n\nNon dimenticare di cliccare sul bottone 'Apply modification' per salvare le tue modifiche sul server!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = L'immagine '%1$s' &#232; troppo grande. Sar&#225; caricato senza modifiche (rotazione, ridimensionamento...).
+notAPicture = Il file chiamato '%1$s' non &#232; un'immagine. Non &#232; stato aggiunto alla lista dei files caricati.
+
+#PictureDialog
+buttonClose = Chiudi
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = Gb
+unitMegabytes = Mb
+unitKilobytes = Kb
+
+#sendDebugInformation
+Confirm = Conferma
+
+#InteractiveTrustManager
+itm_title_pass = Inserisci %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = Avviso certificato SSL
+itm_cert_details = Dettagli del certificato:
+itm_cert_subject = Soggetto:
+itm_cert_issuer = Autorit\u00e0 che lo rilascia:
+itm_cert_nbefore = Valido a partire da:
+itm_cert_nafter = Valido fino a:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Nazione (C):
+itm_cert_CN = Common name (CN):
+itm_cert_L = Localit&#225; (L):
+itm_cert_ST = Stato o provincia (ST):
+itm_cert_O = Organizzazione (O):
+itm_cert_OU = Unit\u00e0 organizzazionale (OU):
+itm_reasons = Ragioni:
+itm_reason_cnmatch = Il common name del certificato non corrisponde allo hostname (%1$s).
+itm_reason_itrust = L'autorit\u00e0 che ha rilasciato il certificato non &#232; affidabile.
+itm_reason_expired = Il certificato &#232; scaduto.
+itm_reason_notyet = Il certificato non &#232; ancora valido.
+itm_fail_verify = Non &#232; stato possibile verificare Il certificato fornito dal server.
+itm_accept_prompt = Volete accettare questo certificato?
+itm_accept_always = Sempre
+itm_accept_now = Solo per questa sessione
+itm_accept_no = No
+itm_new_tstore = Nuovo TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_hu.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_hu.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_hu.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hungarian
+contributor = R\u00e9zs\u00f3 G\u00e1bor <gabor.rezso@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hungarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Tall\u00f3z ...
+buttonRemoveSelected = Kiv\u00e1lasztott elt\u00e1vol\u00edt\u00e1sa
+buttonRemoveAll = Mind elt\u00e1vol\u00edt\u00e1sa
+buttonRotateLeft = Forgat balra
+buttonRotateRight = Forgat Jobbra
+buttonUpload = Felt\u00f6lt
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d \u00f3ra, %2$d perc \u00e9s %3$d m\u00e1sodperc.
+timefmt_ms = %1$d perc \u00e9s %2$d m\u00e1sodperc.
+timefmt_s = %1$d m\u00e1sodperc
+timefmt_unknown = ismeretlen
+status_msg = JUpload %1$d%% k\u00e9sz, \u00c1tvitel: %2$s, H\u00e1tral\u00e9v\u0151 id\u0151: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = A '%1$s' m\u00e9ret\u0171 k\u00e9p nagyobb mint a megengedett (%2$s)
+
+#FileUploadThread
+preparingFile = El\u0151k\u00e9sz\u00edt\u00e9s %1$d/%2$d
+infoUploading = K\u00e9pek felt\u00f6lt\u00e9se %1$s
+infoUploaded = %1$s k\u00e9p felt\u00f6ltve. V\u00e1rakoz\u00e1s szerver v\u00e1laszra ...
+infoAborted = Felt\u00f6lt\u00e9s %1$d f\u00e1jl ut\u00e1n megszak\u00edtva.
+nbUploadedFiles = %1$d k\u00e9p felt\u00f6ltve
+errDuringUpload = A felt\u00f6lt\u00e9s hiba miatt le\u00e1llt
+errHttpResponse = A felt\u00f6lt\u00e9s sikertelen: v\u00e1ratlan HTTP hiba
+questionSendMailOnError = A felt\u00f6lt\u00e9s sor\u00e1n hiba t\u00f6rt\u00e9nt. Elk\u00fcldj\u00fck a hibajelent\u00e9st a webmesternek?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e9v
+colSize = M\u00e9ret
+colDirectory = K\u00f6nyvt\u00e1r
+colModified = M\u00f3dos\u00edtva
+colReadable = Olvashat\u00f3?
+errForbiddenExtension = Tiltott kiterjeszt\u00e9s.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Hiba t\u00f6rt\u00e9nt a napl\u00f3z\u00e1s k\u00f6zben
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = El\u0151sz\u00f6r v\u00e1lassz albumot.
+coppermineUploadOk = A k\u00e9pek felt\u00f6lt\u00e9se a megfelel\u0151 albumba sikeres volt.\n\nklikk az OK gombra a nevek be\u00e1ll\u00edt\u00e1s\u00e1hoz.\n\nNe felejts az alkalmaz gombra kattintani az adatok ment\u00e9s\u00e9hez !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = A '%1$s' k\u00e9p m\u00e9rete t\u00fal nagyi. Ez a k\u00e9p m\u00f3dos\u00edt\u00e1s n\u00e9lk\u00fcl ker\u00fcl felt\u00f6lt\u00e9sre(nincs forgat\u00e9s, \u00e1tm\u00e9retez\u00e9s).
+notAPicture = A '%1$s' f\u00e1jl nem k\u00e9p t\u00edpus\u00fa. \u00cdgy nem ker\u00fcl a felt\u00f6lt\u00e9sre v\u00e1r\u00f3 list\u00e1ba.
+
+#PictureDialog
+buttonClose = Bez\u00e1r
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Add meg %1$s jelsz\u00f3t
+itm_prompt_pass = %1$s jelsz\u00f3:
+itm_cert_alert = SSL Bizony\u00edtv\u00e1ny figyelmeztet\u00e9s
+itm_cert_details = Bizony\u00edtv\u00e1ny adatai:
+itm_cert_subject = T\u00e1rgy:
+itm_cert_issuer = Kibocs\u00e1t\u00f3:
+itm_cert_nbefore = Nem kor\u00e1bban:
+itm_cert_nafter = Nem k\u00e9s\u0151bb:
+itm_cert_serial = Sorozatsz\u00e1m:
+itm_cert_fprint = %1$s ujjlenyomat :
+itm_cert_C = Orsz\u00e1g:
+itm_cert_CN = N\u00e9v:
+itm_cert_L = Sz\u00e1rmaz\u00e1s:
+itm_cert_ST = Megye:
+itm_cert_O = Szervezet:
+itm_cert_OU = Szervezeti egys\u00e9g:
+itm_reasons = Ok:
+itm_reason_cnmatch = A bizony\u00edtv\u00e1ny neve nem egyezik a szerver c\u00edm\u00e9vel (%1$s).
+itm_reason_itrust = A bizony\u00edtv\u00e1ny kibocs\u00e1t\u00f3 nem megb\u00edzhat\u00f3.
+itm_reason_expired = A bizony\u00edtv\u00e1ny lej\u00e1rt.
+itm_reason_notyet = A bizony\u00edtv\u00e1ny m\u00e9g nem \u00e9rv\u00e9nyes.
+itm_fail_verify = A bizony\u00edtv\u00e1ny, nem ellen\u0151r\u00edzhet\u0151.
+itm_accept_prompt = Elfogadod a bizony\u00edtv\u00e1nyt?
+itm_accept_always = mindig
+itm_accept_now = csak a jelenlegi munkaf\u00e1zisban
+itm_accept_no = Nem
+itm_new_tstore = \u00daj BizalomT\u00e1r
+itm_tstore = BizalomT\u00e1r
Index: 3thparty/jupload/target/classes/lang/lang_no.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_no.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_no.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Norwegian
+contributor = Unkown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = norwegian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bla gjennom ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter venstre
+buttonRotateRight = Roter h\u00f8yre
+buttonUpload = Last opp
+buttonStop = STOPP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d tim., %2$d min. and %3$d sek.
+timefmt_ms = %1$d min. and %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ukjent
+status_msg = JUpload %1$d%% ferdig, overf\u00f8ringshastighet: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Filen '%1$s' er for stor (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Laster opp filer %1$s
+infoUploaded = %1$s fil(er) lastet opp. Venter p\u00e5 serverrespons ...
+infoAborted = Opplasting avbrutt etter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) lastet opp
+errDuringUpload = Opplastingen stoppet med feil
+errHttpResponse = Opplastingen feilet: uventet HTTP respons
+questionSendMailOnError = Det skjedde en feil under opplasting. \u00d8nsker du \u00e5 sende all relevant informasjon til webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Katalog
+colModified = Endret
+colReadable = Lesbar?
+errForbiddenExtension = Ugyldig filetternavn.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Det skjedde en feil under loggbehandlingen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6r vennlig og velg et album f\u00f8rst
+coppermineUploadOk = Bildene har blitt korrekt lastet opp til serveren, i det valgte albumet.\n\nKlikk OK n\u00e5 for \u00e5 fullf\u00f8re opplastingen.\n\nIkke glem \u00e5 lagre eventuelle endringer du har gjort.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Bilde '%1$s' er for stort. Bildet vil bli lastet opp uten endringer (ingen rotering eller endring av st\u00f8rrelse ...).
+notAPicture = Filen '%1$s' er ikke en gyldig bildefil. Den er ikke lagt til i listen over filer som skal lastes opp.
+
+#PictureDialog
+buttonClose = Lukk
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Bekreft
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_sk.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_sk.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_sk.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovak
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovak
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = H\u013eada\u0165 ...
+buttonRemoveSelected = Odstr\u00e1ni\u0165 Vybran\u00e9
+buttonRemoveAll = Odstr\u00e1ni\u0165 V\u0161etky
+buttonRotateLeft = Oto\u010di\u0165 v\u013eavo
+buttonRotateRight = Oto\u010di\u0165 vpravo
+buttonUpload = Odosla\u0165
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. a %3$d sec.
+timefmt_ms = %1$d min. a %2$d sec.
+timefmt_s = %1$d sek\u00fand
+timefmt_unknown = nezn\u00e1my
+status_msg = JUpload %1$d%% hotovo, R\u00fdchlos\u0165 prenosu: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ve\u013ekos\u0165 s\u00faboru pre '%1$s' je prive\u013ek\u00e1 (%2$s)
+
+#FileUploadThread
+preparingFile = Pripravujem s\u00fabor %1$d/%2$d
+infoUploading = Odosielam s\u00fabory %1$s
+infoUploaded = %1$s s\u00fabor(y/ov) odoslan\u00fdch. \u010cak\u00e1 sa na odpove\u010f servera ...
+infoAborted = Odosielanie zru\u0161en\u00e9 po %1$d S\u00fabore(och).
+nbUploadedFiles = %1$d s\u00fabor(y/ov) odoslan\u00fdch
+errDuringUpload = Odosielanie zastaven\u00e9 chybami
+errHttpResponse = Odosielanie ne\u00faspe\u0161n\u00e9: neo\u010dak\u00e1van\u00e1 HTTP odpove\u010f
+questionSendMailOnError = Po\u010das odosielania sa vyskytla chyba. Chcete zasla\u0165 potrebn\u00e9 inform\u00e1cie spr\u00e1vcovi str\u00e1nok?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zov
+colSize = Ve\u013ekos\u0165
+colDirectory = Adres\u00e1r
+colModified = Zmenen\u00e9
+colReadable = \u010citate\u013en\u00e9?
+errForbiddenExtension = Nepovolen\u00e1 koncovka s\u00faboru.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Pros\u00edm, vyberte najsk\u00f4r album.
+coppermineUploadOk = Obr\u00e1zky boli v poriadku nahrat\u00e9 na server, do vybran\u00e9ho albumu.\n\nKliknite na OK, pre doplnenie n\u00e1zvov a koment\u00e1rov k t\u00fdmto obr\u00e1zkom.\n\nNezabudnite klikn\u00fa\u0165 na tla\u010didlo 'Vykona\u0165 zmeny' pre ulo\u017eenie va\u0161ich zmien na server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zok '%1$s' je pr\u00edli\u0161 ve\u013ek\u00fd. Bude odoslan\u00fd bez zmien (bez oto\u010den\u00ed, zmeny rozmerov...).
+notAPicture = S\u00fabor s n\u00e1zvom '%1$s' nie je obr\u00e1zok. Nie je preto pridan\u00fd do zoznamu s\u00faborov na odoslanie.
+
+#PictureDialog
+buttonClose = Zatvori\u0165
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi\u0165
+
+#InteractiveTrustManager
+itm_title_pass = Vlo\u017ei\u0165 %1$s heslo
+itm_prompt_pass = %1$s heslo:
+itm_cert_alert = Upozornenie SSL Certifik\u00e1tu
+itm_cert_details = Detaily certifik\u00e1tu:
+itm_cert_subject = Predmet:
+itm_cert_issuer = Vydavate\u013e:
+itm_cert_nbefore = Platn\u00fd od:
+itm_cert_nafter = Platn\u00fd do:
+itm_cert_serial = S\u00e9riov\u00e9 \u010d\u00edslo:
+itm_cert_fprint = %1$s Otla\u010dok prsta:
+itm_cert_C = Krajina:
+itm_cert_CN = \u0160tandardn\u00fd n\u00e1zov:
+itm_cert_L = Lokalita:
+itm_cert_ST = \u0160t\u00e1t \u010di provincia:
+itm_cert_O = Organiz\u00e1cia:
+itm_cert_OU = Organizational unit:
+itm_reasons = D\u00f4vod(y):
+itm_reason_cnmatch = \u0160tandardn\u00fd n\u00e1zov certifik\u00e1tu nezodpoved\u00e1 n\u00e1zvu hostu (%1$s).
+itm_reason_itrust = Vydavate\u013e certifik\u00e1tu nie je d\u00f4veryhodn\u00fd.
+itm_reason_expired = Platnos\u0165 certifik\u00e1tu vypr\u0161ala.
+itm_reason_notyet = Certifik\u00e1t e\u0161te nie je platn\u00fd.
+itm_fail_verify = Certifik\u00e1t prijat\u00fd od serveru nebolo mo\u017en\u00e9 overi\u0165.
+itm_accept_prompt = Chcete prija\u0165 tento certifik\u00e1t?
+itm_accept_always = V\u017edy
+itm_accept_now = Iba pre tentokr\u00e1t
+itm_accept_no = Nie
+itm_new_tstore = Nov\u00fd TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_sl.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_sl.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_sl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovenian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovenian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = I\u0161\u010di ...
+buttonRemoveSelected = Odstrani ozna\u010dene
+buttonRemoveAll = Odstrani vse
+buttonRotateLeft = Zasukaj levo
+buttonRotateRight = Zasukaj desno
+buttonUpload = Nalo\u017ei
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Datoteka v pripravi %1$d/%2$d
+infoUploading = Nalaganje datotek %1$s
+infoUploaded = Datoteke %1$s so nalo\u017eene. \u010cakam na odziv stre\u017enika ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d datoteke so nalo\u017eene
+errDuringUpload = Nalaganje zaustavljeno zaradi napake
+errHttpResponse = HTTP odgovor stre\u017enika ne ustreza kriterijem. Nalaganje se ni posre\u010dilo.
+questionSendMailOnError = Med nalaganjem je pri\u0161lo do napake. \u017delite to informacijo poslati skrbniku strani?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Velikost
+colDirectory = Mapa
+colModified = Spremenjeno
+colReadable = Berljivo?
+errForbiddenExtension = Napa\u010dna kon\u010dnica datoteke.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Med prijavo je pri\u0161lo do napake
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosim, najprej izberi album.
+coppermineUploadOk = Slike so se pravilno nalo\u017eile v izbrani album.\n\nKlikni OK za objavo imen in komentarjev k slikam.\n\nNe pozabi klikniti na gumb 'Upo\u0161tevaj spremembo'. Le tako bodo spremembe shranjene na stre\u017eniku!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Slika '%1$s' je prevelika. Nalo\u017eena bo brez sprememb (brez zasuka, spremembe velikosti ...).
+notAPicture = Datoteka z imenom '%1$s' ni slika in ni vklju\u010dena na seznam datotek za nalaganje.
+
+#PictureDialog
+buttonClose = Zapri
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = English (default language file)
+contributor = Core translation file (no contributor)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+dialogUploadRetryTitle = Retry the upload?
+buttonDetails = Details
+buttonYes = Yes
+buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_ro.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_ro.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_ro.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Romanian (idem to Moldova)
+contributor = Adrian (nickname: ady1503) (mail: gallery@butnarumd.com)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = romanian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = R\u0103sfoire ...
+buttonRemoveSelected = \u00cenl\u0103tura\u0163i selectat
+buttonRemoveAll = Elimin\u0103 Tot
+buttonRotateLeft = Rotire st\u00eenga
+buttonRotateRight = Rotire dreapta
+buttonUpload = \u00cencarc\u0103
+buttonStop = OPRE\u015eTE
+messageLogWindowCopiedToClipboard = Mesaje de depanare au fost copiate \u00een clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d secunde
+timefmt_unknown = ne\u015ftiut
+status_msg = JUpload %1$d%% a terminat, rat\u0103 de transfer: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Lungimea de fi\u015fier pentru '%1$s' este prea mare (%2$s)
+
+#FileUploadThread
+preparingFile = Pregatirea de fi\u015fier %1$d/%2$d
+infoUploading = \u00cenc\u0103rcare de fi\u015fiere %1$s
+infoUploaded = %1$s fi\u015fier(e) \u00eenc\u0103rcate. \u00cen a\u015fteptare pentru r\u0103spunsul serverului ...
+infoAborted = \u00cenc\u0103rcare oprit\u0103 dup\u0103 %1$d Fi\u015fier(e).
+nbUploadedFiles = %1$d fi\u015fier(e) \u00eenc\u0103rcate
+errDuringUpload = \u00cenc\u0103rcare oprit\u0103 cu erori
+errHttpResponse = \u00cenc\u0103rcare e\u015fuat\u0103: r\u0103spuns nea\u015fteptat HTTP
+questionSendMailOnError = A ap\u0103rut o eroare \u00een timpul \u00eenc\u0103rc\u0103rii. Vrei s\u0103 trimit\u0103 toate informa\u0163iile relevante pentru webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = A ap\u0103rut urm\u0103toarea eroare \u00een timpul \u00eenc\u0103rc\u0103rii:\n%1$s\n\nVrei s\u0103 mergi mai departe cu \u00eenc\u0103rcare curent\u0103?
+
+#FilePanelDataModel
+colName = Nume
+colSize = Volum
+colDirectory = Director
+colModified = Modificat
+colReadable = Poate fi citit?
+errForbiddenExtension = Interzis\u0103 extensiunea de fi\u015fier.
+
+#DefaultUploadPolicy
+errDuringLogManagement = O eroare a ap\u0103rut \u00een timpul de gestionare a \u00eenregistr\u0103rii
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u0103 rug\u0103m, alege\u0163i un album prima dat\u0103.
+coppermineUploadOk = Fotografiile au fost corect \u00eenc\u0103rcate pe server, \u00een albumul selectat.\n\nFace\u0163i clic pe OK acum pentru a asocia numele \u015fi comentariile la aceste imagini.\n\nNu uita\u0163i s\u0103 face\u0163i clic pe butonul 'Apply modification button' pentru a salva modific\u0103rile dvs. de pe server!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imaginea '%1$s' este prea mare. Acesta va fi \u00eenc\u0103rcat\u0103 neschimbat\u0103 (f\u0103r\u0103 rota\u0163ie, redimensionare ...).
+notAPicture = Fi\u015fier numit '%1$s' nu este o imagine. El nu se adaug\u0103 la lista de fi\u015fiere care urmeaz\u0103 s\u0103 fie \u00eenc\u0103rcate.
+
+#PictureDialog
+buttonClose = \u00cenchide
+
+#DateRenderer
+dateformat = hh:mm dd-MM-yyyy aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = Confirma\u0163i
+
+#InteractiveTrustManager
+itm_title_pass = Introduce\u0163i %1$s parola
+itm_prompt_pass = %1$s parola:
+itm_cert_alert = SSL Certificat alert\u0103
+itm_cert_details = Detaliile certificatului:
+itm_cert_subject = Subiect:
+itm_cert_issuer = Emitentul:
+itm_cert_nbefore = Nu \u00eenainte de:
+itm_cert_nafter = Nu dup\u0103:
+itm_cert_serial = Serie:
+itm_cert_fprint = %1$s Amprent\u0103 digital\u0103:
+itm_cert_C = \u0162ar\u0103:
+itm_cert_CN = Nume comun:
+itm_cert_L = Localitatea:
+itm_cert_ST = Statul sau provincia:
+itm_cert_O = Organiza\u0163ia:
+itm_cert_OU = Unitate organiza\u0163ional\u0103:
+itm_reasons = Motiv(e):
+itm_reason_cnmatch = Certificatul cu denumirea comun\u0103 nu se potrive\u015fte cu numele de host (%1$s).
+itm_reason_itrust = Emitentului Certificatul nu este de \u00eencredere.
+itm_reason_expired = Certificatul este expirat.
+itm_reason_notyet = Certificatul nu este \u00eenc\u0103 valabil.
+itm_fail_verify = Certificatul, prezentat de server nu a putut fi verificat.
+itm_accept_prompt = Dori\u0163i s\u0103 accepta\u0163i acest certificat?
+itm_accept_always = \u00centotdeauna
+itm_accept_now = Numai pentru aceast\u0103 sesiune
+itm_accept_no = Nu
+itm_new_tstore = Nou TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/target/classes/lang/lang_zh.properties
===================================================================
--- 3thparty/jupload/target/classes/lang/lang_zh.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/lang/lang_zh.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/target/classes/wjhk/jupload2/gui/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/gui/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/gui/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+Implementation of caching and special algorithms for various file types.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/target/classes/wjhk/jupload2/upload/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/upload/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/upload/package.html	(revision 3951)
@@ -0,0 +1,127 @@
+
+<HTML>
+
+<BODY>
+
+This package contains the code that actually executes the upload (see below for a full description of the way the upload
+is executed in the JUpload code). 
+It is structured around these main items:
+<DIR>
+<LI><A HREF="FileUploadManagerThread.html">FileUploadManagerThread</A>: The main class. It controls the execution of 
+the upload, manages the file preparation, the progress bar, the possible exceptions...
+<LI><A HREF="FileUploadThread.html">FileUploadThread</A>: The interface of the class the execute the successives requests
+to the server. The following class implements this interface:
+	<DIR>
+	<LI><A HREF="DefaultFileUploadThread.html">DefaultFileUploadThread</A> is an abstract class, the provides the global
+	upload mechanism to send one packet of files to the server. The packet is created by FileUploadManagerThread, 
+	according to the current upload policy, with parameters like: <I>maxChunkSize</I> and <I>nbFilesPerRequest</I>. All protocol 
+	specific methods are implemented in the following implementation, depending on the applet parameter <I>postURL</I>:
+	<LI><A HREF="FileUploadThreadHTTP.html">FileUploadThreadHTTP</A> executes uploads to an HTTP server (http, https, 
+	proxy or not...), by using POST requests. It implements the abstract methods of DefaultFileUploadThread.
+	<LI><A HREF="FileUploadThreadFTP.html">FileUploadThreadFTP</A> is the implementation for FTP servers
+	</DIR>
+<LI><A HREF="UploadFileData.html">UploadFileData</A> is an implementation of the 
+	<A HREF="../filedata/FileData.html">wjhk.jupload2.filedata.FileData</A> interface, to add the 
+	<A HREF="UploadFileData.html#uploadFile(java.io.OutputStream,%20long)">uploadFile(OutputStream, long)</A> method,
+	which sends the file bytes to the server.
+<LI>The <A HREF="helper/package-summary.html">wjhk.jupload2.upload.helper</A> package offers various utilities to manage the upload.
+</DIR>
+
+<H3>How works the upload</H3>
+
+<P>Here is a description of what occurs, when the user clicks on the 'upload' button, on the applet, or when the
+applet startUpload() method is called by javascript:</P>
+<DIR>
+<LI>The JUploadPanel.doStartUpload() starts the job
+<LI>It calls the <A HREF="../policies/UploadPolicy.html#beforeUpload()">UploadPolicy.beforeUpload()</A> method. If this method 
+returns false, the process stops here.
+<LI>It then creates and starts the FileUploadManagerThread thread. This thread is responsible to throw all necessary 
+actions to execute the upload
+<LI>The fileUploadManagerThread creates the necessary queues and threads (see below)
+<LI>It then waits for the upload to finish, by comparing the total number of files to upload to the number of uploaded
+files, after each successful upload.
+</DIR>
+
+<P>The upload is done by these threads:</P>
+<DIR>
+<LI><A HREF="FileUploadManagerThread.html">FileUploadManagerThread</A>: The main thread of the upload, does these actions:
+	<DIR>
+	<LI>creation and start the queues described below.
+	<LI>creation and start the threads described below.
+	<LI>waiting for the upload to be finished
+	<LI>updating the upload progress bar
+	<LI>maintain the end of upload flag (with the isUploadFinished() method)
+	</DIR>
+<LI><A HREF="FilePreparationThread.html">FilePreparationThread</A>: This thread:
+	<DIR>
+	<LI>reads the list of files, from the FilePanel,
+	<LI>prepares each file for upload, by calling the <A HREF="../filedata/FileData.html#beforeUpload()">FileData.beforeUpload()</A> method.
+	<LI>manages exceptions that could occurs here. If one occurs, the user is asked if he want to go on with upload.
+	<LI>put the prepared file on the <B>preparedFileQueue</B>, if everything is ok.
+	<LI>put a <A HREF="UploadFileDataPoisonned.html">UploadFileDataPoisonned</A>, to tell the PacketPreparationThread 
+	that the last file was sent.
+	<LI>contains the reference of the number of files to upload (as some files may be in error, while the upload goes on).
+	</DIR>
+<LI><A href="PacketConstructionThread.html">PacketConstructionThread</A>: This thread is responsible for grouping the 
+files in packet of files, that will be sent in one request to the server. It:  
+	<DIR>
+	<LI>reads the files in the <B>preparedFileQueue</B>
+	<LI>checks if it can be added to the current packet.
+	<LI>put the packet in the <B>packetQueue</B> as soon as a packet is ready (or when the upload is finished)
+	<LI>put a <A HREF="UploadFilePacketPoisonned.html">UploadFilePacketPoisonned</A>, to tell the FileUploadThread 
+	that the last packet was sent.
+	<LI>adds the file to the current packet.
+	</DIR>
+<LI><A HREF="FileUploadThread.html">FileUploadThread</A>: This interface is implemented by these classes: 
+<A HREF="DefaultFileUploadThread.html">DefaultFileUploadThread</A> is an abstract
+class that contains all non protocol-specific code. The <A HREF="FileUploadThreadFTP.html">FileUploadThreadFTP</A> and 
+<A HREF="FileUploadThreadHTTP.html">FileUploadThreadHTTP</A> class implements the protocol-specific treatements, mainly: 
+build the request and read the server response. These classes do these actions:
+	<DIR>
+	<LI>Reads the next packet in the <B>packetQueue</B>
+	<LI>Checks if the upload is in chunked mode or not. Chunk mode is activated when the packet size is bigger than the
+	maxChunkSize applet. There must be only one file in the packet.
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeRequest(wjhk.jupload2.upload.UploadFilePacket)">DefaultFileUploadThread.beforeRequest(UploadFilePacket)</A> 
+	method, for any request preparation (server connection...) 
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#startRequest(long,%20boolean,%20int,%20boolean)">DefaultFileUploadThread.startRequest(long, boolean, int, boolean)</A>
+	method, for headers that need to be sent before the first file. 
+	<LI>[Non chunked mode] Loops throught the files in the packet:
+		<DIR>
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeFile(wjhk.jupload2.upload.UploadFilePacket, wjhk.jupload2.upload.UploadFileData)">beforeFile(UploadFilePacket, UploadFileData)</A>
+		<LI>Calls the <A HREF="UploadFileData.html#uploadFile(java.io.OutputStream, long)">UploadFileData.uploadFile(OutputStream, long)</A> to send the bytes for the already prepared files to the server.
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#afterFile(wjhk.jupload2.upload.UploadFileData)">afterFile(UploadFileData)</A>
+		</DIR>
+	<LI>[Chunked mode] Loops throught the chunks for the unique file in the packet:
+		<DIR>
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeFile(wjhk.jupload2.upload.UploadFilePacket, wjhk.jupload2.upload.UploadFileData)">beforeFile(UploadFilePacket, UploadFileData)</A>
+		<LI>Calls the <A HREF="UploadFileData.html#uploadFile(java.io.OutputStream, long)">UploadFileData.uploadFile(OutputStream, long)</A> to send the bytes for the current chunk of the already prepared
+		files to the server.
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#afterFile(wjhk.jupload2.upload.UploadFileData)">afterFile(UploadFileData)</A>
+		</DIR>
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#finishRequest()">finishRequest()</A> method, to clean any 
+	resources about this request.
+	<LI>The <A HREF="../policies/UploadPolicy.html#checkUploadSuccess(int, java.lang.String, java.lang.String)">UploadPolicy.checkUploadSuccess(int, String, String)</A>
+	is called after each request to the server, to check that the server response contains the relevant success string.
+	It also checks if an error occurs (and then displays the message to the user). In this case, the 
+	<A HREF="FileUploadManagerThread.html#setUploadException(wjhk.jupload2.exception.JUploadException)">FileUploadManagerThread.setUploadException(JUploadException)</A>
+	is called. This stops the upload. All threads will quit. 
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#cleanRequest()">cleanRequest()</A> method, to clean any resources
+	used by this request.
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#cleanAll()">cleanAll()</A> method when the upload is finished, 
+	to clean any global resource for the upload.
+	</DIR>
+</DIR>
+
+<H3>The resume facility</H3>
+<P>When a network error occurs during upload, the applet can have some retries to the server. These retries can be automatic 
+or manually controlled. When an retries occurs, the whole packet is resent. That is: the apply re-execute the request that failed.</P>
+
+
+Impacts:
+- The FileData.afterUpload() can only be called once the whole request is a success or a failure without retry. That is: the afterUpload
+is called after catching the exception, that may be resumed.
+--> The call to FileData.afterUpload() should be moved from doNonChunkedUpload() and doChunkedUpload() to doUpload, in a
+new finally block, in a finally block.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/target/classes/wjhk/jupload2/policies/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/policies/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/policies/package.html	(revision 3951)
@@ -0,0 +1,298 @@
+
+<HTML>
+
+<BODY>
+
+<P>This package contains the upload policies: they give you hook entry points, to override the default applet behaviour 
+with a minimum of java code.</P>
+
+This pages describes how to create a new upload policy, to adapt the applet to your needs, without interfering
+with the core applet, that is: with having compatibility with future JUpload versions. Here are other links on this subject:
+<DIR>
+<LI> See {@link wjhk.jupload2.policies.UploadPolicy} for the list of applet parameters</LI>
+<LI><a href="../../../howto-customization.html">howto customize</a> for a presentation of
+the main ways to adapt the applet to your needs.
+</DIR>
+
+
+<H3>Creating a new upload policy: introduction</H3>
+
+Creating a new upload policy, allows you to change the applet behaviour, and still use the core applet function. This 
+insures you that your development will remain compatible with next applet versions.
+<P>You'll find on this page a description of the {@link wjhk.jupload2.policies.UploadPolicy} methods, grouped by categories.</P>
+<P><B>Note:</B> Creating a new upload policy is mandatory, if you want to manage some other kind of {@link wjhk.jupload2.filedata.FileData}. 
+You can then add some kind of 'before upload check', or have a specific applet behaviour, for instance be able to hear 
+sound file before upload.</P>
+
+<h3>Presentation</h3>
+
+<p>To create a new upload policy, you need to create a new java
+class: the easiest way is to inherit from @link wjhk.jupload2.policies.DefaultUploadPolicy}. 
+You can then override methods of the UploadPolicy interface that you need to update for your needs.</p>
+<p>This kind of customization will be compatible within next JUpload
+applet release. If you need other hooks (method within the UploadPolicy
+interface, to allow other customizations), please let me know by posting a message
+on the sourceforge jupload forums (open discussions for instance), or
+post a new Feature Request in the jupload sourceforge project page. For instance, some attributes and methods from 
+DefaultUploadPolicy are protected (not private), so that you can use them in your own upload policies.</p>
+<p>Here is a sample description of the customization that you can do by
+using the creating a new policy, using the UploadPolicy interface. All methods are described in
+the next section of this page.</p>
+<ul>
+    <li>Control files management:
+    <ul>
+        <li>Authorization (or not) to add a file to the list of
+        files to upload, see UploadPolicy#createFileData(File, File). This
+        allows the policy to validate files, before adding them to the
+        list of files that must be displayed. The
+        {@link wjhk.jupload2.policies.UploadPolicy#createFileData(File, File)} checks that the added
+        files are valid pictures.</li>
+        <li>File preparation before upload (for instance to resize
+        a picture, or encode a text file to a specific format)</li>
+    </ul>
+    </li>
+    <li>Display other buttons on the applet (or remove the default
+    buttons), see UploadPolicy.createTopPanel(JButton, JButton, JButton,
+    JPanel)</li>
+    <li>Specific behaviour, on file selection. The
+    wjhk.jupload2.policies.PictureUploadPolicy allows picture
+    management. The UploadPolicy.onSelectFile(FileData) method is called
+    when the user selects a file in the list. This allow the policy to
+    do any action about this file. The
+    PictureUploadPolicy.onSelectFile(FileData) displays a preview
+    pictures on the top part of the applet.</li>
+</ul>
+
+<h3>Note: UploadPolicyFactory</h3>
+
+<p>The JuploadApplet asks the UploadPolicyFactory to create
+(instanciate) the needed UploadPolicy. That is:</p>
+<dir>
+    <li>During initialization of the applet, the
+    UploadPolicyFactory.getUploadPolicy() method is called. This method
+    checks the <i>uploadPolicy</i> parameter. If this uploadPolicy is
+    unknown or not set, the DefaultUploadPolicy is used. If a specific
+    uploadPolicy is found, it can of course read specific parameters
+    from the APPLET tag.</li>
+    <li>Then, UploadPolicyFactory.getUploadPolicy() creates the
+    class implementing the UploadPolicy factory, and returns the
+    reference to this class.</li>
+    <li>The upload policy can not be changed while the applet is
+    running.</li>
+</dir>
+
+<h3>Creation of a new UploadPolicy: detailed steps</h3>
+<p>To create a new UploadPolicy, you'll need to:</p>
+<ul>
+    <li><b>Create a new class, implementing the UploadPolicy
+    interface</b>. The easiest way is to inherit from an existing
+    UploadPolicy. This insure that your new policy will be compatible
+    with next JUpload releases. <br>
+    <i>Note: The upload policies are created by UploadPolicyFactory.
+    <U>Their constructor must:</U>
+    <ul>
+        <li>Be public, to be called by this class,</li>
+        <li>Have one parameter: the current <a href="../context/JUploadContext.html">wjhk.jupload2.context.JUploadContext</a>.</li>
+    </ul>
+    </i></li>
+    <li><b>Override some UploadPolicy methods</b>, to have your
+    specific behaviour.</li>
+    <li>Don't change any other java code, so that your upload
+    policy will work with next JUpload releases. <br>
+    <i>Note: if you need another 'hook', to be able to add specific
+    customization, please add a new Feature Request in sourceforge, I'll receive a notification mail.</i></li>
+</ul>
+
+	
+<H3>Methods to control file management</H3>
+
+<H4>FileData createFileData(File file, File root) throws JUploadExceptionStopAddingFiles</H4>
+<P>This methods creates a new {@link wjhk.jupload2.filedata.FileData} object. It returns null is no file data was created, for instance
+if this file didn't check some specific validation checks. <BR>
+<B>Note:</B> use this method to use any FileData specific to your needs. See {@link wjhk.jupload2.policies.PictureUploadPolicy} for a sample
+of this.
+</P>
+
+<H4>void afterFileDropped(DropTargetDropEvent dropEvent)</H4>
+<P>Specific reaction of the applet, when file are dropped onto it.</P>
+
+
+<H3>Methods to control the applet GUI (display, behaviour)</H3>
+
+This methods are used to control what the {@link wjhk.jupload2.gui.JUploadFileChooser} has to do.
+
+<H4>JPanel createTopPanel(JButton browse, JButton remove, JButton removeAll, JUploadPanel mainPanel)</H4>
+<P>Allows the applet to change the way the top part of the applet is displayed, that is: the place where the 
+Choose, remove, remove all buttons are. <B>If you override this method, you must use the given button if you want
+these functionalities to work</B>. If you don't put the browse button, for instance, the user won't be able to 
+display a file chooser, unless you manage it yourself. See {@link wjhk.jupload2.policies.PictureUploadPolicy}, for a way to use the 
+standard buttons, and add specific ones.</P>
+
+
+<H4>void addComponentsToJUploadPanel(JUploadPanel jUploadPanel)</H4>
+<P>Extension of the createTopPanel() idea. You can place any component of JUpload at any place ... or at no place.
+<B>If you override this method, you'll have to call the {@link wjhk.jupload2.gui.JUploadPanel} getter to get core applet objects.</B> 
+These are: 
+<DIR>
+<LI>Standard buttons: browseButton, removeButton, removeAllButton, stopButton, uploadButton. 
+<LI>Drag'n drop listener: dndListener, to manage files dropped on the applet
+<LI>The log output: jLogWindowPane
+<LI>The progress bar, which indicated the upload progress (from 0 to 100%): progressBar.
+<LI>The status label, where upload speed is indicated:
+<LI>The file panel, that contains the list of files to upload: filePanel.
+</DIR>
+</P>
+
+<H4>JPanel createProgressPanel(JProgressBar progressBar, JButton uploadButton, JButton stopButton, JPanel mainPanel)</H4>
+<P>You probably won't have to override this method. Note that this method allows you to not
+display the stop and upload buttons.	</P>
+
+<H4>JPanel createStatusBar(JLabel statusContent, JPanel mainPanel)</H4>
+<P>This method should not be used any more. Use the showStatusBar applet parameter instead.</P>
+
+<H4>void onFileSelected(FileData fileData)</H4>
+<P>Reaction of the applet, when a file is selected in the file list. For instance, {@link wjhk.jupload2.policies.PictureUploadPolicy} 
+displays the selected picture in the preview component.</P>
+
+<H4>void onFileDoubleClicked(FileData fileData)</H4>
+<P>Reaction of the applet, when a file is double clicked. For instance, {@link wjhk.jupload2.policies.PictureUploadPolicy} opens a dialog
+box, that contain a full screen display of the current picture.	</P>
+
+
+<H3>Methods to control the file chooser</H3>
+
+This methods are used to control what the {@link wjhk.jupload2.gui.JUploadFileChooser} has to do.
+
+<H4>JUploadFileChooser createFileChooser()</H4>
+<P>Allows the applet to change user another JFileChooser. Your specific file chooser should inherit 
+from JUploadFileChooser</P>
+
+<H4>boolean fileFilterAccept(File file)</H4>
+<P>Called by the {@link wjhk.jupload2.gui.JUploadFileFilter}. This method contains the actual response to the {
+@link java.io.FileFilter#accept(File)} method of the FileFilter interface. It allows to control what can be displayed 
+on the file chooser.</P>
+
+<H4>String fileFilterGetDescription()</H4>
+<P>The file filter description, in the file chooser. The default is to display the list of authorized 
+extensions. This can be too large, if many extensions are authorized. You can then put here a more descriptive text.</P>
+
+<H4>Icon fileViewGetIcon(File file)</H4>
+<P>Returns the icon that must be displayed for this file on the file chooser. This method is called asynchroneously,
+so that long calculation won't block the applet. See an example in the {@link wjhk.jupload2.policies.PictureUploadPolicy}. This policy
+returns an icon created from the picture content.</P>
+
+
+<H3>Upload management</H3>
+
+<H4>boolean isUploadReady()</H4>
+<P>Allows a control of the current upload policy, before any upload work starts. <B>You'll probably have to override
+this method if you want to do pre-upload checks on files</B></P>
+
+<H4>void beforeUpload()</H4>
+<P>This method is called just before upload, for instance to allow any 'before upload' work, like computing 
+some global information. See also the FileData.beforeUpload(), that is called for each file.</P>
+
+<H4>boolean checkUploadSuccess(int status, String msg, String body) throws JUploadException</H4>
+<P>You probably won't have to override this method, if you use the stringUploadSuccess and stringUploadError
+applet parameters. If not, this method allows you to check that upload is a success. That is: there is no
+error (for instance, page not found), and the server side application actually accepted the file(s).</P>
+
+<H4>void afterUpload(Exception e, String serverOutput) throws JUploadException</H4>
+<P>Allows the caller to free any resource used during upload. See also the FileData.afterUpload(), that is called 
+for each file.</P>
+
+<H4>String getLastResponseBody()</H4>
+<P>This method is useful only in HTTP upload (not FTP, for instance). It allows any check or update of applet
+variables based on the server return. You probably should not have to override this method.</P>
+
+<H4>String getLastResponseMessage()</H4>
+<P>This method is useful only in HTTP upload (not FTP, for instance). It returns the full HTTP response, with headers. 
+It allows any check or update of applet variables based on the server return. You probably should not have to override
+this method.</P>
+
+<H4>void addHeader(String header)</H4>
+<P>Add a header to the list of all header that must be added to all upload. Useful only when uploading in HTTP mode.
+If you override this method, you'll have to override the onAppendHeader(ByteArrayEncoder) method.</P>
+
+<H4>ByteArrayEncoder onAppendHeader(ByteArrayEncoder sb) throws JUploadIOException</H4>
+<P>Add header on the HTTP request, while this requet is being written to the server. <B>If you override this 
+method, you'll have to call super.onAppendHeader(ByteArrayEncoder) method</B>.</P>
+
+<H4>String getSpecificHeaders()</H4>
+<P>Allows the upload policy to add specific headers. This is used only for HTTP upload.</P>
+
+<H4>String getFormdata()</H4>
+<P>Load data from an HTML form. These data will be set with each file in the upload. See also the
+{@link wjhk.jupload2.filedata.FileData#appendFileProperties(ByteArrayEncoder)} method, for a way to add data specific to one file.</P>
+
+
+<H3>Getters and setters</H3>
+
+<P>The last category of methods is the getters and setters. There is a getter for each applet parameter. Most of applet parameters
+also has a setter. You can override them to add some execution time calculation. For instance, {@link Coppermine#getPostURL()} 
+calls the default getter, than the album id as a new parameter on the URL.</P>
+<P>Here are the other getters:</P>
+
+<H4>void setProperty(String prop, String value) throws JUploadException</H4>
+<P>Allows to set any property. This can be called for any applet parameter. <B>This method can be called from 
+Javascript</B>, to allow runtime control of applet state by the javascript.</P>
+
+<H4>JUploadApplet getApplet()</H4>
+<P>This important getter returns the JUploadApplet. From it, you can get any GUI component.</P>
+
+<H4>String getDateFormat()</H4>
+<P>Returns the current date format, so that all date/time are displayed by using the same format.</P>
+
+<H4>int getSslVerifyCert()</H4>
+<P>For SSL management. Standard code should be good enough.</P>
+
+
+<H3>Message display (debug, info, warning, error...)</H3>
+
+<H4>void displayParameterStatus()</H4>
+<P><B>You should override</B> this method, to display any parameter specific to your upload policy. See 
+{@link wjhk.jupload2.policies.PictureUploadPolicy} for a sample.</P>
+
+<H4>void alert(String key)</H4>
+<P>You probably won't have to override this method. Displays an alert box, based on the key of the translated message.</P>
+
+<H4>void alertStr(String str)</H4>
+<P>You probably won't have to override this method. Displays an alert box.</P>
+
+<H4>void displayInfo(String info)</H4>
+<P>You probably won't have to override this method.. Will be renamed, as it just logged an info message.</P>
+
+<H4>void displayWarn(String warn)</H4>
+<P>You probably won't have to override this method. Will be renamed, as it just logs a warning.</P>
+
+<H4>void displayDebug(String debug, int minDebugLevel)</H4>
+<P>You probably won't have to override this method.. Will be renamed, as it just logs a debug message.</P>
+
+<H4>void displayErr(String err, Exception e)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>void displayErr(Exception e)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>void displayErr(String err)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>String getString(String key)</H4>
+<P>You probably won't have to override this method. Manages text translation.</P>
+
+
+<H3>Miscellaneous methods </H3>
+
+<H4>Cursor setWaitCursor()</H4>
+<P>You can change the applet wait cursor, by overriding this method.</P>
+
+<H4>void setCursor(Cursor cursor)</H4>
+<P>I don't think you'll have to override this one...</P>
+
+<H4>void sendDebugInformation(String reason)</H4>
+<P>send the debug output to the urlToSendErrorTo applet parameter. Allows logging on the server ... if this calls
+succeed, which is not the case when the server has a big trouble.</P>
+
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/target/classes/wjhk/jupload2/filedata/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/filedata/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/filedata/package.html	(revision 3951)
@@ -0,0 +1,79 @@
+
+<HTML>
+
+<BODY>
+
+<P>This package allows you to change the file relative behaviour: this page describes how to override the 
+default behaviour, to fullfill your needs (for instance add data compression, preload check, new data 
+about files in the upload to the server..</P>
+
+
+<H3>What is FileData for ?</H3>
+
+The <a href="FileData.html">FileData</a> interface provides an easy way to add new file type capabilities to the applet. 
+The main entry points allow you to:
+<DIR>
+<LI>Change the file behaviour for the upload. For instance: additional checks, compression before upload, new file properties 
+to be sent to the server.
+<LI>New GUI capabilities: for instance an <a href="AudioFileData.html">AudioFileData</a> has been started, to allow the user to 
+hear the sound in the files he selected.   
+</DIR>
+
+<H3>HowTo create a new FileData instance</H3>
+   
+The core/default implementation is contained in <a href="DefaultFileData.html">DefaultFileData</a>. This class provides a default
+implementation to all FileData interface methods. The easiest way to create a new FileData instance, is to inherit from this default
+implementation, and just override the method you're interested in. Doing this minimizes your work, and insures you the minimum risk
+of incompatibility with next versions.<BR>
+Once you've created your new XxxFileData class, you'll have to create objects of this class. This is done by creating a new 
+{@link wjhk.jupload2.policies.UploadPolicy}, and override the 
+{@link wjhk.jupload2.policies.UploadPolicy#createFileData(java.io.File, java.io.File)} method.
+
+<H3>Description of FileData methods</H3>
+
+<H4>Methods with impact on upload behaviour or content</H4>
+
+<TABLE>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#appendFileProperties(ByteArrayEncoder, int)}</TD>
+		<TD>Add properties like the filename, or the directory to the upload (useless in FTP mode)</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#beforeUpload()} </TD>
+		<TD>Allows the FileData to do any necessary work before the upload of the file begin. For instance, in 
+		PictureFileData, the picture can here be resized, according to the upload policies values.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#getUploadLength()} </TD>
+		<TD>Returns the actual number of bytes that will be uploaded. Will be different from the file length, if the 
+		file must transformed before upload. For instance: picture resizing, or before upload compression.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#afterUpload()}</TD>
+		<TD>Called after the end of the upload. Allows to clear any resource, like temporary files.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#getInputStream()}</TD>
+		<TD>Returns an InputStream, that'll contain all bytes to upload.</TD>
+	</TR>
+</TABLE>
+
+<H4>Methods for general file information</H4>
+
+You probably won't have to override these methods.
+
+<DIR>
+<LI>{@link wjhk.jupload2.filedata.FileData#getFileExtension()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getFileLength()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getLastModified()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getDirectory()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getMimeType()}
+<LI>{@link wjhk.jupload2.filedata.FileData#canRead()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getFile()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getRelativeDir()}: Returns the directory, relative to the current selection. Especially useful when 
+dropping entire directories on the applet. 
+</DIR>
+ 
+</BODY>
+</HTML>
+ 
Index: 3thparty/jupload/target/classes/wjhk/jupload2/exception/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/exception/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/exception/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+Some application specific exceptions.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/target/classes/wjhk/jupload2/package.html
===================================================================
--- 3thparty/jupload/target/classes/wjhk/jupload2/package.html	(revision 3951)
+++ 3thparty/jupload/target/classes/wjhk/jupload2/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+The applet itself.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/target/classes/conf/svn.properties
===================================================================
--- 3thparty/jupload/target/classes/conf/svn.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/conf/svn.properties	(revision 3951)
@@ -0,0 +1,17 @@
+
+# JUpload version
+jupload.version = pom.version undefined
+
+# Date of the compilation
+jupload.buildTimestamp = 1
+
+#Build number. Allows to identify each build. Reset to 1, after a clean
+jupload.buildNumber = 1
+
+#Last revision commited. This compilation may contain other uncommitted changes.
+jupload.svn.revision = {svn.revision}
+
+#Date of the last src directory commit. 
+#Caution: file by file commit doesn't change this date.
+jupload.lastSrcDirModificationDate = A source modification date
+		
Index: 3thparty/jupload/target/classes/conf/default_daemon.properties
===================================================================
--- 3thparty/jupload/target/classes/conf/default_daemon.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/conf/default_daemon.properties	(revision 3951)
@@ -0,0 +1,6 @@
+#
+# This file contains default values for the daemon JUpload. These default values override the
+# default values defined in UploadPolicy, due to the specific needs of a standalone application
+#
+
+readCookieFromNavigator = false
Index: 3thparty/jupload/target/classes/conf/mimetypes.properties
===================================================================
--- 3thparty/jupload/target/classes/conf/mimetypes.properties	(revision 3951)
+++ 3thparty/jupload/target/classes/conf/mimetypes.properties	(revision 3951)
@@ -0,0 +1,226 @@
+#
+#This mime type list comes from the following site:
+# http://www.mimetype.org/
+#
+# Thanks to them!
+#
+# etienne_sf, 12 march 2010: add of Office 2007 support (thanks to jsibby)
+stl=application/SLA
+step=application/STEP
+stp=application/STEP
+dwg=application/acad
+ez=application/andrew-inset
+ccad=application/clariscad
+drw=application/drafting
+tsp=application/dsptype
+dxf=application/dxf
+xls=application/excel
+unv=application/i-deas
+jar=application/java-archive
+hqx=application/mac-binhex40
+cpt=application/mac-compactpro
+pot=application/mspowerpoint
+pps=application/mspowerpoint
+ppt=application/mspowerpoint
+ppz=application/mspowerpoint
+doc=application/msword
+bin=application/octet-stream
+class=application/octet-stream
+dms=application/octet-stream
+exe=application/octet-stream
+lha=application/octet-stream
+lzh=application/octet-stream
+oda=application/oda
+ogg=application/ogg
+ogm=application/ogg
+pdf=application/pdf
+pgp=application/pgp
+ai=application/postscript
+eps=application/postscript
+ps=application/postscript
+prt=application/pro_eng
+rtf=application/rtf
+set=application/set
+smi=application/smil
+smil=application/smil
+sol=application/solids
+vda=application/vda
+mif=application/vnd.mif
+xlc=application/vnd.ms-excel
+xll=application/vnd.ms-excel
+xlm=application/vnd.ms-excel
+xls=application/vnd.ms-excel
+xlw=application/vnd.ms-excel
+cod=application/vnd.rim.cod
+arj=application/x-arj-compressed
+bcpio=application/x-bcpio
+vcd=application/x-cdlink
+pgn=application/x-chess-pgn
+cpio=application/x-cpio
+csh=application/x-csh
+deb=application/x-debian-package
+dcr=application/x-director
+dir=application/x-director
+dxr=application/x-director
+dvi=application/x-dvi
+pre=application/x-freelance
+spl=application/x-futuresplash
+gtar=application/x-gtar
+gz=application/x-gunzip
+gz=application/x-gzip
+hdf=application/x-hdf
+ipx=application/x-ipix
+ips=application/x-ipscript
+js=application/x-javascript
+skd=application/x-koan
+skm=application/x-koan
+skp=application/x-koan
+skt=application/x-koan
+latex=application/x-latex
+lsp=application/x-lisp
+scm=application/x-lotusscreencam
+mif=application/x-mif
+bat=application/x-msdos-program
+com=application/x-msdos-program
+exe=application/x-msdos-program
+cdf=application/x-netcdf
+nc=application/x-netcdf
+pl=application/x-perl
+pm=application/x-perl
+rar=application/x-rar-compressed
+sh=application/x-sh
+shar=application/x-shar
+swf=application/x-shockwave-flash
+sit=application/x-stuffit
+sv4cpio=application/x-sv4cpio
+sv4crc=application/x-sv4crc
+tar.gz=application/x-tar-gz
+tgz=application/x-tar-gz
+tar=application/x-tar
+tcl=application/x-tcl
+tex=application/x-tex
+texi=application/x-texinfo
+texinfo=application/x-texinfo
+man=application/x-troff-man
+me=application/x-troff-me
+ms=application/x-troff-ms
+roff=application/x-troff
+t=application/x-troff
+tr=application/x-troff
+ustar=application/x-ustar
+src=application/x-wais-source
+zip=application/x-zip-compressed
+zip=application/zip
+tsi=audio/TSP-audio
+au=audio/basic
+snd=audio/basic
+kar=audio/midi
+mid=audio/midi
+midi=audio/midi
+mp2=audio/mpeg
+mp3=audio/mpeg
+mpga=audio/mpeg
+au=audio/ulaw
+aif=audio/x-aiff
+aifc=audio/x-aiff
+aiff=audio/x-aiff
+m3u=audio/x-mpegurl
+wax=audio/x-ms-wax
+wma=audio/x-ms-wma
+rpm=audio/x-pn-realaudio-plugin
+ram=audio/x-pn-realaudio
+rm=audio/x-pn-realaudio
+ra=audio/x-realaudio
+wav=audio/x-wav
+pdb=chemical/x-pdb
+xyz=chemical/x-pdb
+ras=image/cmu-raster
+gif=image/gif
+ief=image/ief
+jpe=image/jpeg
+jpeg=image/jpeg
+jpg=image/jpeg
+png=image/png
+tif tiff=image/tiff
+tif=image/tiff
+tiff=image/tiff
+ras=image/x-cmu-raster
+pnm=image/x-portable-anymap
+pbm=image/x-portable-bitmap
+pgm=image/x-portable-graymap
+ppm=image/x-portable-pixmap
+rgb=image/x-rgb
+xbm=image/x-xbitmap
+xpm=image/x-xpixmap
+xwd=image/x-xwindowdump
+iges=model/iges
+igs=model/iges
+mesh=model/mesh
+msh=model/mesh
+silo=model/mesh
+vrml=model/vrml
+wrl=model/vrml
+css=text/css
+htm=text/html
+html htm=text/html
+html=text/html
+asc txt=text/plain
+asc=text/plain
+c=text/plain
+cc=text/plain
+f90=text/plain
+f=text/plain
+h=text/plain
+hh=text/plain
+m=text/plain
+txt=text/plain
+rtx=text/richtext
+rtf=text/rtf
+sgm=text/sgml
+sgml=text/sgml
+tsv=text/tab-separated-values
+jad=text/vnd.sun.j2me.app-descriptor
+etx=text/x-setext
+xml=text/xml
+dl=video/dl
+fli=video/fli
+flv=video/flv
+gl=video/gl
+mp2=video/mpeg
+mpe=video/mpeg
+mpeg=video/mpeg
+mpg=video/mpeg
+mov=video/quicktime
+qt=video/quicktime
+viv=video/vnd.vivo
+vivo=video/vnd.vivo
+fli=video/x-fli
+asf=video/x-ms-asf
+asx=video/x-ms-asx
+wmv=video/x-ms-wmv
+wmx=video/x-ms-wmx
+wvx=video/x-ms-wvx
+avi=video/x-msvideo
+movie=video/x-sgi-movie
+mime=www/mime
+ice=x-conference/x-cooltalk
+vrm=x-world/x-vrml
+vrml=x-world/x-vrml
+
+#JTS: Support for Office 2007
+docm=application/vnd.ms-word.document.macroEnabled.12
+docx=application/vnd.openxmlformats-officedocument.wordprocessingml.document
+dotx=application/vnd.openxmlformats-officedocument.wordprocessingml.template
+potm=application/vnd.ms-powerpoint.template.macroEnabled.12
+potx=application/vnd.openxmlformats-officedocument.presentationml.template
+ppam=application/vnd.ms-powerpoint.addin.macroEnabled.12
+ppsm=application/vnd.ms-powerpoint.slideshow.macroEnabled.12
+ppsx=application/vnd.openxmlformats-officedocument.presentationml.slideshow
+pptm=application/vnd.ms-powerpoint.presentation.macroEnabled.12
+pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation
+xlam=application/vnd.ms-excel.addin.macroEnabled.12
+xlsb=application/vnd.ms-excel.sheet.binary.macroEnabled.12
+xlsm=application/vnd.ms-excel.sheet.macroEnabled.12
+xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+xltm=application/vnd.ms-excel.template.macroEnabled.12
+xltx=application/vnd.openxmlformats-officedocument.spreadsheetml.template
Index: 3thparty/jupload/src/main/assembly/release.xml
===================================================================
--- 3thparty/jupload/src/main/assembly/release.xml	(revision 3951)
+++ 3thparty/jupload/src/main/assembly/release.xml	(revision 3951)
@@ -0,0 +1,42 @@
+<assembly
+	xmlns="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/plugins/maven-assembly-plugin/assembly/1.1.0 http://maven.apache.org/xsd/assembly-1.1.0.xsd">
+	<id>src-${project.version}</id>
+	<formats>
+		<format>zip</format>
+	</formats>
+	<includeBaseDirectory>false</includeBaseDirectory>
+	<includeSiteDirectory>true</includeSiteDirectory>
+	<fileSets>
+		<fileSet>
+			<includes>
+				<include>${project.basedir}/.classpath_template_for_and_build</include>
+				<include>${project.basedir}/build.xml</include>
+				<include>${project.basedir}/maven-build.properties</include>
+				<include>${project.basedir}/maven-build.xml</include>
+				<include>${project.basedir}/pom.xml</include>
+				<include>${project.basedir}/readme.txt</include>
+			</includes>
+			<useDefaultExcludes>true</useDefaultExcludes>
+		</fileSet>
+		<fileSet>
+			<directory>${project.basedir}/src</directory>
+			<useDefaultExcludes>true</useDefaultExcludes>
+		</fileSet>
+		<fileSet>
+			<directory>${project.basedir}/lib</directory>
+		</fileSet>
+		<fileSet>
+			<!--
+				Copying the site, won't copy the wjhk.jupload.jar, even if it's in
+				the site folder ... ???
+			-->
+			<directory>${project.basedir}/target</directory>
+			<includes>
+				<include>wjhk.jupload.jar</include>
+			</includes>
+			<outputDirectory>site</outputDirectory>
+		</fileSet>
+	</fileSets>
+</assembly>
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadDaemon.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadDaemon.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadDaemon.java	(revision 3951)
@@ -0,0 +1,92 @@
+package wjhk.jupload2;
+
+import javax.swing.JFrame;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.context.JUploadContextExecutable;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * 
+ * This class allows to use JUpload as a stand alone application. It can then be
+ * used to manage upload, as do the applet. Or it can be used as a daemon. In
+ * this case the applet 'paste' files to the daemon, and the daemon is
+ * responsible for the upload. This is a good point when uploading big files:
+ * the user can go on browsing, or close his/her browser. The daemon will keep
+ * on uploading the file(s). <BR>
+ * The configuration can be stored in the jar file, or in a property file
+ * available on the net, through a URL. See the {link {@link #main(String[])}
+ * method for details.<BR>
+ * The daemon parameters are the same for the applet and the daemon. They are
+ * described on the {@link UploadPolicy} page.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class JUploadDaemon extends JFrame {
+
+    /** A generated serialVersionUID */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The URL, that 'perhaps' was given to the main method. Used only to
+     * transfer the value between the invokeLater and the actual execution of
+     * this method. It's not very clean, but I guess there will never be two
+     * execution of the daemon that will start in the same quarter of second
+     * with a different URL.
+     */
+    private static String propertiesURL = null;
+
+    /**
+     * The current execution context.
+     */
+    transient JUploadContext juploadContext = null;
+
+    /**
+     * Default constructor.
+     */
+    public JUploadDaemon() {
+        // TODO add a way to personalize the window title.
+        super("JUpload daemon");
+
+        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
+    }
+
+    /**
+     * Create the GUI and show it. For thread safety, this method should be
+     * invoked from the event-dispatching thread.
+     */
+    private static void createAndShowGUI() {
+        JUploadDaemon juploadDaemon = new JUploadDaemon();
+        juploadDaemon.juploadContext = new JUploadContextExecutable(
+                juploadDaemon, propertiesURL);
+
+        // Display the window.
+        juploadDaemon.pack();
+        juploadDaemon.setVisible(true);
+    }
+
+    /**
+     * The start of the application, when launched as a Stand Alone one. If an
+     * argument is given, it must be a valid URL to the JUpload configuration
+     * file. The daemon will load it as a property file. The allowed parameters
+     * and values are the same as the applet parameters. These are indicated in
+     * the {@link wjhk.jupload2.policies.UploadPolicy} page.<BR>
+     * If this URL is not given, the /conf folder in the jar file must contain
+     * the daemon property file.
+     * 
+     * @param args args[1] is optional, and may contain the URL pointing to the
+     *            configuration page.
+     */
+    public static void main(String[] args) {
+        propertiesURL = null;
+        if (args.length > 0) {
+            propertiesURL = args[0];
+        }
+        javax.swing.SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                createAndShowGUI();
+            }
+        });
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/EmptyApplet.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/EmptyApplet.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/EmptyApplet.java	(revision 3951)
@@ -0,0 +1,83 @@
+/**
+ * This applet is just an empty applet ...
+ * 
+ * I use it to use the HtmlConverter binary 'given' in the JDK: <DIR> <LI>I
+ * embed an instance of the EmptyApplet in my page, that contains the
+ * JUploadApplet: the user will be prompt to download the JRE of the correct
+ * version, if it nos installed. <LI>The JUploadApplet is created through the
+ * basic APPLET tag: it's much simplier this way, as I often change the applet
+ * parameters. </DIR> <BR>
+ * 
+ * Below is a sample of the HTML code you can insert in you HTML/ASP/PHP/JSP/ or
+ * whatever page. It has been generated by using the jdk tool HtmlConverter from
+ * a simple applet tag (see the applet commented, at the end of the sample). <BR>
+ * This sample has been generate from an applet tag. Just replace all occurences
+ * of <I>plugins/jupload/wjhk.jupload.jar</I> by the URL of your jar file that
+ * contains the empty applet.
+ * 
+ * 
+ * <!--"CONVERTED_APPLET"--> <!-- The next applet is an empty one. It uses for
+ * one thing: prompt the --> <!-- user to download the JRE, if it's not
+ * installed on its computer' --> <!-- HTML CONVERTER --> <script
+ * language="JavaScript" type="text/javascript"><!-- var _info =
+ * navigator.userAgent; var _ns = false; var _ns6 = false; var _ie =
+ * (_info.indexOf("MSIE") > 0 && _info.indexOf("Win") > 0 &&
+ * _info.indexOf("Windows 3.1") < 0); //--></script> <comment> <script
+ * language="JavaScript" type="text/javascript"><!-- var _ns =
+ * (navigator.appName.indexOf("Netscape") >= 0 && ((_info.indexOf("Win") > 0 &&
+ * _info.indexOf("Win16") < 0 &&
+ * java.lang.System.getProperty("os.version").indexOf("3.5") < 0) ||
+ * (_info.indexOf("Sun") > 0) || (_info.indexOf("Linux") > 0) ||
+ * (_info.indexOf("AIX") > 0) || (_info.indexOf("OS/2") > 0) ||
+ * (_info.indexOf("IRIX") > 0))); var _ns6 = ((_ns == true) &&
+ * (_info.indexOf("Mozilla/5") >= 0)); //--></script> </comment>
+ * 
+ * <script language="JavaScript" type="text/javascript"><!-- if (_ie == true)
+ * document.writeln('<object
+ * classid="clsid:8AD9C840-044E-11D1-B3E9-00805F499D93" WIDTH = "0" HEIGHT = "0"
+ * NAME = "EmptyApplet" codebase=
+ * "http://java.sun.com/update/1.5.0/jinstall-1_5-windows-i586.cab#Version=5,0,0,3"
+ * ><noembed><xmp>'); else if (_ns == true && _ns6 == false)
+ * document.writeln('<embed ' + 'type="application/x-java-applet;version=1.5" \
+ * CODE = "wjhk.jupload2.EmptyApplet" \ ARCHIVE =
+ * "plugins/jupload/wjhk.jupload.jar" \ NAME = "EmptyApplet" \ WIDTH = "0" \
+ * HEIGHT = "0" ' + 'scriptable=false ' +'pluginspage="http://java.sun.com/products/plugin/index.html#download"><noembed><xmp>'
+ * ) ; //--></script> <applet CODE = "wjhk.jupload2.EmptyApplet" ARCHIVE =
+ * "plugins/jupload/wjhk.jupload.jar" WIDTH = "0" HEIGHT = "0" NAME =
+ * "EmptyApplet"></xmp> <PARAM NAME = CODE VALUE = "wjhk.jupload2.EmptyApplet" >
+ * <PARAM NAME = ARCHIVE VALUE = "plugins/jupload/wjhk.jupload.jar" > <PARAM
+ * NAME = NAME VALUE = "EmptyApplet" > <param name="type"
+ * value="application/x-java-applet;version=1.5"> <param name="scriptable"
+ * value="false">
+ * 
+ * Java 1.4 or higher plugin required. </applet> </noembed> </embed> </object>
+ * 
+ * <!-- <APPLET CODE = "wjhk.jupload2.EmptyApplet" ARCHIVE =
+ * "plugins/jupload/wjhk.jupload.jar" WIDTH = "0" HEIGHT = "0" NAME =
+ * "EmptyApplet"> Java 1.4 or higher plugin required.
+ * 
+ * </APPLET> --> <!--"END_CONVERTED_APPLET"-->
+ * 
+ * 
+ */
+package wjhk.jupload2;
+
+import java.applet.Applet;
+
+/**
+ * 
+ * @author etienne_sf
+ */
+public class EmptyApplet extends Applet {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 
+     */
+    public EmptyApplet() {
+        // We do ... an empty constructor ... ;-)
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadApplet.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadApplet.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/JUploadApplet.java	(revision 3951)
@@ -0,0 +1,219 @@
+//
+// $Id: JUploadApplet.java 1376 2010-07-28 21:47:39Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-07-28 18:47:39 -0300 (Qua, 28 Jul 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2;
+
+import java.lang.reflect.InvocationTargetException;
+
+import javax.swing.JApplet;
+import javax.swing.JOptionPane;
+import javax.swing.SwingUtilities;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.context.JUploadContextApplet;
+import wjhk.jupload2.context.JavascriptHandler;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * The applet. It contains quite only the call to creation of the
+ * {@link JUploadContextApplet}, which contains the technical context. This
+ * context is responsible for loading the relevant {@link UploadPolicy}. <BR>
+ * <BR>
+ * The behavior of the applet can easily be adapted, by : <DIR> <LI>Using an
+ * existing {@link wjhk.jupload2.policies.UploadPolicy}, and specifying
+ * parameters. <LI>Creating a new upload policy, based on the
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}, or created from scratch.
+ * <BR>
+ * For all details on this point, please read the <a
+ * href="../../../howto-customization.html">howto-customization.html</a> page.
+ * 
+ * @author William JinHua Kwong (largely updated by etienne_sf)
+ * @version $Revision: 1376 $
+ */
+public class JUploadApplet extends JApplet {
+
+	/** A generated serialVersionUID, to avoid warning during compilation */
+	private static final long serialVersionUID = -3207851532114846776L;
+
+	/**
+	 * The current execution context.
+	 */
+	transient JUploadContext juploadContext = null;
+
+	/**
+	 * Called each time the applet is shown on the web page.
+	 */
+	@Override
+	public void init() {
+		class JUploadAppletInitializer implements Runnable {
+			JUploadApplet applet;
+
+			JUploadAppletInitializer(JUploadApplet applet) {
+				this.applet = applet;
+			}
+
+			public void run() {
+				juploadContext = new JUploadContextApplet(applet);
+			}
+		}
+
+		try {
+			SwingUtilities.invokeAndWait(new JUploadAppletInitializer(this));
+		} catch (InterruptedException e) {
+			// Hum, if we get here, there may be no logging system built ..
+			// Let's output something in the Java consoles
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// Hum, if we get here, there may be no logging system built ..
+			// Let's output something in the Java consoles
+			e.printStackTrace();
+		}
+
+		if (this.juploadContext == null) {
+			JOptionPane
+					.showMessageDialog(
+							null,
+							"An error occured during applet initialization. Please check the java console output",
+							"Alert", JOptionPane.ERROR_MESSAGE);
+		} else {
+			// Let's refresh the display, and have the caret well placed.
+			try {
+				this.juploadContext.getUploadPolicy().displayInfo(
+						"JUploadApplet is now initialized.");
+			} catch (JUploadException e) {
+				// Can't use standard JUpload log mode...
+				System.out.println("JUploadApplet is now initialized.");
+			}
+		}
+	}
+
+	/**
+	 * Called each time the applet is shown on the web page.
+	 */
+	@Override
+	public void start() {
+		if (this.juploadContext == null) {
+			String msg = "An error occured during applet initialization. Please check the java console output (juploadContext is null in applet.start())";
+			JOptionPane.showMessageDialog(null, msg, "Alert",
+					JOptionPane.ERROR_MESSAGE);
+			throw new java.lang.IllegalStateException(msg);
+		} else {
+			try {
+				this.juploadContext.getUploadPolicy().start();
+				this.juploadContext.getUploadPolicy().displayInfo(
+						"JUploadApplet is now started.");
+			} catch (JUploadException e) {
+				// Can't use standard JUpload log mode...
+				System.out.println("JUploadApplet is now started.");
+			}
+			this.validate();
+		}
+	}
+
+	/**
+	 * @see java.applet.Applet#stop()
+	 */
+	@Override
+	public void stop() {
+		try {
+			this.juploadContext.getUploadPolicy().displayInfo(
+					"JUploadApplet is now stopped.");
+		} catch (JUploadException e) {
+			// Can't use standard JUpload log mode...
+			System.out.println("JUploadApplet is now stopped.");
+		}
+	}
+
+	/**
+	 * @see java.applet.Applet#destroy()
+	 */
+	@Override
+	public void destroy() {
+		class JUploadAppletDestroyer implements Runnable {
+			JUploadApplet applet;
+
+			JUploadAppletDestroyer(JUploadApplet applet) {
+				this.applet = applet;
+			}
+
+			public void run() {
+				applet.juploadContext.runUnload();
+				applet.getContentPane().removeAll();
+			}
+		}
+		try {
+			this.juploadContext.getUploadPolicy().displayInfo(
+					"JUploadApplet is being destroyed.");
+		} catch (JUploadException e1) {
+			// Can't use standard JUpload log mode...
+			System.out.println("JUploadApplet is now destroyed.");
+		}
+
+		// Execute a job on the event-dispatching thread:
+		// destroying this applet's GUI.
+		try {
+			SwingUtilities.invokeAndWait(new JUploadAppletDestroyer(this));
+		} catch (Exception e) {
+		}
+	}
+
+	/**
+	 * This allow runtime modifications of properties, from javascript.
+	 * Currently, this can only be used after full initialization. This method
+	 * only calls the UploadPolicy.setProperty method. <BR>
+	 * Ex: document.jupload.setProperty(prop, value);
+	 * 
+	 * @param prop
+	 *            The property name that must be set.
+	 * @param value
+	 *            The value of this property.
+	 * @see JUploadContext#setProperty(String, String)
+	 */
+	public void setProperty(String prop, String value) {
+		this.juploadContext.setProperty(prop, value);
+	}
+
+	/**
+	 * Javascript can call this method to start the upload.
+	 * 
+	 * @return Returns the upload result. See the constants defined in the
+	 *         {@link JavascriptHandler} javadoc.
+	 */
+	public String startUpload() {
+		return this.juploadContext.startUpload();
+	}
+
+	/**
+	 * @see java.applet.Applet#getParameterInfo()
+	 */
+	public String[][] getParameterInfo() {
+		// FIXME Implement Applet.getParameterInfo()
+		return null;
+	}
+
+	/**
+	 * @see java.applet.Applet#getAppletInfo()
+	 */
+	public String getAppletInfo() {
+		return "JUpload applet, available at http://jupload.sourceforge.net";
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContext.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContext.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContext.java	(revision 3951)
@@ -0,0 +1,373 @@
+//
+// $Id: UploadPolicyFactory.java 629 2009-02-23 16:25:14Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2009-05-11
+// Creator: etienne_sf
+// Last modified: $Date: 2009-02-23 17:25:14 +0100 (lun., 23 fÃ©vr. 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.context;
+
+import java.awt.Cursor;
+import java.awt.Frame;
+import java.util.Vector;
+
+import javax.swing.JApplet;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.JUploadTextArea;
+import wjhk.jupload2.policies.DefaultUploadPolicy;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.helper.ByteArrayEncoderHTTP;
+
+/**
+ * This interface it used in upload policies to get information on the current
+ * Context. This context is responsible for: <DIR> <LI>Reading parameters from
+ * the environment or the applet parameters. <LI>Storing the current
+ * UploadPolicy (or null if not set yet) <LI> <LI></DIR>
+ * 
+ * @author etienne_sf
+ */
+public interface JUploadContext {
+
+	/*
+	 * **************************************************************************
+	 * **************** VERSION MANAGEMENT
+	 * *************************************************************************
+	 */
+
+	/**
+	 * @return The 'official' version (applet version and SVN revision)
+	 */
+	public String getDetailedVersionMessage();
+
+	/**
+	 * @return The applet version
+	 */
+	public String getVersion();
+
+	/**
+	 * @return The applet SVN revision, from which it was compiled
+	 */
+	public String getSvnRevision();
+
+	/**
+	 * @return Last modification date (date of last commit)
+	 */
+	public String getLastModified();
+
+	/**
+	 * @return Last modification date (date of last commit)
+	 */
+	public String getBuildDate();
+
+	/**
+	 * @return Last modification date (date of last commit)
+	 */
+	public int getBuildNumber();
+
+	/*
+	 * **************************************************************************
+	 * **************** GUI MANAGEMENT
+	 * *************************************************************************
+	 */
+
+	/**
+	 * Displays a given URL, in the given target. The target is meant in html
+	 * &lt;A&gt; tag, and may be ignored if not relevant.
+	 * 
+	 * @param url
+	 *            The URL to display, in text format. It will be normalized
+	 *            'before use'.
+	 * @param success
+	 *            Indicates whether the upload was a success or not.
+	 */
+	public void displayURL(String url, boolean success);
+
+	/**
+	 * Retrieves the current applet. This call is still used by
+	 * {@link ByteArrayEncoderHTTP}, to append form variable. It will be
+	 * removed, in the future.
+	 * 
+	 * @return The current applet, or null if not running in an applet
+	 */
+	public JApplet getApplet();
+
+	/**
+	 * Returns the current frame. Can be used to attach Dialog, for instance.
+	 * 
+	 * @return The current frame
+	 */
+	public Frame getFrame();
+
+	/**
+	 * Retrieves the current log window of this applet. This log window may
+	 * visible or not depending on various applet parameter.
+	 * 
+	 * @return the current log window of this instance.
+	 * @see JUploadPanel#showOrHideLogWindow()
+	 */
+	public JUploadTextArea getLogWindow();
+
+	/**
+	 * Returns the mime type associated with the given file extension. As the
+	 * applet may run on windows, the fileExtension is always changed to minor
+	 * case, before looking for the corresponding mime type.
+	 * 
+	 * @param fileExtension
+	 *            The file extension, in any case.
+	 * @return Returns the current mime type, for this extension.
+	 */
+
+	public String getMimeType(String fileExtension);
+
+	/**
+	 * Retrieves the current upload panel.
+	 * 
+	 * @return the current upload panel of this instance.
+	 */
+	public JUploadPanel getUploadPanel();
+
+	/**
+	 * This method the current UploadPolicy, associated with the current
+	 * execution context. This UploadPolicy is set once, when the application
+	 * start. It can not change afterwards.
+	 * 
+	 * @return The current UploadPolicy, or null of the uploadPolicy has not
+	 *         been set yet.
+	 * @throws JUploadException
+	 */
+	public UploadPolicy getUploadPolicy() throws JUploadException;
+
+	/**
+	 * @return The current cursor.
+	 * @see UploadPolicy#setCursor(Cursor)
+	 */
+	public Cursor getCursor();
+
+	/**
+	 * @param cursor
+	 *            The cursor to set
+	 * @return The Cursor that was active, before setting the new one. It's up
+	 *         to the caller to remind it, to be able to restore it if
+	 *         necessary.
+	 * @see UploadPolicy#setCursor(Cursor)
+	 */
+	public Cursor setCursor(Cursor cursor);
+
+	/**
+	 * Sets the wait cursor on the current application (applet, executable...).
+	 * 
+	 * @return The cursor that was active before the call to this method
+	 * @see UploadPolicy#setCursor(Cursor)
+	 */
+	public Cursor setWaitCursor();
+
+	/**
+	 * Displays a message in the status window.
+	 * 
+	 * @param status
+	 */
+	public void showStatus(String status);
+
+	/*
+	 * **************************************************************************
+	 * **************** PARAMETERS MANAGEMENT
+	 * *************************************************************************
+	 */
+
+	/**
+	 * Get a String parameter value from applet properties or System properties.
+	 * 
+	 * @param key
+	 *            The name of the parameter to fetch.
+	 * @param def
+	 *            A default value which is used, when the specified parameter is
+	 *            not set.
+	 * @return The value of the applet parameter (resp. system property). If the
+	 *         parameter was not specified or no such system property exists,
+	 *         returns the given default value.
+	 */
+	public String getParameter(String key, String def);
+
+	/**
+	 * Get a String parameter value from applet properties or System properties.
+	 * 
+	 * @param key
+	 *            The parameter name
+	 * @param def
+	 *            The default value
+	 * @return the parameter value, or the default, if the system is not set.
+	 */
+	public int getParameter(String key, int def);
+
+	/**
+	 * Get a String parameter value from applet properties or System properties.
+	 * 
+	 * @param key
+	 *            The parameter name
+	 * @param def
+	 *            The default value
+	 * @return the parameter value, or the default, if the system is not set.
+	 */
+	public float getParameter(String key, float def);
+
+	/**
+	 * Get a String parameter value from applet properties or System properties.
+	 * 
+	 * @param key
+	 *            The parameter name
+	 * @param def
+	 *            The default value
+	 * @return the parameter value, or the default, if the system is not set.
+	 */
+	public long getParameter(String key, long def);
+
+	/**
+	 * Get a boolean parameter value from applet properties or System
+	 * properties.
+	 * 
+	 * @param key
+	 *            The parameter name
+	 * @param def
+	 *            The default value
+	 * @return the parameter value, or the default, if the system is not set.
+	 */
+	public boolean getParameter(String key, boolean def);
+
+	/**
+	 * This function try to parse value as an integer. If value is not a correct
+	 * integer, def is returned.
+	 * 
+	 * @param value
+	 *            The string value, that must be parsed
+	 * @param def
+	 *            The default value
+	 * @return The integer value of value, or def if value is not valid.
+	 */
+	public int parseInt(String value, int def);
+
+	/**
+	 * This function try to parse value as a float number. If value is not a
+	 * correct float, def is returned.
+	 * 
+	 * @param value
+	 *            The string value, that must be parsed
+	 * @param def
+	 *            The default value
+	 * @return The float value of value, or def if value is not valid.
+	 */
+	public float parseFloat(String value, float def);
+
+	/**
+	 * This function try to parse value as a Long. If value is not a correct
+	 * long, def is returned.
+	 * 
+	 * @param value
+	 *            The string value, that must be parsed
+	 * @param def
+	 *            The default value
+	 * @return The integer value of value, or def if value is not valid.
+	 */
+	public long parseLong(String value, long def);
+
+	/**
+	 * This function try to parse value as a boolean. If value is not a correct
+	 * boolean, def is returned.
+	 * 
+	 * @param value
+	 *            The new value for this property. If invalid, the default value
+	 *            is used.
+	 * @param def
+	 *            The default value: used if value is invalid.
+	 * @return The boolean value of value, or def if value is not a valid
+	 *         boolean.
+	 */
+	public boolean parseBoolean(String value, boolean def);
+
+	/*
+	 * **************************************************************************
+	 * **************** TECHNICAL MANAGEMENT
+	 * *************************************************************************
+	 */
+
+	/**
+	 * This method allows to read the navigator cookies. These items will be
+	 * added as headers, in the given Vector.
+	 * 
+	 * @param headers
+	 *            The headers, coming from {@link DefaultUploadPolicy}
+	 */
+	public void readCookieFromNavigator(Vector<String> headers);
+
+	/**
+	 * This method allows to read the navigator userAgent. It will be added as
+	 * headers, in the given Vector.
+	 * 
+	 * @param headers
+	 *            The headers, coming from {@link DefaultUploadPolicy}
+	 */
+	public void readUserAgentFromNavigator(Vector<String> headers);
+
+	/**
+	 * Generates a valid URL, from a String. The generation may add the
+	 * documentBase of the applet.
+	 * 
+	 * @param url
+	 *            A url. Can be a path relative to the current one.
+	 * @return The normalized URL
+	 * @throws JUploadException
+	 */
+	public String normalizeURL(String url) throws JUploadException;
+
+	/**
+	 * Register a callback to be executed during applet termination.
+	 * 
+	 * @param object
+	 *            The Object instance to be registered
+	 * @param method
+	 *            The Method of that object to be registered. The method must be
+	 *            of type void and must not take any parameters and must be
+	 *            public.
+	 */
+	public void registerUnload(Object object, String method);
+
+	/**
+	 * Runs all callback that must be called when releasing the applet.
+	 */
+	public void runUnload();
+
+	/**
+	 * This allow runtime modifications of properties, from javascript.
+	 * Currently, this can only be used after full initialization. This method
+	 * only calls the UploadPolicy.setProperty method. <BR>
+	 * Ex: document.jupload.setProperty(prop, value);
+	 * 
+	 * @param prop
+	 *            The property name that must be set.
+	 * @param value
+	 *            The value of this property.
+	 */
+	public void setProperty(String prop, String value);
+
+	/**
+	 * Public method that can be called by Javascript to start upload
+	 * 
+	 * @return Returns the upload result. See the constants defined in the
+	 *         {@link JavascriptHandler} javadoc.
+	 */
+	public String startUpload();
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/context/JavascriptHandler.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/context/JavascriptHandler.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/context/JavascriptHandler.java	(revision 3951)
@@ -0,0 +1,181 @@
+/*
+ * $Id$
+ */
+
+/*
+ * Copyright (C) 2008 Ed Huott This program is free software; you can
+ * redistribute it and/or modify it under the terms of the GNU General Public
+ * License as published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version. This program is distributed
+ * in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even
+ * the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received
+ * a copy of the GNU General Public License along with this program; if not,
+ * write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ */
+
+package wjhk.jupload2.context;
+
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Separate thread spawned by the (signed) applet at initialization time so it
+ * will run in a context with the same privileges. Does nothing but wait to be
+ * notified of the presence of a command to be executed in the jsCommand String
+ * variable.
+ */
+public class JavascriptHandler extends Thread {
+
+    /**
+     * Command code, for upload.
+     */
+    public final static String COMMAND_START_UPLOAD = "startUpload";
+
+    /**
+     * One return code for doCommand: indicates that the thread is busy, and can
+     * execute this command.
+     */
+    public final static String RETURN_BUSY = "busy";
+
+    /**
+     * One return code for doCommand: indicates that the thread is busy, and can
+     * execute this command.
+     */
+    public final static String RETURN_STARTED = "started";
+
+    /**
+     * Reference to the current upload policy.
+     */
+    private UploadPolicy uploadPolicy = null;
+
+    /**
+     * Reference to the main panel of the applet.
+     */
+    private JUploadPanel jUploadPanel = null;
+
+    /**
+     * The current command, or null if the thread is not currently running
+     * command.
+     */
+    private String jsCommand = null;
+
+    /**
+     * Constructor for JavascriptHandler
+     * 
+     * @param uploadPolicy The current upload policy. Used for debug output.
+     * @param theJUploadPanel Whose methods will will be invoked in order to
+     *            execute the received commands
+     */
+    public JavascriptHandler(UploadPolicy uploadPolicy,
+            JUploadPanel theJUploadPanel) {
+        this.uploadPolicy = uploadPolicy;
+        this.jUploadPanel = theJUploadPanel;
+
+        setName(this.getClass().getName());
+
+        // This thread will close as soon as the applet is closed:
+        setDaemon(true);
+    }
+
+    /**
+     * Method for passing a command (String) to be executed (asynchronously) by
+     * the run() method of this object's thread. Commands are accepted only if
+     * there is no previous command still executing. (Commands are not queued.)
+     * Return value indicates if command was successfully submitted.
+     * 
+     * @param command
+     * @return the command string argument on success, empty string on failure.
+     */
+    public synchronized String doCommand(String command) {
+        if (this.jsCommand != null) {
+            // The previous command not yet finished, we do nothing, and
+            // indicate it.
+            return RETURN_BUSY;
+        }
+
+        this.jsCommand = command;
+        this.uploadPolicy.displayDebug(
+                "JavascriptHandler - doCommand(): jsCommand is: ["
+                        + this.jsCommand + "]", 30);
+
+        // send notify() to waiting thread so that command gets executed.
+        this.notify();
+
+        // The job will go on.
+        return RETURN_STARTED;
+    }
+
+    /**
+     * Synchronized method allows for safely accessing jsCommand string. The
+     * command is cleared before returning. This avoid conflicts, and let any
+     * other thread to set the next command, while managing this one.
+     * 
+     * @return Returns the current command.
+     */
+    synchronized String getAndClearCommand() {
+        this.uploadPolicy.displayDebug("getCommand(): jsCommand is: ["
+                + this.jsCommand + "]", 30);
+        String curCommand = this.jsCommand;
+        clearCommand();
+        return curCommand;
+    }
+
+    /**
+     * Synchronized method allows for safely clearing jsCommand string
+     */
+    public synchronized void clearCommand() {
+        this.jsCommand = null;
+        this.uploadPolicy.displayDebug("clearCommand(): jsCommand is: ["
+                + this.jsCommand + "]", 30);
+    }
+
+    /**
+     * Synchronized method to enable call to wait()
+     * 
+     * @throws InterruptedException
+     */
+    public synchronized void doWait() throws InterruptedException {
+        wait();
+    }
+
+    /**
+     * Method to run when thread is started.
+     */
+    @Override
+    public void run() {
+        // Run in continuous loop waiting for commands to execute
+        while (true) {
+            try {
+                // simply wait to be notified that a command is ready to run
+                doWait();
+                this.uploadPolicy.displayDebug("run(): Exited doWait()...", 50);
+
+                // handle new command
+                String curCommand = getAndClearCommand();
+                if (curCommand != null) {
+                    if (curCommand.equals(COMMAND_START_UPLOAD)) {
+                        // start the upload
+                        this.uploadPolicy.displayDebug(
+                                "run(): Calling doStartUpload()", 50);
+                        this.jUploadPanel.doStartUpload();
+                    } else {
+                        this.uploadPolicy
+                                .displayWarn("run(): unknown command in jsHandler ("
+                                        + curCommand + ")");
+                    }
+                }
+            } catch (Exception e) {
+                // We log everything that happens here.
+                this.uploadPolicy.displayWarn("Exception: [" + e.getMessage()
+                        + "]");
+                // But interruption is a valid exception: let's quit.
+                if (e instanceof InterruptedException) {
+                    break;
+                }
+            }
+        }
+    } // run()
+
+} // class JavascriptHandler
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextExecutable.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextExecutable.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextExecutable.java	(revision 3951)
@@ -0,0 +1,304 @@
+//
+// $Id: JUploadApplet.java 750 2009-05-06 14:36:50Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-05-06 16:36:50 +0200 (mer., 06 mai 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.context;
+
+import java.awt.Cursor;
+import java.io.IOException;
+import java.io.InputStream;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLConnection;
+import java.util.Properties;
+import java.util.Vector;
+
+import javax.swing.JApplet;
+import javax.swing.JFrame;
+
+import wjhk.jupload2.JUploadDaemon;
+import wjhk.jupload2.exception.JUploadException;
+
+/**
+ * Implementation of the {@link JUploadContext}, for an executable, that is: for
+ * a stand alone application. One such context is created at run time. Its main
+ * capabilities, is to load the properties either by a file in the jar file (see
+ * DAEMON_PROPERTIES_FILE), or an URL given to the
+ * {@link JUploadDaemon#main(String[])} method.
+ * 
+ * @see DefaultJUploadContext
+ * @see JUploadDaemon
+ * @author etienne_sf
+ * @version $Revision: 750 $
+ */
+public class JUploadContextExecutable extends DefaultJUploadContext {
+
+    final static String DEFAULT_PROPERTIES_FILE = "/conf/default_daemon.properties";
+
+    final static String DAEMON_PROPERTIES_FILE = "/conf/daemon.properties";
+
+    /**
+     * The main window of the application.
+     */
+    private JFrame jframe = null;
+
+    /**
+     * Content of the /conf/default_deamon.properties file. These value override
+     * default value, that would be wrong values for the daemon standalone
+     * application.
+     */
+    protected Properties defaultProperties = null;
+
+    /**
+     * Content of the /conf/_deamon.properties file. These value are the
+     * properties given to parameterize the daemon, according to the specific
+     * needs of the project.
+     */
+    protected Properties daemonProperties = null;
+
+    /**
+     * This constructor does nothing. It should be used by test case only.
+     */
+    protected JUploadContextExecutable(JFrame jframe) {
+        if (jframe == null) {
+            throw new IllegalArgumentException("theApplet may not be null");
+        }
+        this.jframe = jframe;
+    }
+
+    /**
+     * The constructor of the context, which needs the top level container to be
+     * created.
+     * 
+     * @param jframe The owner TopLevelWindow
+     * @param propertiesURL The URL where the configuration properties for the
+     *            daemon can be read. If null, the daemon try to read the
+     *            /conf/daemon.properties file, in the current jar.
+     */
+    public JUploadContextExecutable(JFrame jframe, String propertiesURL) {
+        if (jframe == null) {
+            throw new IllegalArgumentException("The jframe may not be null");
+        }
+        this.jframe = jframe;
+
+        // Load default properties
+        this.defaultProperties = loadPropertiesFromFileInJar(
+                DEFAULT_PROPERTIES_FILE, null);
+
+        // Load daemon properties: from the given URL or from the file.
+        if (propertiesURL == null) {
+            // No URL given. We load properties from the 'standard' file, in the
+            // jar.
+            this.daemonProperties = loadPropertiesFromFileInJar(
+                    DAEMON_PROPERTIES_FILE, this.defaultProperties);
+        } else {
+            // Let's load the properties from this URL.
+            this.daemonProperties = loadPropertiesFromURL(propertiesURL,
+                    this.defaultProperties);
+        }
+
+        // Now, we're ready. Let's initialize the DefaultJUploadContext.
+        init(jframe, this.jframe);
+    }
+
+    /**
+     * Creates and loads a property file, and return the loaded result.
+     * 
+     * @param filename The name of the file, which contains the properties to
+     *            load
+     * @param defaultProperties The default properties value. Put null if no
+     *            default Properties should be used.
+     * @return The loaded properties. It's empty if an error occurs.
+     */
+    Properties loadPropertiesFromFileInJar(String filename,
+            Properties defaultProperties) {
+        Properties properties = new Properties(defaultProperties);
+        try {
+            // TODO use this.getClass() ?
+            InputStream isProperties = Class.forName(
+                    "wjhk.jupload2.JUploadApplet")
+                    .getResourceAsStream(filename);
+            properties.load(isProperties);
+            isProperties.close();
+        } catch (IOException e1) {
+            System.out.println("Error while loading " + filename + " ("
+                    + e1.getClass().getName() + ")");
+            e1.printStackTrace();
+        } catch (ClassNotFoundException e1) {
+            System.out.println("Error while loading " + filename + " ("
+                    + e1.getClass().getName() + ")");
+            e1.printStackTrace();
+        }
+
+        return properties;
+    }
+
+    /**
+     * Creates and loads a property file, and return the loaded result.
+     * 
+     * @param propertiesURL The url that points to the properties configuration
+     *            file for the daemon.
+     * @param defaultProperties The default properties value. Put null if no
+     *            default Properties should be used.
+     * @return The loaded properties. It's empty if an error occurs.
+     */
+    private Properties loadPropertiesFromURL(String propertiesURL,
+            Properties defaultProperties) {
+        Properties properties = new Properties(defaultProperties);
+        URL url;
+        try {
+            url = new URL(propertiesURL);
+            URLConnection urlConnection = url.openConnection();
+            properties.load(urlConnection.getInputStream());
+        } catch (MalformedURLException e) {
+            System.out.println("Error while loading url " + propertiesURL
+                    + " (" + e.getClass().getName() + ")");
+            e.printStackTrace();
+        } catch (IOException e) {
+            System.out.println("Error while loading url " + propertiesURL
+                    + " (" + e.getClass().getName() + ")");
+            e.printStackTrace();
+        }
+
+        return properties;
+    }
+
+    /**
+     * Get a String parameter value from applet properties or System properties.
+     * 
+     * @param key The name of the parameter to fetch.
+     * @param def A default value which is used, when the specified parameter is
+     *            not set.
+     * @return The value of the applet parameter (resp. system property). If the
+     *         parameter was not specified or no such system property exists,
+     *         returns the given default value.
+     */
+    @Override
+    public String getParameter(String key, String def) {
+        String paramStr = (this.daemonProperties.getProperty(key) != null ? this.daemonProperties
+                .getProperty(key)
+                : def);
+        displayDebugParameterValue(key, paramStr);
+        return paramStr;
+    }
+
+    /** {@inheritDoc} */
+
+    @Override
+    public int getParameter(String key, int def) {
+        String paramDef = Integer.toString(def);
+        String paramStr = this.daemonProperties.getProperty(key) != null ? this.daemonProperties
+                .getProperty(key)
+                : paramDef;
+        displayDebugParameterValue(key, paramStr);
+        return parseInt(paramStr, def);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public float getParameter(String key, float def) {
+        String paramDef = Float.toString(def);
+        String paramStr = this.daemonProperties.getProperty(key) != null ? this.daemonProperties
+                .getProperty(key)
+                : paramDef;
+        displayDebugParameterValue(key, paramStr);
+        return parseFloat(paramStr, def);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public long getParameter(String key, long def) {
+        String paramDef = Long.toString(def);
+        String paramStr = this.daemonProperties.getProperty(key) != null ? this.daemonProperties
+                .getProperty(key)
+                : paramDef;
+        displayDebugParameterValue(key, paramStr);
+        return parseLong(paramStr, def);
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public boolean getParameter(String key, boolean def) {
+        String paramDef = (def ? "true" : "false");
+        String paramStr = this.daemonProperties.getProperty(key) != null ? this.daemonProperties
+                .getProperty(key)
+                : paramDef;
+        displayDebugParameterValue(key, paramStr);
+        return parseBoolean(paramStr, def);
+    }// getParameter(boolean)
+
+    /** {@inheritDoc} */
+    @Override
+    public void displayURL(String url, boolean success) {
+        throw new UnsupportedOperationException(
+                "JUploadContextExecution.displayURL(): Not implemented yet!");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public JApplet getApplet() {
+        throw new UnsupportedOperationException(
+                "Can't use getApplet(), when using the JUploadDaemon!");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Cursor getCursor() {
+        return this.jframe.getCursor();
+    }
+
+    /**
+     * This class doesn't control the URL. It expects it to be already
+     * normalized. No work here. {@inheritDoc}
+     */
+    @Override
+    public String normalizeURL(String url) throws JUploadException {
+        return url;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void readCookieFromNavigator(Vector<String> headers) {
+        throw new UnsupportedOperationException(
+                "Can't use readCookieFromNavigator(), when using the JUploadDaemon!");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void readUserAgentFromNavigator(Vector<String> headers) {
+        throw new UnsupportedOperationException(
+                "Can't use readUserAgentFromNavigator(), when using the JUploadDaemon!");
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public Cursor setCursor(Cursor cursor) {
+        Cursor previousCursor = this.jframe.getCursor();
+        this.jframe.setCursor(cursor);
+        return previousCursor;
+    }
+
+    /** {@inheritDoc} */
+    @Override
+    public void showStatus(String status) {
+        // TODO Auto-generated method stub
+
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/context/DefaultJUploadContext.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/context/DefaultJUploadContext.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/context/DefaultJUploadContext.java	(revision 3951)
@@ -0,0 +1,868 @@
+// $Id: JUploadApplet.java 750 2009-05-06 14:36:50Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-05-06 16:36:50 +0200 (mer., 06 mai 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.context;
+
+import java.awt.Cursor;
+import java.awt.Frame;
+import java.io.InputStream;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.text.MessageFormat;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+import java.util.Locale;
+import java.util.Properties;
+import java.util.Vector;
+
+import javax.swing.JApplet;
+import javax.swing.JOptionPane;
+import javax.swing.RootPaneContainer;
+import javax.swing.SwingUtilities;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.JUploadPanelImpl;
+import wjhk.jupload2.gui.JUploadTextArea;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.policies.UploadPolicyFactory;
+import wjhk.jupload2.upload.FileUploadManagerThread;
+
+/**
+ * The Jupload Context. One such context is created at run time. It can be the
+ * Applet, or the 'main' class, depending on the launch type. <BR>
+ * It contains the call to the creation of the
+ * {@link wjhk.jupload2.gui.JUploadPanel}, which contains the real code, and
+ * some technical stuff that depend on the technical context (mainly applet or
+ * stand alone application). <BR>
+ * The functional control of JUpload is done by using {@link UploadPolicy}. This
+ * class should not be changed, in order to remain compatible with next JUpload
+ * releases. <BR>
+ * <BR>
+ * <B>Technical note:</B> This class should be abstract. But it is used by the
+ * build.xml file, to load the version. So all methods of the
+ * {@link JUploadContext} interface are implemented. Those who actually can't be
+ * coded here, just generate a UnsupportedOperationException exception.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 750 $
+ */
+public class DefaultJUploadContext implements JUploadContext {
+
+	/**
+	 * The final that contains the SVN properties. These properties are
+	 * generated during compilation, by the build.xml ant file.
+	 */
+	private final static String SVN_PROPERTIES_FILENAME = "/conf/svn.properties";
+
+	/**
+	 * Used as default value when calling getProperty, to identify missing
+	 * properties, and have a correct behavior in this case.
+	 */
+	private final static String DEFAULT_PROP_UNKNOWN = "Unknown";
+
+	/**
+	 * The properties, created at build time, by the build.xml ant file. Or a
+	 * dummy property set, with 'unknown' values.
+	 */
+	Properties svnProperties = getSvnProperties();
+
+	/**
+	 * The frame that contains the application. Mainly used to attached modal
+	 * dialog.
+	 */
+	Frame frame = null;
+
+	/**
+	 * variable to hold reference to JavascriptHandler object
+	 */
+	JavascriptHandler jsHandler = null;
+
+	/**
+	 * the mime type list, coming from: http://www.mimetype.org/ Thanks to them!
+	 */
+	Properties mimeTypesProperties = null;
+
+	/**
+	 * The current upload policy. This class is responsible for the call to the
+	 * UploadPolicyFactory.
+	 */
+	UploadPolicy uploadPolicy = null;
+
+	/**
+	 * The JUploadPanel, which actually contains all the applet components.
+	 */
+	JUploadPanel jUploadPanel = null;
+
+	/**
+	 * The log messages should go there ...
+	 */
+	JUploadTextArea logWindow = null;
+
+	/**
+	 * This class represent the Callback method. It is then possible to run the
+	 * {@link JUploadContext#registerUnload(Object, String)} method to register
+	 * new callback methods. These callback methods are executed when the applet
+	 * or the application closes, by calling the
+	 * {@link JUploadContext#runUnload()} method.
+	 */
+	static class Callback {
+		private String method;
+
+		private Object object;
+
+		Callback(Object object, String method) {
+			this.object = object;
+			this.method = method;
+		}
+
+		void invoke() throws IllegalArgumentException, IllegalAccessException,
+				InvocationTargetException, SecurityException {
+			Object args[] = {};
+			Method methods[] = this.object.getClass().getMethods();
+			for (int i = 0; i < methods.length; i++) {
+				if (methods[i].getName().equals(this.method)) {
+					methods[i].invoke(this.object, args);
+				}
+			}
+		}
+
+		/**
+		 * @return the method
+		 */
+		public String getMethod() {
+			return method;
+		}
+
+		/**
+		 * @return the object
+		 */
+		public Object getObject() {
+			return object;
+		}
+
+	}
+
+	/**
+	 * All registered callbacks.
+	 * 
+	 * @see Callback
+	 */
+	List<Callback> unloadCallbacks = new ArrayList<Callback>(20);
+
+	/**
+	 * Reaction on the start of the applet: creation of each specific item of
+	 * the GUI, and the upload policy. <BR>
+	 * This method needs that the initialization of the called is finished. For
+	 * instance, {@link JUploadContextApplet} needs to have set theApplet, to be
+	 * able to properly execute some method calls that are in the init() method.
+	 * So we can not do this initialization in the constructor of
+	 * DefaultJUploadContext.
+	 * 
+	 * @param frame
+	 *            The frame that contains the application. Mainly used to
+	 *            attached modal dialog.
+	 * @param rootPaneContainer
+	 *            The mother window (JApplet, JFrame...), which contains the
+	 *            rootPaneContainer. Used to set the {@link JUploadPanel} in it.
+	 */
+	public void init(Frame frame, RootPaneContainer rootPaneContainer) {
+		try {
+			this.frame = frame;
+
+			// The standard thread name is: thread
+			// applet-wjhk.jupload2.JUploadApplet.class
+			// Too long ! :-)
+			Thread.currentThread().setName(
+					rootPaneContainer.getClass().getName());
+
+			// The logWindow must exist before the uploadPolicy creation. But it
+			// needs the uploadPolicy, to know the logging parameters. We'll set
+			// the uploadPolicy just after.
+			this.logWindow = new JUploadTextArea(20, 20, this.uploadPolicy);
+
+			// Now we can create the upload policy: the logWindow exists.
+			this.uploadPolicy = UploadPolicyFactory.getUploadPolicy(this);
+			this.uploadPolicy.displayDebug(
+					"After UploadPolicyFactory.getUploadPolicy(this)", 80);
+
+			// We set the uploadPolicy to the logWindow. The logThread starts,
+			// and it register its unload method, to be called when the JUpload
+			// finishes.
+			this.uploadPolicy.displayDebug(
+					"Before this.logWindow.setUploadPolicy(this.uploadPolicy)",
+					80);
+			this.logWindow.setUploadPolicy(this.uploadPolicy);
+
+			// getMainPanel().setLayout(new BorderLayout());
+			this.uploadPolicy
+					.displayDebug(
+							"Before new JUploadPanelImpl(this.logWindow,this.uploadPolicy)",
+							80);
+			this.jUploadPanel = new JUploadPanelImpl(this.logWindow,
+					this.uploadPolicy);
+
+			// getMainPanel().add(this.jUploadPanel, BorderLayout.CENTER);
+			this.uploadPolicy
+					.displayDebug(
+							"Before rootPaneContainer.setContentPane(this.jUploadPanel);",
+							80);
+			rootPaneContainer.setContentPane(this.jUploadPanel.getJComponent());
+
+			// We start the jsHandler thread, that allows javascript to send
+			// upload command to the applet.
+			this.uploadPolicy
+					.displayDebug(
+							"Before new JavascriptHandler(this.uploadPolicy, this.jUploadPanel)",
+							80);
+			this.jsHandler = new JavascriptHandler(this.uploadPolicy,
+					this.jUploadPanel);
+			this.jsHandler.start();
+			// Then we register the unload method, that'll be called like all
+			// unload callbacks when the applet is stopped.
+			registerUnload(this, "unload");
+		} catch (final Exception e) {
+			System.out.println(e.getMessage());
+			e.printStackTrace();
+			// TODO Translate this sentence
+			JOptionPane.showMessageDialog(null,
+					"Error during applet initialization!\nHave a look in your Java console ("
+							+ e.getClass().getName() + ")", "Error",
+					JOptionPane.ERROR_MESSAGE);
+		}
+
+		this.uploadPolicy.displayDebug("Before new Properties();", 80);
+		this.mimeTypesProperties = new Properties();
+		final String mimetypePropertiesFilename = "/conf/mimetypes.properties";
+		try {
+			InputStream isProperties = this.getClass().getResourceAsStream(
+					mimetypePropertiesFilename);
+			this.mimeTypesProperties.load(isProperties);
+			isProperties.close();
+			this.uploadPolicy.displayDebug("Mime types list loaded Ok ("
+					+ mimetypePropertiesFilename + ")", 50);
+		} catch (Exception e) {
+			this.uploadPolicy
+					.displayWarn("Unable to load the mime types list ("
+							+ mimetypePropertiesFilename + "): "
+							+ e.getClass().getName() + " (" + e.getMessage()
+							+ ")");
+		}
+
+		this.uploadPolicy.displayDebug("End of DefaultJUploadContext.init()",
+				80);
+	}
+
+	/**
+	 * This method is called when the applet is unloaded (actually, when it is
+	 * stopped). it is registered as a callback in the
+	 * {@link #init(Frame, RootPaneContainer)}, here above.
+	 */
+	public void unload() {
+		if (this.jsHandler != null && this.jsHandler.isAlive()) {
+			this.jsHandler.interrupt();
+			this.jsHandler = null;
+		}
+	}
+
+	/** {@inheritDoc} */
+	public String getDetailedVersionMessage() {
+		String version = getVersion();
+		String svnRevision = getSvnRevision();
+		boolean gotSvnRevision = !svnRevision.equals(DEFAULT_PROP_UNKNOWN);
+		int buildNumber = getBuildNumber();
+		boolean gotBuildNumber = buildNumber > 0;
+		String buildDate = getBuildDate();
+		boolean gotBuildDate = !buildDate.equals(DEFAULT_PROP_UNKNOWN);
+
+		StringBuffer sb = new StringBuffer();
+		sb.append(version);
+
+		if (gotSvnRevision || gotBuildNumber) {
+			sb.append(" [");
+			String space = "";
+			if (gotSvnRevision) {
+				sb.append("SVN-Rev: ");
+				sb.append(svnRevision);
+				space = " ";
+			}
+			if (gotBuildNumber) {
+				sb.append(space);
+				sb.append("build ");
+				sb.append(buildNumber);
+			}
+			sb.append("]");
+		}
+
+		if (gotBuildDate) {
+			sb.append(" - ");
+			sb.append(buildDate);
+		}
+		return sb.toString();
+	}
+
+	/** {@inheritDoc} */
+	public String getVersion() {
+		return getProperty("jupload.version", DEFAULT_PROP_UNKNOWN);
+	}
+
+	/** {@inheritDoc} */
+	public String getSvnRevision() {
+		String svnRevision = getProperty("jupload.svn.revision",
+				DEFAULT_PROP_UNKNOWN);
+		if (svnRevision.startsWith("{") || svnRevision.startsWith("${")) {
+			// This particular case should not happen with standard maven build.
+			// But it occurs when launching after an eclipse automatic build.
+			// Returning DEFAULT_PROP_UNKNOWN in this case, make the applet
+			// behave like if it was built by maven.
+			return DEFAULT_PROP_UNKNOWN;
+		} else {
+			return svnRevision;
+		}
+	}
+
+	/** {@inheritDoc} */
+	public String getLastModified() {
+		return getProperty("jupload.lastSrcDirModificationDate",
+				DEFAULT_PROP_UNKNOWN);
+	}
+
+	/** {@inheritDoc} */
+	public String getBuildDate() {
+		String timestamp = getProperty("jupload.buildTimestamp",
+				DEFAULT_PROP_UNKNOWN);
+		if (timestamp.equals(DEFAULT_PROP_UNKNOWN)) {
+			return DEFAULT_PROP_UNKNOWN;
+		} else {
+			Locale locale = Locale.getDefault();
+			if (this.uploadPolicy != null) {
+				locale = this.uploadPolicy.getLocale();
+			}
+			MessageFormat msgFormat = new MessageFormat("{0,date,medium}",
+					locale);
+			try {
+				Object[] args = { new Date(Long.parseLong(timestamp)) };
+				return msgFormat.format(args);
+			} catch (NumberFormatException e) {
+				// uploadPolicy is null at startup.
+				// TODO Better handling logging, here
+				System.out.println("[WARN] The timestamp can not be read ("
+						+ timestamp + "). Will return '" + DEFAULT_PROP_UNKNOWN
+						+ "'.");
+				return DEFAULT_PROP_UNKNOWN;
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	public int getBuildNumber() {
+		String valuePropBuildNumber = getProperty("jupload.buildNumber", "-1");
+		try {
+			return Integer.parseInt(valuePropBuildNumber);
+		} catch (java.lang.NumberFormatException e) {
+			System.out.println("[WARN] " + e.getClass().getName()
+					+ " when getting the buildNumber, while parsing '"
+					+ valuePropBuildNumber + "'). Will return -1");
+			return -1;
+		}
+	}
+
+	/**
+	 * Try to get a property from the loaded properties. If the property is not
+	 * available, the default value is returned.
+	 * 
+	 * @param propertyName
+	 * @param defaultValue
+	 * @return
+	 */
+	private String getProperty(String propertyName, String defaultValue) {
+		String value = null;
+		try {
+			value = this.svnProperties.getProperty(propertyName);
+		} catch (Exception e) {
+			System.out.println("[WARN] " + e.getClass().getName()
+					+ " when getting the " + propertyName + " property ("
+					+ e.getMessage() + "). Will return '" + value + "'");
+		}
+		return (value == null) ? defaultValue : value;
+	}
+
+	/** {@inheritDoc} */
+	public JUploadTextArea getLogWindow() {
+		return this.logWindow;
+	}
+
+	/** {@inheritDoc} */
+	public String getMimeType(String fileExtension) {
+		String mimeType = this.mimeTypesProperties.getProperty(fileExtension
+				.toLowerCase());
+		return (mimeType == null) ? "application/octet-stream" : mimeType;
+	}
+
+	/** {@inheritDoc} */
+	public JUploadPanel getUploadPanel() {
+		return this.jUploadPanel;
+	}
+
+	/**
+	 * Retrieves the current upload policy. The JUploadContext is responsible
+	 * for storing the UploadPolicy associated with the current instance.
+	 * 
+	 * @return the current upload policy of this instance.
+	 * @throws JUploadException
+	 */
+	public UploadPolicy getUploadPolicy() throws JUploadException {
+		return this.uploadPolicy;
+	}
+
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////:
+	// //////////////// FUNCTIONS INTENDED TO BE CALLED BY JAVASCRIPT FUNCTIONS
+	// ////////////////////////////:
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////:
+
+	/**
+	 * This allow runtime modifications of properties, from javascript.
+	 * Currently, this can only be used after full initialization. This method
+	 * only calls the UploadPolicy.setProperty method. <BR>
+	 * Ex: document.jupload.setProperty(prop, value);
+	 * 
+	 * @param prop
+	 *            The property name that must be set.
+	 * @param value
+	 *            The value of this property.
+	 */
+	public void setProperty(String prop, String value) {
+		// FIXME setProperty should use jsHandler
+		class PropertySetter implements Runnable {
+			String prop;
+
+			String value;
+
+			PropertySetter(String prop, String value) {
+				this.prop = prop;
+				this.value = value;
+			}
+
+			public void run() {
+				try {
+					// We'll wait up to 2s until the applet initialized (we need
+					// an
+					// upload policy).
+					// FIXME should be done in a separate thread (block the
+					// browser)
+					for (int i = 0; i < 20 && uploadPolicy == null; i += 1) {
+						this.wait(100);
+					}
+					if (uploadPolicy == null) {
+						System.out
+								.println("uploadPolicy is null. Impossible to set "
+										+ prop + " to " + value);
+					} else {
+						// FIXME There should be a boolean: initialized, to
+						// indicate when property may be set.
+						uploadPolicy.setProperty(prop, value);
+					}
+				} catch (Exception e) {
+					uploadPolicy.displayErr(e);
+				}
+			}
+		}
+		try {
+			SwingUtilities.invokeLater(new PropertySetter(prop, value));
+		} catch (Exception e) {
+			if (this.uploadPolicy != null) {
+				this.uploadPolicy.displayErr(e);
+			} else {
+				System.out.println(e.getClass().getName() + ": "
+						+ e.getMessage());
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	public String startUpload() {
+		return this.jsHandler.doCommand(JavascriptHandler.COMMAND_START_UPLOAD);
+	}
+
+	/**
+	 * Call to {@link UploadPolicy#displayErr(Exception)}
+	 * 
+	 * @param err
+	 *            The error text to be displayed.
+	 */
+	public void displayErr(String err) {
+		this.uploadPolicy.displayErr(err);
+	}
+
+	/**
+	 * Call to {@link UploadPolicy#displayInfo(String)}
+	 * 
+	 * @param info
+	 *            The info text to display
+	 */
+	public void displayInfo(String info) {
+		this.uploadPolicy.displayInfo(info);
+	}
+
+	/**
+	 * Call to {@link UploadPolicy#displayWarn(String)}
+	 * 
+	 * @param warn
+	 *            The error text to be displayed.
+	 */
+	public void displayWarn(String warn) {
+		this.uploadPolicy.displayWarn(warn);
+	}
+
+	/**
+	 * Call to {@link UploadPolicy#displayDebug(String, int)}
+	 * 
+	 * @param debug
+	 *            The debug message.
+	 * @param minDebugLevel
+	 *            The minimum level that debug level should have, to display
+	 *            this message. Values can go from 0 to 100.
+	 */
+	public void displayDebug(String debug, int minDebugLevel) {
+		this.uploadPolicy.displayDebug(debug, minDebugLevel);
+	}
+
+	// /////////////////////////////////////////////////////////////////////////
+	// ////////////////////// Helper functions
+	// /////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Helper function, to get the Revision number, if available. The applet
+	 * must be built from the build.xml ant file.
+	 * 
+	 * @return The svn properties
+	 */
+	public static Properties getSvnProperties() {
+		Properties properties = new Properties();
+		Boolean bPropertiesLoaded = false;
+
+		// Let's try to load the properties file.
+		// The upload policy is not created yet: we can not use its display
+		// methods to trace what is happening here.
+		try {
+			InputStream isProperties = Class.forName(
+					"wjhk.jupload2.JUploadApplet").getResourceAsStream(
+					SVN_PROPERTIES_FILENAME);
+			properties.load(isProperties);
+			isProperties.close();
+			bPropertiesLoaded = true;
+		} catch (Exception e) {
+			// An error occurred when reading the file. The applet was
+			// probably not built with the build.xml ant file.
+			// We'll create a fake property list. See below.
+
+			// We can not output to the uploadPolicy display method, as the
+			// upload policy is not created yet. We output to the system output.
+			// Consequence: if this doesn't work during build, you'll see an
+			// error during the build: the generated file name will contain the
+			// following error message.
+			System.out.println(e.getClass().getName()
+					+ " in DefaultJUploadContext.getSvnProperties() ("
+					+ e.getMessage() + ")");
+		}
+
+		// If we could not read the property file. The applet was probably not
+		// built with the build.xml ant file, we create a fake property list.
+		if (!bPropertiesLoaded) {
+			properties.setProperty("buildDate",
+					"Unknown build date (please use the build.xml ant script)");
+			properties
+					.setProperty("lastSrcDirModificationDate",
+							"Unknown last modification date (please use the build.xml ant script)");
+			properties.setProperty("revision",
+					"Unknown revision (please use the build.xml ant script)");
+		}
+		return properties;
+	}
+
+	/** {@inheritDoc} */
+	public void registerUnload(Object object, String method) {
+		// We insert each item at the beginning, so that the callbacks are
+		// called in the reverse order of the order in which they were
+		// registered.
+		// For instance: the removal of the log file is the first one to be
+		// registered ... and must be the last one to be executed.
+		this.unloadCallbacks.add(0, new Callback(object, method));
+	}
+
+	/** {@inheritDoc} */
+	public synchronized void runUnload() {
+		// If an upload is runing on, we have to stop it.
+		FileUploadManagerThread fileUploadManagerThread = this.getUploadPanel()
+				.getFileUploadManagerThread();
+		if (fileUploadManagerThread != null) {
+			fileUploadManagerThread.stopUpload();
+		}
+
+		// Then we call all unload callback.
+		for (Callback callback : this.unloadCallbacks) {
+			try {
+				callback.invoke();
+			} catch (Exception e) {
+				System.out.println(e.getClass().getName()
+						+ " while calling the callback: "
+						+ callback.getObject().getClass().getName() + "."
+						+ callback.getMethod());
+				e.printStackTrace();
+			}
+		}
+		this.unloadCallbacks.clear();
+	}
+
+	/**
+	 * Displays the debug information for the current parameter.
+	 */
+	void displayDebugParameterValue(String key, String value) {
+		if (this.uploadPolicy != null
+				&& this.uploadPolicy.getDebugLevel() >= 80) {
+			this.uploadPolicy.displayDebug("Parameter '" + key
+					+ "' loaded. Value: " + value, 80);
+		}
+	}
+
+	/** {@inheritDoc} */
+	public int parseInt(String value, int def) {
+		int ret = def;
+		// Then, parse it as an integer.
+		try {
+			ret = Integer.parseInt(value);
+		} catch (NumberFormatException e) {
+			ret = def;
+			if (this.uploadPolicy != null) {
+				this.uploadPolicy.displayWarn("Invalid int value: " + value
+						+ ", using default value: " + def);
+			}
+		}
+
+		return ret;
+	}
+
+	/** {@inheritDoc} */
+	public float parseFloat(String value, float def) {
+		float ret = def;
+		// Then, parse it as an integer.
+		try {
+			ret = Float.parseFloat(value);
+		} catch (NumberFormatException e) {
+			ret = def;
+			if (this.uploadPolicy != null) {
+				this.uploadPolicy.displayWarn("Invalid float value: " + value
+						+ ", using default value: " + def);
+			}
+		}
+
+		return ret;
+	}
+
+	/** {@inheritDoc} */
+	public long parseLong(String value, long def) {
+		long ret = def;
+		// Then, parse it as an integer.
+		try {
+			ret = Long.parseLong(value);
+		} catch (NumberFormatException e) {
+			ret = def;
+			if (this.uploadPolicy != null) {
+				this.uploadPolicy.displayWarn("Invalid long value: " + value
+						+ ", using default value: " + def);
+			}
+		}
+
+		return ret;
+	}
+
+	/** {@inheritDoc} */
+	public boolean parseBoolean(String value, boolean def) {
+		// Then, parse it as a boolean.
+		if (value.toUpperCase().equals("FALSE")) {
+			return false;
+		} else if (value.toUpperCase().equals("TRUE")) {
+			return true;
+		} else {
+			if (this.uploadPolicy != null) {
+				this.uploadPolicy.displayWarn("Invalid boolean value: " + value
+						+ ", using default value: " + def);
+			}
+			return def;
+		}
+	}
+
+	/**
+	 * @return The cursor that was active before the call to this method
+	 * @see JUploadContext#setCursor(Cursor)
+	 */
+	public Cursor setWaitCursor() {
+		return setCursor(new Cursor(Cursor.WAIT_CURSOR));
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param url
+	 * @param success
+	 */
+	public void displayURL(String url, boolean success) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @return Not used
+	 */
+	public JApplet getApplet() {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/** @see JUploadContext#getFrame() */
+	public Frame getFrame() {
+		return this.frame;
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @return Not used.
+	 */
+	public Cursor getCursor() {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param key
+	 * @param def
+	 * @return Not used
+	 */
+	public String getParameter(String key, String def) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param key
+	 * @param def
+	 * @return Not used
+	 */
+	public int getParameter(String key, int def) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param key
+	 * @param def
+	 * @return Not used
+	 */
+	public float getParameter(String key, float def) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param key
+	 * @param def
+	 * @return Not used
+	 */
+	public long getParameter(String key, long def) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param key
+	 * @param def
+	 * @return Not used
+	 */
+	public boolean getParameter(String key, boolean def) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param url
+	 * @return Not used
+	 * @throws JUploadException
+	 */
+	public String normalizeURL(String url) throws JUploadException {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param headers
+	 */
+	public void readCookieFromNavigator(Vector<String> headers) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.readCookieFromNavigator()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param headers
+	 */
+	public void readUserAgentFromNavigator(Vector<String> headers) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.readUserAgentFromNavigator()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param cursor
+	 * @return Not used
+	 */
+	public Cursor setCursor(Cursor cursor) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.setCursor()");
+	}
+
+	/**
+	 * Just throws a UnsupportedOperationException exception.
+	 * 
+	 * @param status
+	 */
+	public void showStatus(String status) {
+		throw new UnsupportedOperationException(
+				"DefaultJUploadContext.showStatus()");
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextApplet.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextApplet.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/context/JUploadContextApplet.java	(revision 3951)
@@ -0,0 +1,428 @@
+//
+// $Id: JUploadApplet.java 750 2009-05-06 14:36:50Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-05-06 16:36:50 +0200 (mer., 06 mai 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.context;
+
+import java.awt.Container;
+import java.awt.Cursor;
+import java.awt.Frame;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.util.Vector;
+import java.util.regex.Matcher;
+
+import javax.swing.JApplet;
+import javax.swing.JFileChooser;
+import javax.swing.JOptionPane;
+
+import netscape.javascript.JSException;
+import netscape.javascript.JSObject;
+import wjhk.jupload2.exception.JUploadException;
+
+/**
+ * Implementation of the Jupload Context, for an applet. One such context is
+ * created at run time.
+ * 
+ * @see DefaultJUploadContext
+ * @author etienne_sf
+ * @version $Revision: 750 $
+ */
+public class JUploadContextApplet extends DefaultJUploadContext {
+
+	/**
+	 * The current applet. All applet parameters are reading by using this
+	 * attribute.
+	 */
+	JApplet theApplet = null;
+
+	/**
+	 * The default constructor.
+	 * 
+	 * @param theApplet
+	 *            The applet is mandatory, to read the applet parameters.
+	 */
+	public JUploadContextApplet(JApplet theApplet) {
+		if (theApplet == null) {
+			throw new IllegalArgumentException("theApplet may not be null");
+		}
+		this.theApplet = theApplet;
+
+		// The applet must be signed !
+		checkAppletIsSigned();
+
+		// Let's initialize the DefaultJUploadContext.
+		init(findParentFrame(theApplet), theApplet);
+	}
+
+	/**
+	 * This method checks that the applet is signed. To do this, it just check
+	 * that the current folder is readable, and that the applet can create
+	 * temporary files. Should be enough.<BR>
+	 * If anyone has a better idea ... I'll be hapy to listen to it!
+	 */
+	void checkAppletIsSigned() {
+
+		// Let's be optimistic! ;-)
+		java.lang.SecurityException ex = null;
+		try {
+			// I found no way to directly get the current directory (access to
+			// user.xxx system properties is prohibited from within applets)
+			JFileChooser fc = new JFileChooser();
+			File currentDir = fc.getCurrentDirectory();
+			if (!currentDir.canRead()) {
+				ex = new java.lang.SecurityException(
+						"The applet must be signed (can't write in '"
+								+ currentDir.getAbsolutePath() + "')");
+			}
+
+			// Let's now check that the applet may create a temporary file. May
+			// be necessary for further processing, and for logging.
+			try {
+				File tmpTestFile = File.createTempFile("jupload", "test");
+				tmpTestFile.delete();
+			} catch (IOException ioe) {
+				String msg = ioe.getClass().getName()
+						+ ": Can't create temporary file (the applet is perhaps not signed (original error message: "
+						+ ioe.getMessage() + ")";
+				System.out.println(msg);
+				ex = new java.lang.SecurityException(msg, ioe);
+				ioe.printStackTrace();
+			}
+		} catch (java.lang.SecurityException e) {
+			String msg = "The applet must be signed (original error message: "
+					+ e.getMessage() + ")";
+			System.out.println(msg);
+			ex = new java.lang.SecurityException(msg, e);
+		}
+
+		if (ex != null) {
+			String msg = ex.getClass().getName() + " - " + ex.getMessage();
+			JOptionPane.showMessageDialog(null, msg, "Alert",
+					JOptionPane.ERROR_MESSAGE);
+			System.out.println(msg);
+			ex.printStackTrace();
+
+			throw ex;
+		}
+	}
+
+	/**
+	 * Find the JFrame which contains the applet
+	 * 
+	 * @param theApplet
+	 * @return
+	 */
+	private Frame findParentFrame(JApplet theApplet) {
+		Container c = theApplet;
+		while (c != null) {
+			if (c instanceof Frame)
+				return (Frame) c;
+
+			c = c.getParent();
+		}
+		return (Frame) null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public JApplet getApplet() {
+		return this.theApplet;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public String getParameter(String key, String def) {
+		String paramStr = (this.theApplet.getParameter(key) != null ? this.theApplet
+				.getParameter(key)
+				: def);
+		displayDebugParameterValue(key, paramStr);
+		return paramStr;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public int getParameter(String key, int def) {
+		String paramDef = Integer.toString(def);
+		String paramStr = this.theApplet.getParameter(key) != null ? this.theApplet
+				.getParameter(key)
+				: paramDef;
+		displayDebugParameterValue(key, paramStr);
+		return parseInt(paramStr, def);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public float getParameter(String key, float def) {
+		String paramDef = Float.toString(def);
+		String paramStr = this.theApplet.getParameter(key) != null ? this.theApplet
+				.getParameter(key)
+				: paramDef;
+		displayDebugParameterValue(key, paramStr);
+		return parseFloat(paramStr, def);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public long getParameter(String key, long def) {
+		String paramDef = Long.toString(def);
+		String paramStr = this.theApplet.getParameter(key) != null ? this.theApplet
+				.getParameter(key)
+				: paramDef;
+		displayDebugParameterValue(key, paramStr);
+		return parseLong(paramStr, def);
+	}// getParameter(int)
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean getParameter(String key, boolean def) {
+		String paramDef = (def ? "true" : "false");
+		String paramStr = this.theApplet.getParameter(key) != null ? this.theApplet
+				.getParameter(key)
+				: paramDef;
+		displayDebugParameterValue(key, paramStr);
+		return parseBoolean(paramStr, def);
+	}// getParameter(boolean)
+
+	/**
+	 * Loads cookies, and add them to the specific headers for upload requests.
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void readCookieFromNavigator(Vector<String> headers) {
+		String cookie = null;
+
+		try {
+			// Patch given by Stani: corrects the use of JUpload for
+			// Firefox on Mac.
+			cookie = (String) JSObject.getWindow(this.theApplet).eval(
+					"document.cookie");
+		} catch (JSException e) {
+			System.out.println("JSException (" + e.getClass() + ": "
+					+ e.getMessage()
+					+ ") in DefaultUploadPolicy, trying default values.");
+
+			// If we can't have access to the JS objects, we're in development :
+			// Let's put some 'hard value', to test the juploadContext from the
+			// development tool (mine is eclipse).
+
+			// felfert: I need different values so let's make that
+			// configurable...
+			cookie = System.getProperty("debug_cookie");
+
+			System.out
+					.println("  no navigator found, reading 'debug_cookie' from system properties ("
+							+ cookie + ")");
+			/*
+			 * Example of parameter when calling the JVM:
+			 * -Ddebug_cookie="Cookie:cpg146_data=
+			 * YTo0OntzOjI6IklEIjtzOjMyOiJhZGU3MWIxZmU4OTZjNThhZjQ5N2FiY2ZiNmFlZTUzOCI7czoyOiJhbSI7aToxO3M6NDoibGFuZyI7czo2OiJmcmVuY2giO3M6MzoibGl2IjthOjI6e2k6MDtOO2k6MTtzOjQ6IjE0ODgiO319
+			 * "
+			 */
+		}
+		// The cookies and user-agent will be added to the header sent by the
+		// juploadContext:
+		if (cookie != null)
+			headers.add("Cookie: " + cookie);
+	}
+
+	/**
+	 * Loads userAgent, and add it as a header to the specific headers for
+	 * upload requests. {@inheritDoc}
+	 */
+	@Override
+	public void readUserAgentFromNavigator(Vector<String> headers) {
+		String userAgent = null;
+
+		try {
+			// Patch given by Stani: corrects the use of JUpload for
+			// Firefox on Mac.
+			userAgent = (String) JSObject.getWindow(this.theApplet).eval(
+					"navigator.userAgent");
+		} catch (JSException e) {
+			System.out.println("JSException (" + e.getClass() + ": "
+					+ e.getMessage()
+					+ ") in DefaultUploadPolicy, trying default values.");
+
+			// If we can't have access to the JS objects, we're in development :
+			// Let's put some 'hard value', to test the juploadContext from the
+			// development tool (mine is eclipse).
+
+			// felfert: I need different values so let's make that
+			// configurable...
+			userAgent = System.getProperty("debug_agent");
+			System.out
+					.println("  no navigator found, reading 'debug_agent' from system properties ("
+							+ userAgent + ")");
+			/*
+			 * Example of parameter when calling the JVM:
+			 * -Ddebug_agent="userAgent: Mozilla/5.0 (Windows; U; Windows NT
+			 * 5.0; fr; rv:1.8.1.3) Gecko/20070309 Firefox/2.0.0.3"
+			 */
+		}
+		// The user-agent will be added to the header sent by the
+		// juploadContext:
+		if (userAgent != null)
+			headers.add("User-Agent: " + userAgent);
+
+	}
+
+	/**
+	 * @return The current cursor
+	 * @see JUploadContext#setCursor(Cursor)
+	 */
+	@Override
+	public Cursor getCursor() {
+		return this.theApplet.getCursor();
+	}
+
+	/** @see JUploadContext#setCursor(Cursor) */
+	@Override
+	public Cursor setCursor(Cursor cursor) {
+		Cursor previousCursor = this.theApplet.getCursor();
+		this.theApplet.setCursor(cursor);
+		return previousCursor;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void showStatus(String status) {
+		this.getUploadPanel().getStatusLabel().setText(status);
+	}
+
+	/**
+	 * @see JUploadContext#displayURL(String, boolean)
+	 */
+	@Override
+	public void displayURL(String url, boolean success) {
+		try {
+			if (url.toLowerCase().startsWith("javascript:")) {
+				// A JavaScript expression was specified. Execute it.
+				String expr = url.substring(11);
+
+				// Replacement of %msg%. Will do something only if the %msg%
+				// string exists in expr.
+				expr = expr.replaceAll("%msg%", Matcher
+						.quoteReplacement(jsString(getUploadPolicy()
+								.getLastResponseMessage())));
+
+				// Replacement of %body%. Will do something only if the
+				// %body% string exists in expr.
+				expr = expr.replaceAll("%body%", Matcher
+						.quoteReplacement(jsString(getUploadPolicy()
+								.getLastResponseBody())));
+
+				// Replacement of %success%. Will do something only if the
+				// %success% string exists in expr.
+				expr = expr.replaceAll("%success%", Matcher
+						.quoteReplacement((success) ? "true" : "false"));
+
+				displayDebug("Calling javascript expression: " + expr, 80);
+				JSObject.getWindow(this.theApplet).eval(expr);
+			} else if (success) {
+				// This is not a javascript URL: we change the current page
+				// only if no error occurred.
+				String target = getUploadPolicy().getAfterUploadTarget();
+				if (getUploadPolicy().getDebugLevel() >= 100) {
+					getUploadPolicy().alertStr(
+							"No switch to getAfterUploadURL, because debug level is "
+									+ getUploadPolicy().getDebugLevel()
+									+ " (>=100)");
+				} else {
+					// Let's change the current URL to edit names and
+					// comments, for the selected album. Ok, let's go and
+					// add names and comments to the newly updated pictures.
+					this.theApplet.getAppletContext().showDocument(
+							new URL(url), (null == target) ? "_self" : target);
+				}
+			}
+		} catch (Exception ee) {
+			// Oops, no navigator. We are probably in debug mode, within
+			// eclipse for instance.
+			try {
+				getUploadPolicy().displayErr(ee);
+			} catch (JUploadException e) {
+				// Can't use standard JUpload log mode...
+				ee.printStackTrace();
+			}
+		}
+	}
+
+	/**
+	 * Generates a valid URL, from a String. The generation may add the
+	 * documentBase of the applet.
+	 * 
+	 * @param url
+	 *            A url. Can be a path relative to the current one.
+	 * @return The normalized URL
+	 * @throws JUploadException
+	 */
+	@Override
+	public String normalizeURL(String url) throws JUploadException {
+		if (null == url || url.length() == 0)
+			return this.theApplet.getDocumentBase().toString();
+		URI uri = null;
+		try {
+			uri = new URI(url);
+			if (null == uri.getScheme())
+				uri = this.theApplet.getDocumentBase().toURI().resolve(url);
+			if (!uri.getScheme().equals("http")
+					&& !uri.getScheme().equals("https")
+					&& !uri.getScheme().equals("ftp")) {
+				throw new JUploadException("URI scheme " + uri.getScheme()
+						+ " not supported.");
+			}
+		} catch (URISyntaxException e) {
+			throw new JUploadException(e);
+		}
+		return uri.toString();
+	}
+
+	/**
+	 * Generate a js String, that can be written in a javascript expression.
+	 * It's up to the caller to put the starting and ending quotes. The double
+	 * quotes are replaced by simple quotes (to let simple quotes unchanged, as
+	 * it may be used in common language). Thus, start and end of JS string
+	 * should be with double quotes, when using the return of this function.
+	 * 
+	 * @param s
+	 * @return The transformed string, that can be written in the output, into a
+	 *         javascript string. It doesn't contain the starting and ending
+	 *         double quotes.
+	 */
+	public String jsString(String s) {
+		String dollarReplacement = Matcher.quoteReplacement("\\$");
+		String singleQuoteReplacement = Matcher.quoteReplacement("\\'");
+		String linefeedReplacement = Matcher.quoteReplacement("\\n");
+
+		if (s == null || s.equals("")) {
+			return "";
+		} else {
+			s = s.replaceAll("\\$", dollarReplacement);
+			s = s.replaceAll("\"", "'");
+			s = s.replaceAll("'", singleQuoteReplacement);
+			s = s.replaceAll("\n", linefeedReplacement);
+			s = s.replaceAll("\r", "");
+			return s;
+		}
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanel.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanel.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanel.java	(revision 3951)
@@ -0,0 +1,144 @@
+//
+// $Id: FilePanel.java 1386 2010-08-17 11:32:33Z postb99 $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-08-17 08:32:33 -0300 (Ter, 17 Ago 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.Point;
+import java.io.File;
+
+import javax.swing.ActionMap;
+import javax.swing.JComponent;
+import javax.swing.TransferHandler;
+
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadPanel;
+
+/**
+ * Defines the interface used in the applet, when dealing with the file panel.
+ */
+public interface FilePanel {
+
+    /**
+     * Add multiple files to this panel.
+     * 
+     * @param f An array of files to add.
+     * @param root The top level of a directory hierarchy to add
+     */
+    public void addFiles(File[] f, File root);
+
+    /**
+     * Retrieve all currently stored files.
+     * 
+     * @return an array of files, currently managed by this instance.
+     */
+    public FileData[] getFiles();
+
+    /**
+     * Retrieve the number of file entries in the JTable.
+     * 
+     * @return the current number of files, held by this instance.
+     */
+    public int getFilesLength();
+
+    /**
+     * Removes all currently selected file entries.
+     */
+    public void removeSelected();
+
+    /**
+     * Removes all file entries.
+     */
+    public void removeAll();
+
+    /**
+     * Remove a specified file entry.
+     * 
+     * @param fileData The file to be removed.
+     */
+    public void remove(FileData fileData);
+
+    /**
+     * Clears the current selection of the JTable.
+     */
+    public void clearSelection();
+
+    /**
+     * Requests focus for the JTable.
+     */
+    public void focusTable();
+
+    /**
+     * Ask for the file contained below the specific point on the screen.
+     * 
+     * @param point The point
+     * @return The return instance of File.
+     */
+    public FileData getFileDataAt(Point point);
+
+    /**
+     * Return the component on which drop event can occur. Used by
+     * {@link JUploadPanel}, when initializing the DropTarget.
+     * 
+     * @return The drop component target
+     */
+    public Component getDropComponent();
+
+    /**
+     * Transfer handler, to manage copy/paste operations.
+     * 
+     * @param newHandler
+     * @see JComponent#setTransferHandler(TransferHandler)
+     */
+    public void setTransferHandler(TransferHandler newHandler);
+
+    /**
+     * Allows to get standard action map, like paste action.
+     * 
+     * @return Get the current actionMap
+     * @see JComponent#getActionMap()
+     */
+    public ActionMap getActionMap();
+
+    /**
+     * Set color of files list grid border.
+     * @param color awt Color
+     */
+    public void setGridBorderColor(Color color);
+
+    /**
+     * Set back color of table header
+     * @param color awt Color
+     */
+    public void setTableHeaderBackColor(Color color);
+
+    /**
+     * Set text color of table header
+     * @param color awt Color
+     */
+    public void setTableHeaderTextColor(Color color);
+
+    /**
+     * Set table header text font
+     * @param color awt Color
+     */
+    public void setTableHeaderFont(Font font);
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelJTable.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelJTable.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelJTable.java	(revision 3951)
@@ -0,0 +1,203 @@
+//
+// $Id: FilePanelJTable.java 95 2007-05-02 03:27:05 +0000 (mer., 02 mai 2007)
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-02-09 08:32:18 -0200 (Ter, 09 Fev 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Cursor;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+import java.util.Date;
+
+import javax.swing.JTable;
+import javax.swing.ListSelectionModel;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.table.JTableHeader;
+import javax.swing.table.TableColumnModel;
+
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class is the JTable that display file information to the users. Data is
+ * handled by the wjhk.jupload2.gui.FilePanelDataModel2 class.
+ */
+public class FilePanelJTable extends JTable implements MouseListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 5422667664740339798L;
+
+    protected int sortedColumnIndex = -1;
+
+    protected boolean sortedColumnAscending = true;
+
+    // The current UploadPolicy
+    UploadPolicy uploadPolicy;
+
+    // The current DataModel
+    FilePanelDataModel2 filePanelDataModel;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param jup The parent upload panel.
+     * @param uploadPolicy The policy for retrieval of various settings.
+     */
+    public FilePanelJTable(JUploadPanel jup, UploadPolicy uploadPolicy) {
+        this.uploadPolicy = uploadPolicy;
+
+        setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+        setDefaultRenderer(Long.class, new SizeRenderer(uploadPolicy));
+        setDefaultRenderer(Date.class, new DateRenderer(uploadPolicy));
+        setDefaultRenderer(String.class, new NameRenderer());
+
+        // setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
+
+        JTableHeader header = getTableHeader();
+        header.setDefaultRenderer(new SortHeaderRenderer());
+        // We add the mouse listener on the header (to manage column sorts) and
+        // on the main part (to manage the contextual popup menu)
+        header.addMouseListener(this);
+        addMouseListener(jup.getMouseListener());
+    }
+
+    /**
+     * Set the model. Forces the model to be a FilePanelDataModel2. This method
+     * calls the {@link JTable#setModel(javax.swing.table.TableModel)} method.
+     * 
+     * @param filePanelDataModel
+     */
+    public void setModel(FilePanelDataModel2 filePanelDataModel) {
+        super.setModel(filePanelDataModel);
+        this.filePanelDataModel = filePanelDataModel;
+    }
+
+    /**
+     * Retrieve the currently sorted column.
+     * 
+     * @return the index of the currently sorted column.
+     */
+    public int getSortedColumnIndex() {
+        return this.sortedColumnIndex;
+    }
+
+    /**
+     * Retrieve the current sort order.
+     * 
+     * @return true, if the current sort order is ascending, false otherwise.
+     */
+    public boolean isSortedColumnAscending() {
+        return this.sortedColumnAscending;
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
+     */
+    public void mouseReleased(MouseEvent event) {
+        // Displays the contextual menu ?
+        this.uploadPolicy.getContext().getUploadPanel().maybeOpenPopupMenu(
+                event);
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
+     */
+    public void mousePressed(MouseEvent event) {
+        // Displays the contextual menu ?
+        this.uploadPolicy.getContext().getUploadPanel().maybeOpenPopupMenu(
+                event);
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+     */
+    public void mouseClicked(MouseEvent event) {
+        // Is this a double-click ?
+        if (event.getClickCount() == 2) {
+            // Let's open the 'big' preview, if we're in picture mode.
+            // We should have one selected row. Let's check it, you never knows
+            // ! ;-)
+            int selectedRow = getSelectedRow();
+            if (selectedRow >= 0) {
+                this.uploadPolicy.onFileSelected(this.filePanelDataModel
+                        .getFileDataAt(selectedRow));
+            }
+        } else if (!this.uploadPolicy.getContext().getUploadPanel()
+                .maybeOpenPopupMenu(event)) {
+            // We did not open the displays the contextual menu. So we do what
+            // we have to do: sort the clicked column
+            TableColumnModel colModel = getColumnModel();
+            int index = colModel.getColumnIndexAtX(event.getX());
+            int modelIndex = colModel.getColumn(index).getModelIndex();
+
+            FilePanelDataModel2 model = (FilePanelDataModel2) getModel();
+            if (model.isSortable(modelIndex)) {
+                if (this.sortedColumnIndex == index) {
+                    this.sortedColumnAscending = !this.sortedColumnAscending;
+                }
+                this.sortedColumnIndex = index;
+
+                model.sortColumn(modelIndex, this.sortedColumnAscending);
+            }
+        }
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+     */
+    public void mouseEntered(MouseEvent event) {
+        // Nothing to do.
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+     */
+    public void mouseExited(MouseEvent event) {
+        // Nothing to do.
+    }
+
+    /**
+     * @see javax.swing.JTable#valueChanged(javax.swing.event.ListSelectionEvent)
+     */
+    @Override
+    public void valueChanged(ListSelectionEvent e) {
+        super.valueChanged(e);
+        // Ignore extra messages, and no action before initialization.
+        if (e.getValueIsAdjusting() || this.uploadPolicy == null)
+            return;
+
+        //
+        ListSelectionModel lsm = (ListSelectionModel) e.getSource();
+        if (lsm.isSelectionEmpty()) {
+            this.uploadPolicy.onFileSelected(null);
+        } else {
+            int selectedRow = lsm.getMinSelectionIndex();
+            // if one file is selected, we let the current upload policy reacts.
+            // Otherwise, we don't do anything.
+            if (selectedRow == lsm.getMaxSelectionIndex()) {
+                Cursor previousCursor = this.uploadPolicy.setWaitCursor();
+                this.uploadPolicy.onFileSelected(this.filePanelDataModel
+                        .getFileDataAt(selectedRow));
+                this.uploadPolicy.setCursor(previousCursor);
+            }
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SizeRenderer.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SizeRenderer.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SizeRenderer.java	(revision 3951)
@@ -0,0 +1,169 @@
+//
+// $Id: JUploadApplet.java 88 2007-05-02 00:04:52Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-04-28
+// Creator: felfert
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Technical class, used to display file sizes. Used in
+ * {@link wjhk.jupload2.gui.filepanel.FilePanelJTable}.
+ * 
+ * @author felfert
+ * @version $Revision$
+ */
+public class SizeRenderer extends DefaultTableCellRenderer {
+
+	/** A generated serialVersionUID, to avoid warning during compilation */
+	private static final long serialVersionUID = -2029129064667754146L;
+
+	/**
+	 * The current upload policy
+	 */
+	private UploadPolicy uploadPolicy = null;
+
+	/** Size of one gigabyte, for file size display */
+	private static final double gB = 1024L * 1024L * 1024L;
+
+	/** Size of one megabyte, for file size display */
+	private static final double mB = 1024L * 1024L;
+
+	/** Size of one kilobyte, for file size display */
+	private static final double kB = 1024L;
+
+	/**
+	 * Creates a new instance.
+	 * 
+	 * @param uploadPolicy
+	 *            The policy to be used for providing the translated unit
+	 *            strings.
+	 */
+	public SizeRenderer(UploadPolicy uploadPolicy) {
+		super();
+		this.uploadPolicy = uploadPolicy;
+	}
+
+	/**
+	 * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
+	 *      java.lang.Object, boolean, boolean, int, int)
+	 */
+	@Override
+	public Component getTableCellRendererComponent(JTable table, Object value,
+			boolean isSelected, boolean hasFocus, int row, int column) {
+		Component cell = super.getTableCellRendererComponent(table, value,
+				isSelected, hasFocus, row, column);
+
+		if (value instanceof Long) {
+			setValue(formatFileSize(((Long) value).longValue(),
+					this.uploadPolicy));
+			super.setHorizontalAlignment(RIGHT);
+		} else if (value != null) {
+			// We have a value, but it's not a Long.
+			this.uploadPolicy
+					.displayWarn("value is not an instance of Long, in SizeRenderer.getTableCellRendererComponent(");
+		}
+		return cell;
+	}
+
+	// ////////////////////////////////////////////////////////////////////////////
+	// Various utilities for file size calculation
+	// ////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Format a number of bytes into a well formatted string, like 122mB.
+	 * 
+	 * @param fileUploadSpeedParam
+	 * @param uploadPolicy
+	 * @return The formatted file upload speed, to be displayed to the user
+	 */
+	public static String formatFileUploadSpeed(double fileUploadSpeedParam,
+			UploadPolicy uploadPolicy) {
+		String unit;
+		double fileUploadSpeed = fileUploadSpeedParam;
+		if (fileUploadSpeed >= gB) {
+			fileUploadSpeed /= gB;
+			unit = uploadPolicy.getLocalizedString("speedunit_gb_per_second");
+		} else if (fileUploadSpeed >= mB) {
+			fileUploadSpeed /= mB;
+			unit = uploadPolicy.getLocalizedString("speedunit_mb_per_second");
+		} else if (fileUploadSpeed >= kB) {
+			fileUploadSpeed /= kB;
+			unit = uploadPolicy.getLocalizedString("speedunit_kb_per_second");
+		} else {
+			unit = uploadPolicy.getLocalizedString("speedunit_b_per_second");
+		}
+
+		// TODO Use local as the first argument.
+		String value = String.format("%1$,3.2f %2$s", fileUploadSpeed, unit);
+		// TODO remove this temp log
+		if (uploadPolicy.getDebugLevel() >= 80 && value.contains("Infinity")) {
+			uploadPolicy.displayDebug("'" + value
+					+ "' for values: fileUploadSpeed=" + fileUploadSpeed
+					+ " and unit=" + unit, 80);
+		}
+		return value;
+
+	}
+
+	/**
+	 * Format a number of bytes of a file size (or a number of uploaded bytes,
+	 * or whatever), into a well formatted string, like 122mB.
+	 * 
+	 * @param fileSize
+	 * @param uploadPolicy
+	 * @return The formatted file size, to display to the user.
+	 */
+	public static String formatFileSize(double fileSize,
+			UploadPolicy uploadPolicy) {
+		final String sizeunit_gigabytes = uploadPolicy
+				.getLocalizedString("unitGigabytes");
+		final String sizeunit_megabytes = uploadPolicy
+				.getLocalizedString("unitMegabytes");
+		final String sizeunit_kilobytes = uploadPolicy
+				.getLocalizedString("unitKilobytes");
+		final String sizeunit_bytes = uploadPolicy
+				.getLocalizedString("unitBytes");
+		String unit;
+
+		double fileSizeToDisplay = fileSize;
+		if (fileSizeToDisplay >= gB) {
+			fileSizeToDisplay /= gB;
+			unit = sizeunit_gigabytes;
+		} else if (fileSizeToDisplay >= mB) {
+			fileSizeToDisplay /= mB;
+			unit = sizeunit_megabytes;
+		} else if (fileSizeToDisplay >= kB) {
+			fileSizeToDisplay /= kB;
+			unit = sizeunit_kilobytes;
+		} else {
+			unit = sizeunit_bytes;
+		}
+
+		return String.format("%1$,3.2f %2$s", fileSizeToDisplay, unit);
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/DateRenderer.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/DateRenderer.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/DateRenderer.java	(revision 3951)
@@ -0,0 +1,71 @@
+//
+// $Id: DateRenderer.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-01-08 20:21:44 -0200 (Sex, 08 Jan 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Component;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Technical class, used to display dates. Used in
+ * {@link wjhk.jupload2.gui.filepanel.FilePanelJTable}.
+ */
+public class DateRenderer extends DefaultTableCellRenderer {
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -7171473761133675782L;
+
+    private SimpleDateFormat df;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param uploadPolicy The policy to be used for providing the translated
+     *            format string.
+     */
+    public DateRenderer(UploadPolicy uploadPolicy) {
+        super();
+        this.df = new SimpleDateFormat(uploadPolicy
+                .getLocalizedString("dateformat"));
+    }
+
+    /**
+     * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
+     *      java.lang.Object, boolean, boolean, int, int)
+     */
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int column) {
+        Component cell = super.getTableCellRendererComponent(table, value,
+                isSelected, hasFocus, row, column);
+
+        if (value instanceof Date)
+            setValue(this.df.format(value));
+        super.setHorizontalAlignment(RIGHT);
+        return cell;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/ColumnComparator.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/ColumnComparator.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/ColumnComparator.java	(revision 3951)
@@ -0,0 +1,93 @@
+//
+// $Id: ColumnComparator.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-07-01 17:32:39 -0300 (Qua, 01 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.io.Serializable;
+import java.util.Comparator;
+
+import wjhk.jupload2.filedata.FileData;
+
+/**
+ * Technical class, used to sort rows in the
+ * wjhk.jupload2.gui.FilePanelDataModel2 class.
+ */
+public class ColumnComparator implements Comparator<FileData>, Serializable {
+
+    /** Unused SerialVerisonUID */
+    private static final long serialVersionUID = 1L;
+
+    protected int index;
+
+    protected boolean ascending;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param index The column index of the table data to be compared
+     * @param ascending Specifies the sort order.
+     */
+    public ColumnComparator(int index, boolean ascending) {
+        this.index = index;
+        this.ascending = ascending;
+    }
+
+    /**
+     * @param one
+     * @param two
+     * @return -1, 0 or 1, as usual.
+     * @see java.util.Comparator#compare(java.lang.Object, java.lang.Object)
+     */
+    @SuppressWarnings("unchecked")
+    public int compare(FileData one, FileData two) {
+        // if (one instanceof DefaultFileData && two instanceof DefaultFileData)
+        // {
+        Object oOne;
+        Object oTwo;
+        switch (this.index) {
+            case FilePanelDataModel2.COLINDEX_NAME:
+                oOne = (one).getFileName();
+                oTwo = (two).getFileName();
+                break;
+            case FilePanelDataModel2.COLINDEX_SIZE:
+                oOne = Long.valueOf((one).getFileLength());
+                oTwo = Long.valueOf((two).getFileLength());
+                break;
+            case FilePanelDataModel2.COLINDEX_DIRECTORY:
+                oOne = (one).getDirectory();
+                oTwo = (two).getDirectory();
+                break;
+            case FilePanelDataModel2.COLINDEX_MODIFIED:
+                oOne = (one).getLastModified();
+                oTwo = (two).getLastModified();
+                break;
+            default:
+                return 0;
+        }
+        if (oOne instanceof Comparable && oTwo instanceof Comparable) {
+            return ((Comparable) oOne).compareTo(oTwo)
+                    * (this.ascending ? 1 : -1);
+        }
+        // }
+        return 0;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/NameRenderer.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/NameRenderer.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/NameRenderer.java	(revision 3951)
@@ -0,0 +1,56 @@
+//
+// $Id: JUploadApplet.java 88 2007-05-02 00:04:52Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-04-28
+// Creator: felfert
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Component;
+
+import javax.swing.JTable;
+import javax.swing.table.DefaultTableCellRenderer;
+
+/**
+ * Technical class, used to add tooltips to names. Used in
+ * {@link wjhk.jupload2.gui.filepanel.FilePanelJTable}.
+ * 
+ * @author felfert
+ */
+public class NameRenderer extends DefaultTableCellRenderer {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -3096051530077250460L;
+
+    /**
+     * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
+     *      java.lang.Object, boolean, boolean, int, int)
+     */
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int column) {
+        Component cell = super.getTableCellRendererComponent(table, value,
+                isSelected, hasFocus, row, column);
+
+        if (value instanceof String) {
+            setToolTipText((String) value);
+        }
+        return cell;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortHeaderRenderer.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortHeaderRenderer.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortHeaderRenderer.java	(revision 3951)
@@ -0,0 +1,86 @@
+//
+// $Id: SortHeaderRenderer.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-07-02 11:49:12 -0300 (Qui, 02 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Component;
+
+import javax.swing.Icon;
+import javax.swing.JTable;
+import javax.swing.UIManager;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.JTableHeader;
+
+/**
+ * Technical class, to display the column headers, for column that may be
+ * sorted.
+ */
+public class SortHeaderRenderer extends DefaultTableCellRenderer {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -4104776293873798189L;
+
+    private static final Icon NONSORTED = new SortArrowIcon(SortArrowIcon.NONE);
+
+    private static final Icon ASCENDING = new SortArrowIcon(
+            SortArrowIcon.ASCENDING);
+
+    private static final Icon DESCENDING = new SortArrowIcon(
+            SortArrowIcon.DESCENDING);
+
+    /**
+     * Creates a new instance.
+     */
+    public SortHeaderRenderer() {
+        setHorizontalTextPosition(LEFT);
+        setHorizontalAlignment(CENTER);
+    }
+
+    /**
+     * @see javax.swing.table.DefaultTableCellRenderer#getTableCellRendererComponent(javax.swing.JTable,
+     *      java.lang.Object, boolean, boolean, int, int)
+     */
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value,
+            boolean isSelected, boolean hasFocus, int row, int col) {
+        int index = -1;
+        boolean ascending = true;
+        if (table instanceof FilePanelJTable) {
+            FilePanelJTable sortTable = (FilePanelJTable) table;
+            index = sortTable.getSortedColumnIndex();
+            ascending = sortTable.isSortedColumnAscending();
+        }
+        if (table != null) {
+            JTableHeader header = table.getTableHeader();
+            if (header != null) {
+                setForeground(header.getForeground());
+                setBackground(header.getBackground());
+                setFont(header.getFont());
+            }
+        }
+        Icon icon = ascending ? ASCENDING : DESCENDING;
+        setIcon(col == index ? icon : NONSORTED);
+        setText((value == null) ? "" : value.toString());
+        setBorder(UIManager.getBorder("TableHeader.cellBorder"));
+        return this;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortArrowIcon.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortArrowIcon.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/SortArrowIcon.java	(revision 3951)
@@ -0,0 +1,110 @@
+//
+// $Id: SortArrowIcon.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2008-12-03 06:57:11 -0200 (Qua, 03 Dez 2008) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Graphics;
+
+import javax.swing.Icon;
+
+/**
+ * Icon implementation, to control and indicate the current sort order, into the
+ * {@link wjhk.jupload2.gui.filepanel.FilePanelJTable}.
+ */
+public class SortArrowIcon implements Icon {
+    /**
+     * Don't draw an arrow.
+     */
+    public static final int NONE = 0;
+
+    /**
+     * Draw arrow, representing descending sort order.
+     */
+    public static final int DESCENDING = 1;
+
+    /**
+     * Draw arrow, representing ascending sort order.
+     */
+    public static final int ASCENDING = 2;
+
+    protected int direction;
+
+    protected int width = 8;
+
+    protected int height = 8;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param direction The desired direction, either {@link #ASCENDING},
+     *            {@link #DESCENDING} or {@link #NONE}
+     */
+    public SortArrowIcon(int direction) {
+        this.direction = direction;
+    }
+
+    /**
+     * @see javax.swing.Icon#getIconWidth()
+     */
+    public int getIconWidth() {
+        return this.width;
+    }
+
+    /**
+     * @see javax.swing.Icon#getIconHeight()
+     */
+    public int getIconHeight() {
+        return this.height;
+    }
+
+    /**
+     * @see javax.swing.Icon#paintIcon(java.awt.Component, java.awt.Graphics,
+     *      int, int)
+     */
+    public void paintIcon(Component c, Graphics g, int x, int y) {
+        final Color bg = c.getBackground();
+        final Color light = bg.brighter().brighter();
+        final Color shade = bg.darker().darker();
+
+        final int w = this.width;
+        final int h = this.height;
+        final int m = w / 2;
+        switch (this.direction) {
+            case ASCENDING:
+                g.setColor(shade);
+                g.drawLine(x, y, x + w, y);
+                g.drawLine(x, y, x + m, y + h);
+                g.setColor(light);
+                g.drawLine(x + w, y, x + m, y + h);
+                break;
+            case DESCENDING:
+                g.setColor(shade);
+                g.drawLine(x + m, y, x, y + h);
+                g.setColor(light);
+                g.drawLine(x, y + h, x + w, y + h);
+                g.drawLine(x + m, y, x + w, y + h);
+                break;
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelDataModel2.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelDataModel2.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelDataModel2.java	(revision 3951)
@@ -0,0 +1,395 @@
+//
+// $Id: FilePanelDataModel2.java 1399 2010-09-08 20:02:33Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-04-21
+// Creator: etienne_sf
+// Last modified: $Date: 2010-09-08 17:02:33 -0300 (Qua, 08 Set 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.filepanel;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.Date;
+import java.util.Iterator;
+import java.util.Vector;
+
+import javax.swing.table.AbstractTableModel;
+
+import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class replaces FilePanelDataModel. The data for each row is now
+ * contained in an instance of FileData (or one of its subclasses, like
+ * {@link wjhk.jupload2.filedata.PictureFileData}). This allow easy add of new
+ * functionalites, during upload, by adding attributes or methods to these
+ * classes, or create new ones. <BR>
+ * Some ides of improvements :
+ * <UL>
+ * <LI>Compression of picture before Upload (see
+ * {@link wjhk.jupload2.filedata.PictureFileData})
+ * <LI>Could be XML validation before sending to the server
+ * <LI>Up to your imagination...
+ * </UL>
+ */
+class FilePanelDataModel2 extends AbstractTableModel {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 1473262424494858913L;
+
+    /**
+     * The default colum indices of the columns, as displayed by the applet.
+     * Index of the column "Filename"
+     */
+    public final static int COLINDEX_NAME = 0;
+
+    /**
+     * The default colum indices of the columns, as displayed by the applet.
+     * Index of the column "Filename"
+     */
+    public final static int COLINDEX_SIZE = 1;
+
+    /**
+     * The default colum indices of the columns, as displayed by the applet.
+     * Index of the column "Filesize"
+     */
+    public final static int COLINDEX_DIRECTORY = 2;
+
+    /**
+     * The default colum indices of the columns, as displayed by the applet.
+     * Index of the column "Last modified"
+     */
+    public final static int COLINDEX_MODIFIED = 3;
+
+    /**
+     * The uploadPolicy contains all current parameter, including the
+     * FileDataParam
+     */
+    private UploadPolicy uploadPolicy = null;
+
+    /**
+     * The column names, as displayed on the applet. They are not real final
+     * values, as they are translated: we need to have an uploadPolicy for this
+     * translation, and the uploadPolicy is 'given' to the constructor.
+     */
+    private String COL_NAME = null;
+
+    private String COL_SIZE = null;
+
+    private String COL_DIRECTORY = null;
+
+    private String COL_MODIFIED = null;
+
+    protected String[] columnNames = null;
+
+    /**
+     * This array indicates, for each column, the percentage of the available
+     * width it should use. It's initialized in the constructor of this class.
+     * 
+     * @see #getColumnSize(int)
+     */
+    protected int[] columnSizePercentage = null;
+
+    protected Class<?> columnClasses[] = null;
+
+    /**
+     * This Vector contains all FileData.
+     */
+    private Vector<FileData> rows = new Vector<FileData>();
+
+    /**
+     * @param uploadPolicy
+     */
+    public FilePanelDataModel2(UploadPolicy uploadPolicy) {
+        // Property initialization is done ... for each property. Nothing to do
+        // here.
+        super();
+        //
+        this.uploadPolicy = uploadPolicy;
+
+        // Initialization for column name, type and size.
+        this.COL_NAME = uploadPolicy.getLocalizedString("colName");
+        this.COL_SIZE = uploadPolicy.getLocalizedString("colSize");
+        this.COL_DIRECTORY = uploadPolicy.getLocalizedString("colDirectory");
+        this.COL_MODIFIED = uploadPolicy.getLocalizedString("colModified");
+
+        this.columnNames = new String[] {
+                this.COL_NAME, this.COL_SIZE, this.COL_DIRECTORY,
+                this.COL_MODIFIED
+        };
+
+        // Initial size (before percentage) was: 150, 75, 199, 130, 75
+        //
+        this.columnSizePercentage = new int[] {
+                30, 13, 37, 20
+        };
+        // Check that the sum of the previous values is actually 100%
+        int total = 0;
+        for (int i = 0; i < this.columnSizePercentage.length; i += 1) {
+            total += this.columnSizePercentage[i];
+        }
+        if (total != 100) {
+            throw new java.lang.AssertionError("Total sum of '"
+                    + this.getClass().getName()
+                    + ".columnSizePercentage' should be 100% (but was " + total
+                    + ")");
+        }
+
+        this.columnClasses = new Class[] {
+                String.class, Long.class, String.class, Date.class,
+                Boolean.class
+        };
+    }
+
+    /**
+     * Does this table contain this file ?
+     * 
+     * @param file : the file that could be contained...
+     * @return true if the table contains this file.
+     */
+    public boolean contains(File file) {
+        boolean found = false;
+
+        synchronized (this.rows) {
+            Iterator<FileData> i = this.rows.iterator();
+            while (i.hasNext()) {
+                if (file.equals(i.next().getFile())) {
+                    found = true;
+                    break;
+                }
+            }
+        }// synchronized
+
+        return found;
+    }
+
+    /**
+     * Add a file to the panel (at the end of the list)
+     * 
+     * @param file
+     * @param root
+     * @throws JUploadExceptionStopAddingFiles
+     */
+    public void addFile(File file, File root)
+            throws JUploadExceptionStopAddingFiles {
+        synchronized (this.rows) {
+            if (contains(file)) {
+                this.uploadPolicy.displayWarn("File " + file.getName()
+                        + " already exists");
+            } else {
+                // We first call the upload policy, to get :
+                // - The correct fileData instance (for instance the
+                // PictureUploadPolicy returns a PictureFileData)
+                // - The reference to this newly FileData, or null if an error
+                // occurs (for instance: invalid file content, according to the
+                // current upload policy, or non allowed file extension).
+                FileData df = this.uploadPolicy.createFileData(file, root);
+                if (df != null) {
+                    // The file is Ok, let's add it.
+                    this.rows.add(df);
+                    fireTableDataChanged();
+                }
+            }
+        }
+    }
+
+    /**
+     * Ask for the file contained at specified row number.
+     * 
+     * @param row The row number
+     * @return The return instance of File.
+     */
+    public File getFileAt(int row) {
+        synchronized (this.rows) {
+            FileData fileData = this.rows.get(row);
+            return (fileData == null) ? null : fileData.getFile();
+        }
+    }
+
+    /**
+     * Ask for the file contained at specified row number.
+     * 
+     * @param row The row number
+     * @return The return instance of File.
+     */
+    public FileData getFileDataAt(int row) {
+        int size = -1;
+        if (row >= 0) {
+            try {
+                synchronized (this.rows) {
+                    size = this.rows.size();
+                    return (row < size) ? this.rows.get(row) : null;
+                }
+            } catch (ArrayIndexOutOfBoundsException e) {
+                // Nothing to do. It seems that it can occurs when upload is
+                // very
+                // fast (for instance: small files to localhost).
+                this.uploadPolicy.displayWarn(e.getClass().getName()
+                        + " in FilePanelDataModel2.getFileDataAt(" + row + ")");
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Remove a specified row.
+     * 
+     * @param row The row to remove.
+     */
+    public synchronized void removeRow(int row) {
+        synchronized (this.rows) {
+            this.rows.remove(row);
+            fireTableDataChanged();
+        }
+    }
+
+    /**
+     * Removes fileData from the current list. There should be only one.
+     * 
+     * @param fileData
+     */
+    public synchronized void removeRow(FileData fileData) {
+        boolean found = false;
+
+        synchronized (this.rows) {
+            Iterator<FileData> i = this.rows.iterator();
+            FileData item;
+            while (i.hasNext()) {
+                item = i.next();
+                if (item.getFile().equals(fileData.getFile())) {
+                    this.rows.removeElement(item);
+                    found = true;
+                    break;
+                }
+            }
+        }// synchronized(rows)
+
+        if (found) {
+            fireTableDataChanged();
+        }
+    }
+
+    /** @see javax.swing.table.TableModel#getColumnCount() */
+    public int getColumnCount() {
+        return this.columnNames.length;
+    }
+
+    /** @see javax.swing.table.TableModel#getRowCount() */
+    public int getRowCount() {
+        synchronized (this.rows) {
+            return this.rows.size();
+        }
+    }
+
+    /**
+     * Always return false here : no editable cell.
+     * 
+     * @see javax.swing.table.TableModel#isCellEditable(int, int)
+     */
+    @Override
+    public boolean isCellEditable(int arg0, int arg1) {
+        // No editable columns.
+        return false;
+    }
+
+    /**
+     * Sort the rows, according to one column.
+     * 
+     * @param col The index of the column to sort
+     * @param ascending true if ascending, false if descending.
+     */
+    public void sortColumn(int col, boolean ascending) {
+        synchronized (this.rows) {
+            Collections.sort(this.rows, new ColumnComparator(col, ascending));
+        }
+        fireTableDataChanged();
+    }
+
+    /**
+     * Return true if this column can be sorted.
+     * 
+     * @param col The index of the column which can sortable or not.
+     * @return true if the column can be sorted. false otherwise.
+     */
+    public boolean isSortable(int col) {
+        return (Boolean.class != getColumnClass(col));
+    }
+
+    /**
+     * @see javax.swing.table.TableModel#getColumnClass(int)
+     */
+    @SuppressWarnings("unchecked")
+    @Override
+    public Class getColumnClass(int arg0) {
+        return this.columnClasses[arg0];
+    }
+
+    /**
+     * @see javax.swing.table.TableModel#getValueAt(int, int)
+     */
+    public Object getValueAt(int row, int col) {
+        FileData fileData = getFileDataAt(row);
+        if (fileData != null) {
+            String colName = getColumnName(col);
+            // Don't know if it will be useful, but the switch below allows the
+            // column to be in any order.
+            if (colName.equals(this.COL_NAME)) {
+                return fileData.getFileName();
+            } else if (colName.equals(this.COL_SIZE)) {
+                return Long.valueOf(fileData.getFileLength());
+            } else if (colName.equals(this.COL_DIRECTORY)) {
+                return fileData.getDirectory();
+            } else if (colName.equals(this.COL_MODIFIED)) {
+                return fileData.getLastModified();
+            } else {
+                this.uploadPolicy.displayErr("Unknown column in "
+                        + this.getClass().getName() + ": " + colName);
+            }
+        }
+        return null;
+    }
+
+    /**
+     * This method doesn't do anything : no changeable values.
+     * 
+     * @see javax.swing.table.TableModel#setValueAt(java.lang.Object, int, int)
+     */
+    @Override
+    public void setValueAt(Object arg0, int arg1, int arg2) {
+        this.uploadPolicy.displayWarn(this.getClass().getName()
+                + ".setValueAt: no action");
+    }
+
+    /**
+     * @see javax.swing.table.TableModel#getColumnName(int)
+     */
+    @Override
+    public String getColumnName(int arg0) {
+        return this.columnNames[arg0];
+    }
+
+    /**
+     * Retrieves the default colum percentage size of a column, that is: its
+     * percentage of the available width.
+     * 
+     * @param col The index of the column to query.
+     * @return the default size of the requested column.
+     */
+    public int getColumnSizePercentage(int col) {
+        return this.columnSizePercentage[col];
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelTableImp.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelTableImp.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/filepanel/FilePanelTableImp.java	(revision 3951)
@@ -0,0 +1,307 @@
+//
+// $Id: FilePanelTableImp.java 1399 2010-09-08 20:02:33Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-09-08 17:02:33 -0300 (Qua, 08 Set 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+package wjhk.jupload2.gui.filepanel;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Font;
+import java.awt.Point;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.io.File;
+
+import javax.swing.JPanel;
+import javax.swing.JScrollPane;
+import javax.swing.table.TableColumnModel;
+
+import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Implementation of the FilePanel : it creates the
+ * {@link wjhk.jupload2.gui.filepanel.FilePanelJTable}, and handles the
+ * necessary functionalities.
+ * 
+ * @author William JinHua Kwong
+ * @version $Revision: 1399 $
+ */
+public class FilePanelTableImp extends JPanel implements FilePanel,
+        ComponentListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -8273990467324350526L;
+    private FilePanelJTable jtable;
+    private FilePanelDataModel2 model;
+    /**
+     * The current policy, always useful.
+     */
+    private UploadPolicy uploadPolicy = null;
+    /**
+     * The main panel of the applet.
+     */
+    private JUploadPanel juploadPanel = null;
+
+    ;
+
+    /**
+     * The view, which displays the view.
+     */
+    private JScrollPane scrollPane = null;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param juploadPanel The upload panel (parent).
+     * @param uploadPolicy The upload policy to apply.
+     */
+    public FilePanelTableImp(JUploadPanel juploadPanel,
+            UploadPolicy uploadPolicy) {
+        this.juploadPanel = juploadPanel;
+        this.uploadPolicy = uploadPolicy;
+
+        setLayout(new BorderLayout());
+        addMouseListener(juploadPanel.getMouseListener());
+        setTransferHandler(juploadPanel.getTransferHandler());
+
+        this.jtable = new FilePanelJTable(juploadPanel, uploadPolicy);
+
+        this.model = new FilePanelDataModel2(uploadPolicy);
+        this.jtable.setModel(this.model);
+
+        this.scrollPane = new JScrollPane(this.jtable);
+        add(this.scrollPane, BorderLayout.CENTER);
+        this.scrollPane.addMouseListener(juploadPanel.getMouseListener());
+
+        // We must resize columns, when the size of the view changes.
+        this.scrollPane.getViewport().addComponentListener(this);
+    }
+
+    /**
+     * @see wjhk.jupload2.gui.filepanel.FilePanel#addFiles(java.io.File[],java.io.File)
+     */
+    public final void addFiles(File[] f, File root) {
+        if (null == f) {
+            throw new java.lang.IllegalArgumentException(
+                    "FilePanelTableImpl: filesToUpload may not be null)");
+        } else {
+            try {
+                for (int i = 0; i < f.length; i++) {
+                    addDirectoryFiles(f[i], root);
+                }
+            } catch (JUploadExceptionStopAddingFiles e) {
+                // The user want to stop here. Nothing else to do.
+                this.uploadPolicy.displayWarn(getClass().getName()
+                        + ".addFiles() [" + e.getClass().getName() + "]: "
+                        + e.getMessage());
+            }
+        }
+        this.juploadPanel.updateButtonState();
+    }
+
+    /**
+     * This method allows a recursive calls through the file hierarchy.
+     * 
+     * @param f The directory that contains the files to add
+     * @param root The common root of all the added files.
+     * @throws JUploadExceptionStopAddingFiles
+     */
+    private final void addDirectoryFiles(File f, File root)
+            throws JUploadExceptionStopAddingFiles {
+        if (!f.isDirectory()) {
+            addFileOnly(f, root);
+        } else {
+            File[] dirFiles = f.listFiles();
+            for (int i = 0; i < dirFiles.length; i++) {
+                if (dirFiles[i].isDirectory()) {
+                    addDirectoryFiles(dirFiles[i], root);
+                } else {
+                    addFileOnly(dirFiles[i], root);
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a single file into the file list.
+     * 
+     * @param f The file to add.
+     * @param root The common root of all the added files.
+     * @throws JUploadExceptionStopAddingFiles
+     */
+    private final void addFileOnly(File f, File root)
+            throws JUploadExceptionStopAddingFiles {
+        // Make sure we don't select the same file twice.
+        if (!this.model.contains(f)) {
+            this.model.addFile(f, root);
+        }
+    }
+
+    /**
+     * @see wjhk.jupload2.gui.filepanel.FilePanel#getFiles()
+     */
+    public final FileData[] getFiles() {
+        FileData[] files = new FileData[getFilesLength()];
+        for (int i = 0; i < files.length; i++) {
+            files[i] = this.model.getFileDataAt(i);
+        }
+        return files;
+    }
+
+    /**
+     * @see wjhk.jupload2.gui.filepanel.FilePanel#getFilesLength()
+     */
+    public final int getFilesLength() {
+        return this.jtable.getRowCount();
+    }
+
+    /**
+     * @see wjhk.jupload2.gui.filepanel.FilePanel#removeSelected()
+     */
+    public final void removeSelected() {
+        int[] rows = this.jtable.getSelectedRows();
+        for (int i = rows.length - 1; 0 <= i; i--) {
+            this.model.removeRow(rows[i]);
+        }
+    }
+
+    /**
+     * @see java.awt.Container#removeAll()
+     */
+    @Override
+    public final void removeAll() {
+        for (int i = getFilesLength() - 1; 0 <= i; i--) {
+            this.model.removeRow(i);
+        }
+    }
+
+    /**
+     * Removes all occurences of a file from the list. Each file should only
+     * appear once here, but nobodody knows !
+     * 
+     * @param fileData The file to remove
+     */
+    public final void remove(FileData fileData) {
+        this.model.removeRow(fileData);
+    }
+
+    /**
+     * Clear the current selection in the JTable.
+     */
+    public final void clearSelection() {
+        this.jtable.clearSelection();
+    }
+
+    /** @see wjhk.jupload2.gui.filepanel.FilePanel#focusTable() */
+    public final void focusTable() {
+        if (0 < this.jtable.getRowCount()) {
+            this.jtable.requestFocus();
+        }
+    }
+
+    /** @see wjhk.jupload2.gui.filepanel.FilePanel#getFileDataAt(Point) */
+    public FileData getFileDataAt(Point point) {
+        int row = this.jtable.rowAtPoint(point);
+        return this.model.getFileDataAt(row);
+    }
+
+    /**
+     * Return the component on which drop event can occur. Used by
+     * {@link JUploadPanel}, when initializing the DropTarget.
+     * 
+     * @return Component on which the drop event can occur.
+     */
+    public Component getDropComponent() {
+        return this;
+    }
+
+    /**
+     * Catches the <I>hidden</I> event on the JViewport. {@inheritDoc}
+     */
+    public void componentHidden(ComponentEvent arg0) {
+        // We don't care...
+    }
+
+    /**
+     * Catches the <I>moved</I> event on the JViewport. {@inheritDoc}
+     */
+    public void componentMoved(ComponentEvent arg0) {
+        // We don't care...
+    }
+
+    /**
+     * When the size of the file list (actually the JViewport) changes, we adapt
+     * the size if the columns. {@inheritDoc}
+     */
+    public void componentResized(ComponentEvent arg0) {
+        // Is the width set?
+        if (getWidth() > 0) {
+            TableColumnModel colModel = this.jtable.getColumnModel();
+            for (int i = 0; i < this.model.getColumnCount(); i++) {
+                colModel
+                        .getColumn(i)
+                        .setPreferredWidth(
+                                (this.model.getColumnSizePercentage(i) * this.scrollPane
+                                        .getViewport().getWidth()) / 100);
+            }
+        }
+    }
+
+    /**
+     * Catches the <I>shown</I> event on the JViewport. {@inheritDoc}
+     */
+    public void componentShown(ComponentEvent arg0) {
+        // We don't care...
+    }
+
+    /**
+     * Set color of files list grid border.
+     * @param color awt Color
+     */
+    public void setGridBorderColor(Color color) {
+        this.jtable.setGridColor(color);
+    }
+
+    /**
+     * Set back color of table header
+     * @param color awt Color
+     */
+    public void setTableHeaderBackColor(Color color) {
+        this.jtable.getTableHeader().setBackground(color);
+    }
+
+    /**
+     * Set table header text font
+     * @param color awt Color
+     */
+    public void setTableHeaderFont(Font font) {
+        this.jtable.getTableHeader().setFont(font);
+    }
+
+    /**
+     * Set text color of table header
+     * @param color awt Color
+     */
+    public void setTableHeaderTextColor(Color color) {
+        this.jtable.getTableHeader().setForeground(color);
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanelImpl.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanelImpl.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanelImpl.java	(revision 3951)
@@ -0,0 +1,625 @@
+//
+// $Id: JUploadPanelImpl.java 303 2007-07-21 07:42:51 +0000 (sam., 21 juil.
+// 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-05-14 11:09:27 -0300 (Sex, 14 Mai 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.Frame;
+import java.awt.Point;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTarget;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.InputEvent;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.Action;
+import javax.swing.ActionMap;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.SwingConstants;
+import javax.swing.TransferHandler;
+
+import wjhk.jupload2.JUploadApplet;
+import wjhk.jupload2.gui.filepanel.FilePanel;
+import wjhk.jupload2.gui.filepanel.FilePanelTableImp;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.FileUploadManagerThread;
+import wjhk.jupload2.upload.FileUploadManagerThreadImpl;
+
+/**
+ * 
+ * Standard implementation for the {@link JUploadPanel} interface. It contains
+ * the actual creation of the GUI items.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1165 $
+ */
+public class JUploadPanelImpl extends JPanel implements ActionListener,
+		JUploadPanel, MouseListener {
+
+	/** A generated serialVersionUID, to avoid warning during compilation */
+	private static final long serialVersionUID = -1212601012568225757L;
+
+	/** The debug popup menu of the applet */
+	private JUploadDebugPopupMenu jUploadDebugPopupMenu;
+
+	/** The main popup menu of the applet */
+	private JUploadMainPopupMenu jUploadMainPopupMenu;
+
+	// ------------- VARIABLES ----------------------------------------------
+
+	/**
+	 * The Drag and Drop listener, that will manage the drop event. All pplet
+	 * element should register this instance, so that the user see the whole
+	 * applet as a unique drop target.
+	 */
+	private DnDListener dndListener = null;
+
+	private JButton browseButton = null, removeButton = null,
+			removeAllButton = null, uploadButton = null, stopButton = null;
+
+	private JUploadFileChooser fileChooser = null;
+
+	private FilePanel filePanel = null;
+
+	private JProgressBar preparationProgressBar = null;
+
+	private JProgressBar uploadProgressBar = null;
+
+	private JLabel statusLabel = null;
+
+	/**
+	 * The log window. It's created by {@link JUploadApplet}.
+	 */
+	private JUploadTextArea logWindow = null;
+
+	/**
+	 * The log window pane contains the log window, and the relevant scroll
+	 * bars. It's actually this pane that is displayed, as a view on the log
+	 * window.
+	 */
+	private JScrollPane jLogWindowPane = null;
+
+	private UploadPolicy uploadPolicy = null;
+
+	private FileUploadManagerThread fileUploadManagerThread = null;
+
+	// ------------- CONSTRUCTOR --------------------------------------------
+
+	/**
+	 * Standard constructor.
+	 * 
+	 * @param logWindow
+	 *            The log window that should already have been created. This
+	 *            allows putting text into it, before the effective creation of
+	 *            the layout.
+	 * @param uploadPolicyParam
+	 *            The current UploadPolicy. Null if a new one must be created.
+	 * @throws Exception
+	 */
+	public JUploadPanelImpl(JUploadTextArea logWindow,
+			UploadPolicy uploadPolicyParam) throws Exception {
+		this.logWindow = logWindow;
+		this.uploadPolicy = uploadPolicyParam;
+		this.jUploadDebugPopupMenu = new JUploadDebugPopupMenu(
+				this.uploadPolicy);
+		this.jUploadMainPopupMenu = new JUploadMainPopupMenu(this.uploadPolicy,
+				this);
+
+		// First: create standard components.
+		createStandardComponents();
+		logWindow.addMouseListener(this);
+
+		// Define the drop target.
+		this.dndListener = new DnDListener(this, this.uploadPolicy);
+		new DropTarget(this, this.dndListener);
+		new DropTarget(this.filePanel.getDropComponent(), this.dndListener);
+		new DropTarget(this.logWindow, this.dndListener);
+
+		// Define the TransfertHandler, to manage paste operations.
+		JUploadTransferHandler jUploadTransfertHandler = new JUploadTransferHandler(
+				this.uploadPolicy, this);
+		this.setTransferHandler(jUploadTransfertHandler);
+		this.filePanel.setTransferHandler(jUploadTransfertHandler);
+		ActionMap map = this.getActionMap();
+		map.put(TransferHandler.getPasteAction().getValue(Action.NAME),
+				TransferHandler.getPasteAction());
+
+		// The JUploadPanelImpl will listen to Mouse messages for the standard
+		// component. The current only application of this, it the CTRL+Righ
+		// Click, that triggers the popup menu, which allow to switch debug on.
+		this.browseButton.addMouseListener(this);
+		this.removeAllButton.addMouseListener(this);
+		this.removeButton.addMouseListener(this);
+		this.stopButton.addMouseListener(this);
+		this.uploadButton.addMouseListener(this);
+
+		this.jLogWindowPane.addMouseListener(this);
+		logWindow.addMouseListener(this);
+		this.preparationProgressBar.addMouseListener(this);
+		this.uploadProgressBar.addMouseListener(this);
+		this.statusLabel.addMouseListener(this);
+
+		// Then: display them on the applet
+		this.uploadPolicy.addComponentsToJUploadPanel(this);
+	}
+
+	// ----------------------------------------------------------------------
+
+	/**
+	 * Creates all components used by the default upload policy. <BR>
+	 * You can change the component position of these components on the applet,
+	 * by creating a new upload policy, and override the
+	 * {@link UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)} method.<BR>
+	 * You should keep these components, as there content is managed by the
+	 * internal code of the applet. <BR>
+	 * <U>Note:</U> this method will create component only if they were not
+	 * already created. That is only if the relevant attribute contain a null
+	 * value. If it's not the case, the already created component are keeped
+	 * unchanged.
+	 */
+	private void createStandardComponents() {
+		// -------- JButton browse --------
+		if (this.browseButton == null) {
+			this.browseButton = new JButton(this.uploadPolicy
+					.getLocalizedString("buttonBrowse"));
+			this.browseButton.setIcon(new ImageIcon(getClass().getResource(
+					"/images/explorer.gif")));
+		}
+		this.browseButton.addActionListener(this);
+
+		// -------- JButton remove --------
+		if (this.removeButton == null) {
+			this.removeButton = new JButton(this.uploadPolicy
+					.getLocalizedString("buttonRemoveSelected"));
+			this.removeButton.setIcon(new ImageIcon(getClass().getResource(
+					"/images/recycle.gif")));
+		}
+		this.removeButton.setEnabled(false);
+		this.removeButton.addActionListener(this);
+
+		// -------- JButton removeAll --------
+		if (this.removeAllButton == null) {
+			this.removeAllButton = new JButton(this.uploadPolicy
+					.getLocalizedString("buttonRemoveAll"));
+			this.removeAllButton.setIcon(new ImageIcon(getClass().getResource(
+					"/images/cross.gif")));
+		}
+		this.removeAllButton.setEnabled(false);
+		this.removeAllButton.addActionListener(this);
+
+		// -------- JButton upload --------
+		if (null == this.uploadButton) {
+			this.uploadButton = new JButton(this.uploadPolicy
+					.getLocalizedString("buttonUpload"));
+			this.uploadButton.setIcon(new ImageIcon(getClass().getResource(
+					"/images/up.gif")));
+		}
+		this.uploadButton.setEnabled(false);
+		this.uploadButton.addActionListener(this);
+
+		// -------- The main thing: the file panel --------
+		this.filePanel = new FilePanelTableImp(this, this.uploadPolicy);
+
+		// -------- JProgressBar progress --------
+		if (null == this.preparationProgressBar) {
+			this.preparationProgressBar = new JProgressBar(
+					SwingConstants.HORIZONTAL);
+			this.preparationProgressBar.setStringPainted(true);
+		}
+		if (null == this.uploadProgressBar) {
+			this.uploadProgressBar = new JProgressBar(SwingConstants.HORIZONTAL);
+			this.uploadProgressBar.setStringPainted(true);
+		}
+
+		// -------- JButton stop --------
+		if (null == this.stopButton) {
+			this.stopButton = new JButton(this.uploadPolicy
+					.getLocalizedString("buttonStop"));
+			this.stopButton.setIcon(new ImageIcon(getClass().getResource(
+					"/images/cross.gif")));
+		}
+		this.stopButton.setEnabled(false);
+		this.stopButton.addActionListener(this);
+
+		// -------- JButton stop --------
+		if (this.jLogWindowPane == null) {
+			this.jLogWindowPane = new JScrollPane();
+			this.jLogWindowPane
+					.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+			this.jLogWindowPane
+					.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
+		}
+		this.jLogWindowPane.getViewport().add(this.logWindow);
+		this.jLogWindowPane.setPreferredSize(null);
+
+		// -------- statusLabel --------
+		this.statusLabel = new JLabel("JUpload applet "
+				+ this.uploadPolicy.getContext().getDetailedVersionMessage());
+	}
+
+	/** {@inheritDoc} */
+	public void showOrHideLogWindow() {
+		if ((this.uploadPolicy.getShowLogWindow()
+				.equals(UploadPolicy.SHOWLOGWINDOW_TRUE))
+				|| (this.uploadPolicy.getShowLogWindow().equals(
+						UploadPolicy.SHOWLOGWINDOW_ONERROR) && this.uploadPolicy
+						.getLastException() != null)) {
+			// The log window should be visible.
+			this.jLogWindowPane.setVisible(true);
+		} else {
+			// It should be hidden.
+			this.jLogWindowPane.setVisible(false);
+		}
+		// Let's recalculate the component display
+		validate();
+	}
+
+	// ///////////////////////////////////////////////////////////////////////////////
+	// ///////////////// Action methods
+	// ///////////////////////////////////////////////////////////////////////////////
+
+	/** {@inheritDoc} */
+	public void doBrowse() {
+		// If the file chooser was not created, we create it now.
+		if (null == this.fileChooser) {
+			// Setup File Chooser.
+			try {
+				this.uploadPolicy.displayDebug(
+						"Before this.uploadPolicy.createFileChooser()", 80);
+				this.fileChooser = this.uploadPolicy.createFileChooser();
+				this.uploadPolicy.displayDebug(
+						"After this.uploadPolicy.createFileChooser()", 80);
+			} catch (Exception e) {
+				this.uploadPolicy.displayErr(e);
+			}
+
+		}
+
+		// If the fileChooser succeed (should be the case), we go on.
+		if (null != this.fileChooser) {
+			try {
+				int ret = this.fileChooser.showOpenDialog(new Frame());
+				if (JFileChooser.APPROVE_OPTION == ret)
+					this.filePanel.addFiles(
+							this.fileChooser.getSelectedFiles(),
+							this.fileChooser.getCurrentDirectory());
+				// We stop any running task for the JUploadFileView
+				this.uploadPolicy.setCurrentBrowsingDirectory(this.fileChooser
+						.getCurrentDirectory().getAbsolutePath());
+				this.fileChooser.shutdownNow();
+			} catch (Exception ex) {
+				this.uploadPolicy.displayErr(ex);
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void doRemove() {
+		this.filePanel.removeSelected();
+		if (0 >= this.filePanel.getFilesLength()) {
+			this.removeButton.setEnabled(false);
+			this.removeAllButton.setEnabled(false);
+			this.uploadButton.setEnabled(false);
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void doRemoveAll() {
+		this.filePanel.removeAll();
+		this.removeButton.setEnabled(false);
+		this.removeAllButton.setEnabled(false);
+		this.uploadButton.setEnabled(false);
+	}
+
+	/** {@inheritDoc} */
+	public void doStartUpload() {
+		// Check that the upload is ready (we ask the uploadPolicy. Then,
+		// we'll call beforeUpload for each
+		// FileData instance, that exists in allFiles[].
+
+		// ///////////////////////////////////////////////////////////////////////////////////////////////
+		// IMPORTANT: It's up to the UploadPolicy to explain to the user
+		// that the upload is not ready!
+		// ///////////////////////////////////////////////////////////////////////////////////////////////
+		try {
+			if (this.uploadPolicy.beforeUpload()) {
+				// The FileUploadManagerThread will manage everything around
+				// upload, including GUI part.
+				this.fileUploadManagerThread = new FileUploadManagerThreadImpl(
+						this.uploadPolicy);
+				this.fileUploadManagerThread.start();
+			} // if isIploadReady()
+		} catch (Exception e) {
+			// If an exception occurs here, it fails silently. The exception is
+			// thrown to the AWT event dispatcher.
+			this.uploadPolicy.displayErr(e.getClass().getName()
+					+ " in JUploadPanelImpl.doStartUpload()", e);
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void doStopUpload() {
+		this.fileUploadManagerThread.stopUpload();
+	}
+
+	// ///////////////////////////////////////////////////////////////////////////////
+	// ///////////////// Implementation of the ActionListener
+	// ///////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+	 */
+	public void actionPerformed(ActionEvent e) {
+		// Let's log some info.
+		this.uploadPolicy.displayDebug("Action : " + e.getActionCommand(), 1);
+
+		final String actionPaste = (String) TransferHandler.getPasteAction()
+				.getValue(Action.NAME);
+
+		if (e.getActionCommand().equals(actionPaste)) {
+			Action a = getActionMap().get(actionPaste);
+			if (a != null) {
+				a.actionPerformed(new ActionEvent(this.filePanel,
+                    ActionEvent.ACTION_PERFORMED, e.getActionCommand()));
+                this.uploadPolicy.afterFileDropped(new DropTargetDropEvent(new DropTarget(
+                    this.filePanel.getDropComponent(), this.dndListener).getDropTargetContext(),
+                    new Point(), DnDConstants.ACTION_MOVE, DnDConstants.ACTION_COPY_OR_MOVE ));
+			}
+		} else if (e.getActionCommand() == this.browseButton.getActionCommand()) {
+			doBrowse();
+		} else if (e.getActionCommand() == this.removeButton.getActionCommand()) {
+			// Remove clicked
+			doRemove();
+		} else if (e.getActionCommand() == this.removeAllButton
+				.getActionCommand()) {
+			// Remove All clicked
+			doRemoveAll();
+		} else if (e.getActionCommand() == this.uploadButton.getActionCommand()) {
+			// Upload clicked
+			doStartUpload();
+		} else if (e.getActionCommand() == this.stopButton.getActionCommand()) {
+			// We request the thread to stop its job.
+			doStopUpload();
+		}
+		// focus the table. This is necessary in order to enable mouse
+		// events
+		// for triggering tooltips.
+		this.filePanel.focusTable();
+	}
+
+	// ///////////////////////////////////////////////////////////////////////////////
+	// ///////////////// Implementation of the MouseListener
+	// ///////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+	 */
+	public void mouseClicked(MouseEvent mouseEvent) {
+		maybeOpenPopupMenu(mouseEvent);
+	}
+
+	/**
+	 * @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent)
+	 */
+	public void mouseEntered(MouseEvent mouseEvent) {
+		maybeOpenPopupMenu(mouseEvent);
+	}
+
+	/**
+	 * @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent)
+	 */
+	public void mouseExited(MouseEvent mouseEvent) {
+		maybeOpenPopupMenu(mouseEvent);
+	}
+
+	/**
+	 * @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent)
+	 */
+	public void mousePressed(MouseEvent mouseEvent) {
+		maybeOpenPopupMenu(mouseEvent);
+	}
+
+	/**
+	 * @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent)
+	 */
+	public void mouseReleased(MouseEvent mouseEvent) {
+		if (mouseEvent.getClickCount() == 2) {
+			// We have a double-click. Let's tell it to the current upload
+			// policy...
+			this.uploadPolicy.onFileDoubleClicked(this.filePanel
+					.getFileDataAt(mouseEvent.getPoint()));
+		} else {
+			maybeOpenPopupMenu(mouseEvent);
+		}
+	}
+
+	/** {@inheritDoc} */
+	public boolean maybeOpenPopupMenu(MouseEvent mouseEvent) {
+		// Should we open one out of the numerous (2!) popup menus ?
+		if (mouseEvent.isPopupTrigger()) {
+			if ((mouseEvent.getModifiersEx() & InputEvent.CTRL_DOWN_MASK) == InputEvent.CTRL_DOWN_MASK) {
+				// We open the debug menu
+				if (this.jUploadDebugPopupMenu != null) {
+					this.jUploadDebugPopupMenu.show(mouseEvent.getComponent(),
+							mouseEvent.getX(), mouseEvent.getY());
+					return true;
+				}
+			} else {
+				// Let's open the main popup menu
+				if (this.jUploadMainPopupMenu != null) {
+					this.jUploadMainPopupMenu.show(mouseEvent.getComponent(),
+							mouseEvent.getX(), mouseEvent.getY());
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/** {@inheritDoc} */
+	public void updateButtonState() {
+		if (this.fileUploadManagerThread != null
+				&& this.fileUploadManagerThread.isAlive()
+				&& !this.fileUploadManagerThread.isUploadFinished()) {
+			// An upload is running on.
+			this.browseButton.setEnabled(false);
+			this.removeButton.setEnabled(false);
+			this.removeAllButton.setEnabled(false);
+			this.uploadButton.setEnabled(false);
+			this.stopButton.setEnabled(true);
+			// Let's delegate any additional work to the upload policy.
+			this.uploadPolicy
+					.updateButtonState(UploadPolicy.EXEC_STATUS_UPLOADING);
+		} else {
+			// No upload running on.
+			this.browseButton.setEnabled(true);
+			this.stopButton.setEnabled(false);
+
+			boolean enabled = (this.filePanel.getFilesLength() > 0);
+			this.removeButton.setEnabled(enabled);
+			this.removeAllButton.setEnabled(enabled);
+			this.uploadButton.setEnabled(enabled);
+			// Let's delegate any additional work to the upload policy.
+			this.uploadPolicy.updateButtonState(UploadPolicy.EXEC_STATUS_READY);
+		}
+
+	}
+
+	/** {@inheritDoc} */
+	public void clearLogWindow() {
+		this.logWindow.setText("");
+	}
+
+	/** {@inheritDoc} */
+	public void copyLogWindow() {
+		this.logWindow.selectAll();
+		this.logWindow.copy();
+	}
+
+	/** {@inheritDoc} */
+	public ActionListener getActionListener() {
+		return this;
+	}
+
+	/** {@inheritDoc} */
+	public JButton getBrowseButton() {
+		return this.browseButton;
+	}
+
+	/** {@inheritDoc} */
+	public JComponent getJComponent() {
+		return this;
+	}
+
+	/** {@inheritDoc} */
+	public DnDListener getDndListener() {
+		return this.dndListener;
+	}
+
+	/** {@inheritDoc} */
+	public FilePanel getFilePanel() {
+		return this.filePanel;
+	}
+
+	/** {@inheritDoc} */
+	public JScrollPane getJLogWindowPane() {
+		return this.jLogWindowPane;
+	}
+
+	/**
+	 * Get the log window, that is: the component where messages (debug, info,
+	 * error...) are written. You should not use this component directly, but:
+	 * <UL>
+	 * <LI>To display messages: use the UploadPolicy.displayXxx methods.
+	 * <LI>To place this component on the applet, when overriding the
+	 * {@link UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)} method:
+	 * use the {@link #getJLogWindowPane()} method instead. The
+	 * {@link #logWindow} is embbeded in it.
+	 * </UL>
+	 * 
+	 * @return the logWindow
+	 */
+	protected JUploadTextArea getLogWindow() {
+		return this.logWindow;
+	}
+
+	/** {@inheritDoc} */
+	public MouseListener getMouseListener() {
+		return this;
+	}
+
+	/** {@inheritDoc} */
+	public JProgressBar getPreparationProgressBar() {
+		return this.preparationProgressBar;
+	}
+
+	/** {@inheritDoc} */
+	public JProgressBar getUploadProgressBar() {
+		return this.uploadProgressBar;
+	}
+
+	/** {@inheritDoc} */
+	public JButton getRemoveAllButton() {
+		return this.removeAllButton;
+	}
+
+	/** {@inheritDoc} */
+	public JButton getRemoveButton() {
+		return this.removeButton;
+	}
+
+	/** {@inheritDoc} */
+	public JLabel getStatusLabel() {
+		return this.statusLabel;
+	}
+
+	/** {@inheritDoc} */
+	public JButton getStopButton() {
+		return this.stopButton;
+	}
+
+	/** {@inheritDoc} */
+	public JButton getUploadButton() {
+		return this.uploadButton;
+	}
+
+	/** {@inheritDoc} */
+	public void setFilePanel(FilePanel filePanel) {
+		this.filePanel = filePanel;
+	}
+
+	/** {@inheritDoc} */
+	public FileUploadManagerThread getFileUploadManagerThread() {
+		return fileUploadManagerThread;
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileChooser.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileChooser.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileChooser.java	(revision 3951)
@@ -0,0 +1,106 @@
+//
+// $Id: JUploadPanelImpl.java 205 2007-05-28 20:24:01 +0000 (lun., 28 mai 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: etienne_sf
+// Last modified: $Date: 2007-05-28 20:24:01 +0000 (lun., 28 mai 2007) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import javax.swing.JFileChooser;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class allows easy personalization of the java file chooser. It asks the
+ * current upload policy for all current configuration parameters. It is created
+ * by the {@link JUploadPanel} instances.
+ */
+@SuppressWarnings("serial")
+public class JUploadFileChooser extends JFileChooser {
+
+    // /////////////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////////////// Attributes
+    // /////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /** The current upload policy */
+    private UploadPolicy uploadPolicy = null;
+
+    private JUploadFileFilter fileFilter = null;
+
+    /** This file view add picture management capabilities to the file chooser */
+    private JUploadFileView fileView = null;
+
+    // /////////////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////////////// Methods
+    // /////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * The 'standard' constructor for our file chooser
+     * 
+     * @param uploadPolicyParam
+     */
+    public JUploadFileChooser(UploadPolicy uploadPolicyParam) {
+        super(uploadPolicyParam.getCurrentBrowsingDirectory());
+
+        uploadPolicyParam.displayDebug(
+                "Starting JUploadFileChooser constructor", 80);
+        this.uploadPolicy = uploadPolicyParam;
+
+        this.fileFilter = new JUploadFileFilter(this.uploadPolicy);
+        this.fileView = new JUploadFileView(this.uploadPolicy, this);
+
+        // TODO This breaks usability. probably use a persistent value of a
+        // cookie later.
+        // this.fileChooser.setCurrentDirectory(new File(System
+        // .getProperty("user.dir")));
+        setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
+        setMultiSelectionEnabled(true);
+
+        // Hidden file should not be visible.
+        setFileHidingEnabled(true);
+
+        // The file view must be set, whether or not a file filter exists
+        // for this upload policy.
+        setFileView(this.fileView);
+        if (this.uploadPolicy.fileFilterGetDescription() != null) {
+            setFileFilter(this.fileFilter);
+            // If a file filter has been given to the applet, only these file
+            // should be allowed.
+            setAcceptAllFileFilterUsed(false);
+        }
+    }
+
+    /**
+     * Shutdown any running task. Currently, only the JUploadFileView may have
+     * running tasks, when calculating icon for picture files.
+     */
+    public void shutdownNow() {
+        this.fileView.shutdownNow();
+    }
+
+    /**
+     * This method is called when the file chooser is closed. We just shutdown
+     * any running job.
+     */
+    @Override
+    public void approveSelection() {
+        shutdownNow();
+        super.approveSelection();
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTransferHandler.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTransferHandler.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTransferHandler.java	(revision 3951)
@@ -0,0 +1,150 @@
+package wjhk.jupload2.gui;
+
+/**
+ * The JUploadTransferHandler allows easy management of pasted files onto the
+ * applet. It just checks that the pasted selection is compatible (that is: it's
+ * a file list), and calls the addFile methods, to let the core applet work.
+ */
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.IOException;
+import java.io.Reader;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import javax.swing.JComponent;
+import javax.swing.TransferHandler;
+
+import wjhk.jupload2.filedata.DefaultFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+class JUploadTransferHandler extends TransferHandler {
+
+  /** A generated serialVersionUID, to avoid warning during compilation */
+  private static final long serialVersionUID = -1241261479500810699L;
+  DataFlavor fileListFlavor = DataFlavor.javaFileListFlavor;
+  /** Specific data flavor for Linux where the clipboard contains URLs to files instead of the files themselves */
+  DataFlavor uriListFlavor;
+  /**
+   * The JUpload panel for this applet.
+   */
+  JUploadPanel uploadPanel = null;
+  /**
+   * The current upload policy.
+   */
+  UploadPolicy uploadPolicy = null;
+
+  /**
+   * The standard constructor.
+   *
+   * @param uploadPolicy The current uploadPolicy
+   * @param uploadPanel The JUploadPanel. Must given here, as this constructor
+   *            is called in the JUploadPanel construction. So the
+   *            uploadPolicy.getUploadPanel() returns null.
+   */
+  public JUploadTransferHandler(UploadPolicy uploadPolicy,
+          JUploadPanel uploadPanel) {
+    this.uploadPolicy = uploadPolicy;
+    this.uploadPanel = uploadPanel;
+    try {
+      this.uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String");
+    } catch (ClassNotFoundException ex) {
+      this.uriListFlavor = DataFlavor.javaFileListFlavor;
+    }
+  }
+
+  /**
+   * @see javax.swing.TransferHandler#importData(javax.swing.JComponent,
+   *      java.awt.datatransfer.Transferable)
+   */
+  @Override
+  @SuppressWarnings("unchecked")
+  public boolean importData(JComponent c, Transferable t) {
+    DataFlavor[] flavors = t.getTransferDataFlavors();
+    boolean importAccepted = false;
+    if (canImport(c, flavors)) {
+      try {
+        List<File> fileList = new ArrayList<File>();
+        if (isFile(flavors)) {
+          fileList = (List<File>) t.getTransferData(this.fileListFlavor);
+          importAccepted = true;
+        } else if (isUrl(flavors)) {
+          Reader in = uriListFlavor.getReaderForText(t);
+          BufferedReader br = new BufferedReader(in);
+          String uriStr;
+          while ((uriStr = br.readLine()) != null) {
+            try {
+              fileList.add(new File(new URI(uriStr)));
+            } catch (URISyntaxException use) {
+              this.uploadPolicy.displayErr(this.getClass().getName()
+                      + ".importData()", use);
+            }
+          }
+          importAccepted = true;
+        }
+        File[] fileArray = fileList.toArray(new File[fileList.size()]);
+        this.uploadPanel.getFilePanel().addFiles(fileArray,
+                DefaultFileData.getRoot(fileArray));
+        return importAccepted;
+      } catch (UnsupportedFlavorException ufe) {
+        this.uploadPolicy.displayErr(this.getClass().getName()
+                + ".importData()", ufe);
+      } catch (IOException ioe) {
+        this.uploadPolicy.displayErr(this.getClass().getName()
+                + ".importData()", ioe);
+      }
+    }
+
+    return importAccepted;
+  }
+
+  /**
+   * @see javax.swing.TransferHandler#getSourceActions(javax.swing.JComponent)
+   */
+  @Override
+  public int getSourceActions(JComponent c) {
+    return MOVE;
+  }
+
+  /**
+   * @see javax.swing.TransferHandler#canImport(javax.swing.JComponent,
+   *      java.awt.datatransfer.DataFlavor[])
+   */
+  @Override
+  public boolean canImport(JComponent c, DataFlavor[] flavors) {
+    return isFile(flavors) || isUrl(flavors);
+  }
+
+  /**
+   * Indicates if this data flavor is for a File type of data.
+   * @param flavors the flavors
+   * @return true if the data is of type file.
+   */
+  protected boolean isFile(DataFlavor[] flavors) {
+    for (DataFlavor flavor : flavors) {
+      if (this.fileListFlavor.equals(flavor)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Indicates if this data flavor is for a URL type of data.
+   * @param flavors the flavors
+   * @return true if the data is of type url.
+   */
+  protected boolean isUrl(DataFlavor[] flavors) {
+    for (DataFlavor flavor : flavors) {
+      if (this.uriListFlavor.equals(flavor)) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/JUploadImagePreview.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/JUploadImagePreview.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/JUploadImagePreview.java	(revision 3951)
@@ -0,0 +1,240 @@
+//
+// $Id: JUploadPanelImpl.java 295 2007-06-27 08:43:25 +0000 (mer., 27 juin 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Last modified: $Date: 2007-06-27 08:43:25 +0000 (mer., 27 juin 2007) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.image;
+
+/**
+ * This class contains the accessory that displays the image preview, when in
+ * picture mode.
+ * 
+ * @see PictureUploadPolicy
+ */
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+
+import javax.swing.ImageIcon;
+import javax.swing.JComponent;
+import javax.swing.JFileChooser;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+class LoadImageThread extends Thread {
+
+    /**
+     * That cursor that will be used each time the user select a new file, when
+     * resizing the picture before displaying in the preview accessory.
+     */
+    final Cursor waitCursor = new Cursor(Cursor.WAIT_CURSOR);
+
+    /**
+     * The file that is to be loaded.
+     */
+    File file;
+
+    /**
+     * The preview, where the resulting picture must be displayed.
+     */
+    JUploadImagePreview jUploadImagePreview;
+
+    /**
+     * Only constructor, with the file to be loaded.
+     * 
+     * @param file The file to load, once the thread is started.
+     */
+    LoadImageThread(JUploadImagePreview jUploadImagePreview, File file) {
+        this.file = file;
+        this.jUploadImagePreview = jUploadImagePreview;
+    }
+
+    /**
+     * The work itself: it allows the loading and resizing of the picture in a
+     * separate thread, to avoid blocking the user interface.
+     */
+    @Override
+    public void run() {
+
+        this.jUploadImagePreview.uploadPolicy.displayDebug(
+                "LoadImageThread.start (start)", 50);
+        this.jUploadImagePreview.jFileChooser.setCursor(this.waitCursor);
+        ImageIcon thumbnail = null;
+        try {
+            thumbnail = PictureFileData.getImageIcon(this.file,
+                    this.jUploadImagePreview.getWidth(),
+                    this.jUploadImagePreview.getHeight());
+        } catch (JUploadException e) {
+            this.jUploadImagePreview.uploadPolicy.displayErr(e);
+        }
+
+        // A try to minimize memory footprint
+        PictureFileData.freeMemory("JUploadImagePreview.run()",
+                this.jUploadImagePreview.uploadPolicy);
+
+        if (thumbnail != null) {
+            this.jUploadImagePreview.setThumbnail(thumbnail);
+            this.jUploadImagePreview.jFileChooser.setCursor(null);
+        }
+        this.jUploadImagePreview.uploadPolicy.displayDebug(
+                "LoadImageThread.start (end)", 50);
+    }
+}
+
+/** ImagePreview.java by FileChooserDemo2.java. */
+public class JUploadImagePreview extends JComponent implements
+        PropertyChangeListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -6882108570945459638L;
+
+    /**
+     * The current upload policy.
+     */
+    UploadPolicy uploadPolicy;
+
+    /**
+     * Current file chooser, which owns this file preview.
+     */
+    JFileChooser jFileChooser = null;
+
+    /**
+     * The picture, resized to the preview size.
+     */
+    ImageIcon thumbnail = null;
+
+    /**
+     * The selected picture, which should contain the picture to display.
+     * Currently useless, as it is used only in the {@link #setFile(File)}
+     * method. It may be useful, in the future..
+     */
+    File file = null;
+
+    /**
+     * The current thread, that is loading the picture. A new thread is created,
+     * each time a new picture is to be loaded.
+     */
+    LoadImageThread loadImageThread = null;
+
+    /**
+     * The standard constructor for this class.
+     * 
+     * @param jFileChooser The current file chooser, which will contain this
+     *            acessory.
+     * @param uploadPolicy The current upload policy.
+     */
+    public JUploadImagePreview(JFileChooser jFileChooser,
+            UploadPolicy uploadPolicy) {
+        this.jFileChooser = jFileChooser;
+        this.uploadPolicy = uploadPolicy;
+
+        setPreferredSize(new Dimension(200, 200));
+        jFileChooser.addPropertyChangeListener(this);
+    }
+
+    /**
+     * Changes the current picture to display. This method is called by
+     * {@link LoadImageThread#start()} method, when the resized picture has been
+     * calculated.
+     * 
+     * @param thumbnail
+     */
+    void setThumbnail(ImageIcon thumbnail) {
+        this.thumbnail = thumbnail;
+        repaint();
+    }
+
+    /**
+     * Changes the current file: this erases the current displayed picture, then
+     * call the {@link LoadImageThread#start()} method. This generate the
+     * picture asynchroneously. Directories are ignored.
+     */
+    void setFile(File fileParam) {
+        if (fileParam != null && fileParam.isDirectory()) {
+            this.file = null;
+        } else {
+            this.file = fileParam;
+        }
+
+        // First: clear the current picture.
+        this.thumbnail = null;
+        repaint();
+
+        // If a thread is running, let's stop it.
+        if (this.loadImageThread != null && this.loadImageThread.isAlive()) {
+            // Let's forget this thread.
+            this.loadImageThread.interrupt();
+            this.loadImageThread = null;
+        }
+
+        // Next: load aysnchronously the picture.
+        if (this.file != null) {
+            this.loadImageThread = new LoadImageThread(this, this.file);
+            // We want this thread to be executed before the icon loading
+            // threads.
+            this.loadImageThread.setPriority(Thread.MAX_PRIORITY);
+            // Let's start the thread, and exit: the applet is not blocked.
+            this.loadImageThread.start();
+            repaint();
+        }
+    }
+
+    /**
+     * Hum, we're interested in these events: DIRECTORY_CHANGED_PROPERTY and
+     * SELECTED_FILE_CHANGED_PROPERTY.
+     * 
+     * @param e
+     */
+    public void propertyChange(PropertyChangeEvent e) {
+        String prop = e.getPropertyName();
+
+        if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
+            // The directory changed, don't show an image.
+            setFile(null);
+        } else if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(prop)) {
+            // If a file became selected, find out which one.
+            setFile((File) e.getNewValue());
+        }
+    }
+
+    /**
+     * Actual display of the picture. We just have to center the thumbnail,
+     * here.
+     */
+    @Override
+    protected void paintComponent(Graphics g) {
+        // Do we have a picture to display ?
+        if (this.thumbnail != null) {
+            int x = getWidth() / 2 - this.thumbnail.getIconWidth() / 2;
+            int y = getHeight() / 2 - this.thumbnail.getIconHeight() / 2;
+            if (y < 0) {
+                y = 0;
+            }
+            if (x < 5) {
+                x = 5;
+            }
+            this.thumbnail.paintIcon(this, g, x, y);
+            this.uploadPolicy.displayDebug(
+                    "JUploadImagePreview.paintComponent, after paintIcon", 50);
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/DialogPicturePanel.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/DialogPicturePanel.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/DialogPicturePanel.java	(revision 3951)
@@ -0,0 +1,76 @@
+//
+// $Id: DialogPicturePanel.java 95 2007-05-02 03:27:05 +0000 (mer., 02 mai 2007)
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-07-11
+// Creator: etienne_sf
+// Last modified: $Date: 2009-02-16 08:42:50 -0300 (Seg, 16 Fev 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.image;
+
+import java.awt.event.MouseEvent;
+
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * The picture for the PictureDialog. The difference with the PicturePanel, is
+ * that a click on it closes the Dialog.
+ * 
+ * @author etienne_sf
+ */
+public class DialogPicturePanel extends PicturePanel {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 1333603128496671158L;
+
+    /**
+     * The JDialog containing this panel.
+     */
+    PictureDialog pictureDialog;
+
+    /**
+     * @param pictureDialog
+     * @param uploadPolicy
+     * @param pictureFileData
+     * 
+     */
+    public DialogPicturePanel(PictureDialog pictureDialog,
+            UploadPolicy uploadPolicy, PictureFileData pictureFileData) {
+        super(false, uploadPolicy);
+
+        this.pictureDialog = pictureDialog;
+        // pictureDialog.getContentPane().setCursor(new
+        // Cursor(Cursor.WAIT_CURSOR));
+        setPictureFile(pictureFileData, null, null);
+        // pictureDialog.getContentPane().setCursor(null);
+    }
+
+    /**
+     * @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent)
+     */
+    @Override
+    public void mouseClicked(MouseEvent arg0) {
+        // Let's close the current DialogBox, if it has not already be done.
+        if (this.pictureDialog != null) {
+            this.uploadPolicy.displayDebug(
+                    "[DialogPicturePanel] Before pictureDialog.dispose()", 50);
+            this.pictureDialog.dispose();
+            this.pictureDialog = null;
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PictureDialog.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PictureDialog.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PictureDialog.java	(revision 3951)
@@ -0,0 +1,146 @@
+//
+// $Id: PictureDialog.java 298 2007-07-12 10:17:32 +0000 (jeu., 12 juil. 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-07-10
+// Creator: etienne_sf
+// Last modified: $Date: 2010-01-08 20:21:44 -0200 (Sex, 08 Jan 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.image;
+
+import java.awt.BorderLayout;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * A maximized modal dialog box, that display the selected picture.
+ * 
+ * @author etienne_sf
+ */
+public class PictureDialog extends JDialog implements ActionListener,
+        ComponentListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 7802205907550854333L;
+
+    JButton buttonClose;
+
+    PictureFileData pictureFileData = null;
+
+    PicturePanel picturePanel = null;
+
+    UploadPolicy uploadPolicy = null;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param owner The parent frame.
+     * @param pictureFileData The picture to manage.
+     * @param uploadPolicy The upload policy which applies.
+     */
+    public PictureDialog(Frame owner, PictureFileData pictureFileData,
+            UploadPolicy uploadPolicy) {
+        super(owner, pictureFileData.getFileName(), true);
+
+        this.uploadPolicy = uploadPolicy;
+        this.pictureFileData = pictureFileData;
+
+        // This will be a long operation. The cursor will set back to normal in
+        // componentShown, see below
+        setCursor(new Cursor(Cursor.WAIT_CURSOR));
+
+        // Creation of the image area
+        this.picturePanel = new DialogPicturePanel(this, uploadPolicy,
+                pictureFileData);
+
+        // Creation of the buttonClose button.
+        this.buttonClose = new JButton(uploadPolicy
+                .getLocalizedString("buttonClose"));
+        this.buttonClose.setMaximumSize(new Dimension(100, 100));
+        this.buttonClose.addActionListener(this);
+
+        getContentPane().add(this.buttonClose, BorderLayout.SOUTH);
+        getContentPane().add(this.picturePanel);
+
+        pack();
+        // Correction given by
+        // setSize(getMaximumSize()); generate very high number under MAC OSX ->
+        // Applet Crash
+        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+        setBounds(0, 0, screenSize.width, screenSize.height);
+
+        // The dialog is modal: the next line will return when the DialogPicture
+        // is hidden (to be closed, in our case)
+        // But we want to know when it will becom visible, to clear the wait
+        // cursor.
+        addComponentListener(this);
+        setVisible(true);
+
+        // MEMORY LEAK CORRECTION :
+
+        // Let's free some memory.
+        // This is necessary, as the finalize method is not called (if anyone
+        // has an explanation...).
+        // So, I have to manually free the memory consummed to display the
+        // image, here.
+        this.picturePanel.setPictureFile(null, null, null);
+    }
+
+    /**
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    public void actionPerformed(ActionEvent event) {
+        if (event.getActionCommand() == this.buttonClose.getActionCommand()) {
+            this.uploadPolicy.displayDebug(
+                    "[PictureDialog] Before this.dispose()", 10);
+            this.dispose();
+        }
+    }
+
+    /** {@inheritDoc} */
+    public void componentHidden(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentMoved(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentResized(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentShown(ComponentEvent arg0) {
+        // We set the cursor back to normal
+        setCursor(new Cursor(Cursor.HAND_CURSOR));
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PicturePanel.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PicturePanel.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/image/PicturePanel.java	(revision 3951)
@@ -0,0 +1,336 @@
+//
+// $Id: PicturePanel.java 95 2007-05-02 03:27:05 +0000 (mer., 02 mai 2007)
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+// Copyright 2002 Guillaume Chamberland-Larose
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2009-07-15 11:45:06 -0300 (Qua, 15 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui.image;
+
+import java.awt.Canvas;
+import java.awt.Cursor;
+import java.awt.Graphics;
+import java.awt.Image;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.AbstractButton;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This panel is used to preview picture, when PictureUploadPolicy (or one of
+ * its inherited policy) is used. Manages the panel where pictures are
+ * displayed. <BR>
+ * Each time a user selects a file in the panel file, the PictureUploadPolicy
+ * calls
+ * {@link #setPictureFile(PictureFileData, AbstractButton, AbstractButton)}. I
+ * did an attempt to store the Image generated for the Panel size into the
+ * PictureFileData, to avoid to calculate the offscreenPicture each time the
+ * user select the same file again. But it doesn't work: the applet quickly runs
+ * out of memory, even after numerous calls of System.gc and finalize. <BR>
+ * <BR>
+ * This file is taken from the PictureApplet ((C) 2002 Guillaume
+ * Chamberland-Larose), available here: To contact Guillaume Chamberland-Larose
+ * for bugs, patches, suggestions: Please use the forums on the sourceforge web
+ * page for this project, located at:
+ * http://sourceforge.net/projects/picture-applet/ Updated : 2006 etienne_sf<BR>
+ * This program is free software; you can redistribute it and/or modify it under
+ * the terms of the GNU General Public License as published by the Free Software
+ * Foundation; either version 2 of the License, or (at your option) any later
+ * version. <BR>
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+ * FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+ * details. <BR>
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+public class PicturePanel extends Canvas implements MouseListener,
+        ComponentListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -3439340009940699981L;
+
+    private PictureFileData pictureFileData;
+
+    /**
+     * offscreenImage contains an image, that can be asked by
+     * {@link PictureFileData#getImage(Canvas, boolean)}. It is used to preview
+     * this picture.
+     */
+    private Image offscreenImage = null;
+
+    /**
+     * Indicates if the offscreen image should be calculated once and stored, to
+     * avoid to calculate it again. <BR>
+     * Indications: the offscreen image should be calculate only once for the
+     * picturePanel on the applet, and for each display when the user ask to
+     * display the fulscreen picture (by a click on the picturePanel).
+     */
+    private boolean hasToStoreOffscreenPicture = false;
+
+    /**
+     * The current upload policy.
+     */
+    protected UploadPolicy uploadPolicy;
+
+    /**
+     * Standard constructor.
+     * 
+     * @param hasToStoreOffscreenPicture
+     * @param uploadPolicy The current upload policy
+     */
+    public PicturePanel(boolean hasToStoreOffscreenPicture,
+            UploadPolicy uploadPolicy) {
+        super();
+
+        this.hasToStoreOffscreenPicture = hasToStoreOffscreenPicture;
+        this.uploadPolicy = uploadPolicy;
+
+        // We want to trap the mouse actions on this picture.
+        addMouseListener(this);
+
+        // We want to know when a resize event occurs (to recalculate
+        // offscreenImage)
+        addComponentListener(this);
+    }
+
+    /**
+     * This setter is called by {@link PictureFileData} to set the picture that
+     * is to be previewed.
+     * 
+     * @param pictureFileData The FileData for the image to be displayed. Null
+     *            if no picture should be displayed.
+     * @param button1 A button that will be activated or not, depending of the
+     *            pictures was correctly set into the panel. May be null, if not
+     *            button is to be enabled.
+     * @param button2 Another button that will be activated or not. May also be
+     *            null.
+     */
+    public void setPictureFile(PictureFileData pictureFileData,
+            AbstractButton button1, AbstractButton button2) {
+        // First : reset current picture configuration.
+        this.pictureFileData = null;
+        if (this.offscreenImage != null) {
+            this.offscreenImage.flush();
+            this.offscreenImage = null;
+        }
+
+        // Ask for an immediate repaint, to clear the panel (as offscreenImage
+        // is now null).
+        repaint();
+
+        // Then, we store the new picture data, get the offscreen picture and
+        // ask for a repaint.
+        boolean enableButton = false;
+        if (pictureFileData != null && pictureFileData.canRead()) {
+            this.pictureFileData = pictureFileData;
+
+            // A picture has been selected. The buttons must be enabled.
+            enableButton = true;
+
+            // Now, we display this picture.
+            calculateOffscreenImage();
+            repaint();
+        }
+
+        // Let's activate the given button ... if any.
+        if (button1 != null) {
+            button1.setEnabled(enableButton);
+        }
+        if (button2 != null) {
+            button2.setEnabled(enableButton);
+        }
+    }
+
+    /**
+     * @see java.awt.Canvas#paint(java.awt.Graphics)
+     */
+    @Override
+    public void paint(Graphics g) {
+        // First : clear the panel area.
+        g.clearRect(0, 0, getWidth(), getHeight());
+
+        /*
+         * The picture is calculated outside of the paint() event. See:
+         * calculateOffscreenImage() and componentResized. //Then, check if we
+         * must calculate the picture. if (pictureFileData != null) { //Now, we
+         * calculate the picture if we don't already have one. if
+         * (offscreenImage == null) { calculateOffscreenImage(); } }
+         */
+
+        // Then, display the picture, if any is defined.
+        if (this.offscreenImage != null) {
+            // Let's center this picture
+            int hMargin = (getWidth() - this.offscreenImage.getWidth(this)) / 2;
+            int vMargin = (getHeight() - this.offscreenImage.getHeight(this)) / 2;
+            g.drawImage(this.offscreenImage, hMargin, vMargin, this);
+            // Free the used memory.
+            this.offscreenImage.flush();
+        } else {
+            this.uploadPolicy.displayDebug(
+                    "PicturePanel.paint(): offscreenImage is null", 50);
+        }
+    }
+
+    /**
+     * This function adds a quarter rotation to the current picture.
+     * 
+     * @param quarter Number of quarters (90ï¿œ) the picture should rotate. 1
+     *            means rotating of 90ï¿œ clockwise (?). Can be negative
+     *            (counterclockwise), more than 1...
+     */
+    public void rotate(int quarter) {
+        if (this.pictureFileData != null) {
+            Cursor previousCursor = this.uploadPolicy.setWaitCursor();
+            this.pictureFileData.addRotation(quarter);
+            // The previously calculated picture is now wrong.
+            this.offscreenImage.flush();
+            this.offscreenImage = null;
+            calculateOffscreenImage();
+
+            repaint();
+            this.uploadPolicy.setCursor(previousCursor);
+        } else {
+            this.uploadPolicy
+                    .displayWarn("Hum, this is really strange: there is no pictureFileData in the PicturePanel! Command is ignored.");
+        }
+    }
+
+    /**
+     * This method get the offscreenImage from the current pictureFileData. This
+     * image is null, if pictureFileData is null. In this case, the repaint will
+     * only clear the panel rectangle, on the screen.
+     */
+    private void calculateOffscreenImage() {
+        if (this.pictureFileData == null) {
+            // Nothing to do. offscreenImage should be null.
+            if (this.offscreenImage != null) {
+                this.offscreenImage = null;
+                this.uploadPolicy
+                        .displayWarn("PicturePanel.calculateOffscreenImage(): pictureFileData is null (offscreenImage set to null");
+            }
+        } else if (this.offscreenImage == null) {
+            this.uploadPolicy
+                    .displayDebug(
+                            "PicturePanel.calculateOffscreenImage(): trying to calculate offscreenImage (PicturePanel.calculateOffscreenImage()",
+                            30);
+            try {
+                this.offscreenImage = this.pictureFileData.getImage(this,
+                        this.hasToStoreOffscreenPicture);
+            } catch (JUploadException e) {
+                this.uploadPolicy.displayErr(e);
+                // We won't try to display the picture for this file.
+                this.pictureFileData = null;
+                this.offscreenImage = null;
+            }
+        }
+    }
+
+    /**
+     * Is it really useful ??
+     */
+    @Override
+    protected void finalize() throws Throwable {
+        // super.finalize();
+        this.uploadPolicy.displayDebug("Within PicturePanel.finalize()", 10);
+
+        if (this.offscreenImage != null) {
+            this.offscreenImage.flush();
+        }
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// MouseListener interface
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+    /** @see java.awt.event.MouseListener#mouseClicked(java.awt.event.MouseEvent) */
+    public void mouseClicked(MouseEvent arg0) {
+        if (this.pictureFileData != null) {
+            // Ok, we have a picture. Let's display it.
+            this.uploadPolicy.onFileDoubleClicked(this.pictureFileData);
+        }
+    }
+
+    /** @see java.awt.event.MouseListener#mouseEntered(java.awt.event.MouseEvent) */
+    public void mouseEntered(MouseEvent arg0) {
+        // Nothing to do.
+    }
+
+    /** @see java.awt.event.MouseListener#mouseExited(java.awt.event.MouseEvent) */
+    public void mouseExited(MouseEvent arg0) {
+        // Nothing to do.
+    }
+
+    /** @see java.awt.event.MouseListener#mousePressed(java.awt.event.MouseEvent) */
+    public void mousePressed(MouseEvent arg0) {
+        // Nothing to do.
+    }
+
+    /** @see java.awt.event.MouseListener#mouseReleased(java.awt.event.MouseEvent) */
+    public void mouseReleased(MouseEvent arg0) {
+        // Nothing to do.
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// ComponentListener interface
+    // ////////////////////////////////////////////
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+    /**
+     * @see java.awt.event.ComponentListener#componentHidden(java.awt.event.ComponentEvent)
+     */
+    public void componentHidden(ComponentEvent arg0) {
+        // No action
+    }
+
+    /**
+     * @see java.awt.event.ComponentListener#componentMoved(java.awt.event.ComponentEvent)
+     */
+    public void componentMoved(ComponentEvent arg0) {
+        // No action
+    }
+
+    /**
+     * @see java.awt.event.ComponentListener#componentResized(java.awt.event.ComponentEvent)
+     */
+    public void componentResized(ComponentEvent arg0) {
+        this.uploadPolicy.displayDebug("Within componentResized", 10);
+        if (this.offscreenImage != null) {
+            this.offscreenImage.flush();
+            this.offscreenImage = null;
+        }
+
+        // Then we calculate a new image for this panel.
+        calculateOffscreenImage();
+        repaint();
+    }
+
+    /**
+     * @see java.awt.event.ComponentListener#componentShown(java.awt.event.ComponentEvent)
+     */
+    public void componentShown(ComponentEvent arg0) {
+        // No action
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileFilter.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileFilter.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileFilter.java	(revision 3951)
@@ -0,0 +1,60 @@
+//
+// $Id: JUploadFileFilter.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2008-08-08 18:53:52 -0300 (Sex, 08 Ago 2008) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.io.File;
+
+import javax.swing.filechooser.FileFilter;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Default File Filter used by the
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy} to filter the allowed file
+ * in the JFileChooser. This class is an empty one: it just calls the {
+ */
+public class JUploadFileFilter extends FileFilter {
+
+    UploadPolicy uploadPolicy = null;
+
+    JUploadFileFilter(UploadPolicy uploadPolicy) {
+        this.uploadPolicy = uploadPolicy;
+    }
+
+    /**
+     * @see javax.swing.filechooser.FileFilter#accept(java.io.File)
+     */
+    @Override
+    public boolean accept(File file) {
+        return this.uploadPolicy.fileFilterAccept(file);
+    }
+
+    /**
+     * @see javax.swing.filechooser.FileFilter#getDescription()
+     */
+    @Override
+    public String getDescription() {
+        return this.uploadPolicy.fileFilterGetDescription();
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DebugDialog.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DebugDialog.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DebugDialog.java	(revision 3951)
@@ -0,0 +1,193 @@
+//
+// $Id: DebugDialog.java 298 2007-07-12 10:17:32 +0000 (jeu., 12 juil. 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-07-10
+// Creator: etienne_sf
+// Last modified: $Date: 2008-04-16 09:58:02 +0200 (mer., 16 avr. 2008) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.Toolkit;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JEditorPane;
+import javax.swing.JScrollPane;
+import javax.swing.ScrollPaneConstants;
+import javax.swing.text.Document;
+import javax.swing.text.html.HTMLEditorKit;
+
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * A maximized modal dialog box, that display the selected picture.
+ * 
+ * @author etienne_sf
+ */
+public class DebugDialog extends JDialog implements ActionListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 7802205907550854333L;
+
+    /**
+     * The close button, which closes this dialog window.
+     */
+    JButton buttonClose;
+
+    /**
+     * The temporary file, that will contain the HTML response body.
+     */
+    File lastReponseBodyFile = null;
+
+    /**
+     * The current upload policy.
+     */
+    UploadPolicy uploadPolicy = null;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param owner The parent frame.
+     * @param text The text to display. It can be HTML.
+     * @param uploadPolicy The upload policy which applies.
+     * @throws JUploadIOException
+     */
+    public DebugDialog(Frame owner, String text, UploadPolicy uploadPolicy)
+            throws JUploadIOException {
+        this.uploadPolicy = uploadPolicy;
+
+        // Creation of the buttonClose button.
+        this.buttonClose = new JButton(uploadPolicy
+                .getLocalizedString("buttonClose"));
+        this.buttonClose.setMaximumSize(new Dimension(100, 100));
+        this.buttonClose.addActionListener(this);
+
+        // Creation of the text (HTML) area
+        JEditorPane editorPane = new JEditorPane();
+        JScrollPane editorScrollPane = new JScrollPane(editorPane);
+        editorScrollPane
+                .setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
+        editorScrollPane.setPreferredSize(new Dimension(250, 145));
+        editorScrollPane.setMinimumSize(new Dimension(10, 10));
+
+        setText(editorPane, text);
+
+        getContentPane().add(this.buttonClose, BorderLayout.SOUTH);
+        getContentPane().add(editorScrollPane);
+
+        try {
+            pack();
+        } catch (IllegalArgumentException e) {
+            // This can happen, while parsing HTML.
+            uploadPolicy
+                    .displayWarn("IllegalArgumentException while packing the DebugWindow (bad HTML ?)");
+            uploadPolicy.displayErr(e);
+        }
+        // Correction given by
+        // setSize(getMaximumSize()); generate very high number under MAC OSX ->
+        // Applet Crash
+        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
+        setBounds(0, 0, screenSize.width, screenSize.height);
+
+        // The dialog is modal: the next line will return when the DialogPicture
+        // is hidden (to be closed, in our case)
+        setTitle("JUpload DebugDialog: last response body");
+        setVisible(true);
+    }
+
+    /**
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    public void actionPerformed(ActionEvent event) {
+        if (event.getActionCommand() == this.buttonClose.getActionCommand()) {
+            this.uploadPolicy.displayDebug(
+                    "[DebugDialog] Before this.dispose()", 50);
+            this.dispose();
+        }
+    }
+
+    /**
+     * Set the text to display. If it's full HTML, beginning with a <!DOC tag,
+     * this first tag and empty lines at the beginning are removed.
+     * 
+     * @param editorPane The target JEditorPane
+     * @param text The text to save.
+     * @throws JUploadIOException
+     */
+    public void setText(JEditorPane editorPane, String text)
+            throws JUploadIOException {
+        this.uploadPolicy.getContext().registerUnload(this, "deleteLog");
+        try {
+            // First: creation of a temporary file. This is necessary, as html
+            // output is not correctly displayed in the JEditorPane, when using
+            // the setText method. We need an URL to call the setPage one.
+            this.lastReponseBodyFile = File.createTempFile("jupload_",
+                    "_LRB.html");
+            // Let's put our output within this temp file.
+            FileOutputStream fos = new FileOutputStream(
+                    this.lastReponseBodyFile);
+            fos.write(text.getBytes());
+            fos.close();
+            // We can now call setPage(URL).
+            java.net.URL lastResponseBodyLocalPage = this.lastReponseBodyFile
+                    .toURI().toURL();
+            editorPane.setEditable(false);
+            editorPane.setPage(lastResponseBodyLocalPage);
+            HTMLEditorKit ek = (HTMLEditorKit) editorPane.getEditorKit();
+            Document doc = ek.createDefaultDocument();
+            doc.putProperty("Base", "http://localhost/coppermine/");
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+    }
+
+    /**
+     * Delete the current log. (called upon applet termination)
+     */
+    public void deleteLog() {
+        try {
+            if (null != this.lastReponseBodyFile) {
+                if (!this.lastReponseBodyFile.delete()) {
+                    this.uploadPolicy
+                            .displayWarn("Unable to delete this.lastReponseBodyFile ("
+                                    + this.lastReponseBodyFile.getName() + ")");
+                }
+                this.lastReponseBodyFile = null;
+            }
+        } catch (Exception e) {
+            // nothing to do
+        }
+    }
+
+    /**
+     * dispose all internal resources. Mainly: the temporary file.
+     */
+    @Override
+    public void dispose() {
+        super.dispose();
+        deleteLog();
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileView.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileView.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadFileView.java	(revision 3951)
@@ -0,0 +1,396 @@
+//
+// $Id: JUploadFileView.java 112 2007-05-07 02:45:28 +0000 (lun., 07 mai 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-04-06
+// Creator: etienne_sf
+// Last modified: $Date: 2009-07-02 11:49:12 -0300 (Qui, 02 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.image.BufferedImage;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.io.File;
+import java.util.Enumeration;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
+import java.util.concurrent.ThreadFactory;
+
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JFileChooser;
+import javax.swing.filechooser.FileView;
+
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.DefaultUploadPolicy;
+import wjhk.jupload2.policies.PictureUploadPolicy;
+import wjhk.jupload2.policies.UploadPolicy;
+
+// //////////////////////////////////////////////////////////////////////////////////////////////////
+// ///////////////////////////// local class: JUploadFileView
+// //////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * The IconWorker class loads a icon from a file. It's called from a backup
+ * thread created by the JUploadFileView class. This allows to load/calculate
+ * icons in background. This prevent the applet to be freezed while icons are
+ * loading. <BR>
+ * Instances of this class can have the following status, in this order: <DIR>
+ * <LI>STATUS_NOT_LOADED: This icon is not loaded, and its loading is not
+ * requested. This status is the default one, on creation. <LI>
+ * STATUS_TO_BE_LOADED: This icon is on the list of icon to load. This status is
+ * written by the JUploadFileView#execute(IconWorker) method. <LI>
+ * STATUS_LOADING: Indicates the IconWorker#loadIcon() has been called, but is
+ * not finished. <LI>STATUS_LOADED: The icon is loaded, and ready to be
+ * displayed. <LI>STATUS_ERROR_WHILE_LOADING: Too bad, the applet could not load
+ * the icon. It won't be tried again. </DIR>
+ */
+class IconWorker implements Runnable {
+
+    /** Indicates that an error occurs, during the icon creation */
+    final static int STATUS_ERROR_WHILE_LOADING = -1;
+
+    /** Indicates that the icon for this file has been loaded */
+    final static int STATUS_LOADED = 1;
+
+    /**
+     * Indicated that the creation of the icon for this file has started. But it
+     * is not ready yet.
+     */
+    final static int STATUS_LOADING = 2;
+
+    /**
+     * Indicates the loading of the icon for this file has been requested, but
+     * has not started yet.
+     */
+    final static int STATUS_TO_BE_LOADED = 3;
+
+    /**
+     * Indicates the loading of the icon for this file is not currently
+     * requested. The loading may have been requested, then cancelled, for
+     * instance of the user changes the current directory or closes the file
+     * chooser.
+     */
+    final static int STATUS_NOT_LOADED = 4;
+
+    /** The current upload policy */
+    UploadPolicy uploadPolicy = null;
+
+    /** The current file chooser. */
+    JFileChooser fileChooser = null;
+
+    /** The current file view */
+    JUploadFileView fileView = null;
+
+    /** The file whose icon must be loaded. */
+    File file = null;
+
+    /** The icon for this file. */
+    Icon icon = null;
+
+    /** Current loading status for this worker */
+    int status = STATUS_NOT_LOADED;
+
+    /**
+     * The constructor only stores the file. The background thread will call the
+     * loadIcon method.
+     * 
+     * @param file The file whose icon must be loaded/calculated.
+     */
+    IconWorker(UploadPolicy uploadPolicy, JFileChooser fileChooser,
+            JUploadFileView fileView, File file) {
+        this.uploadPolicy = uploadPolicy;
+        this.fileChooser = fileChooser;
+        this.fileView = fileView;
+        this.file = file;
+    }
+
+    /**
+     * Returns the currently loaded icon for this file.
+     * 
+     * @return The Icon to be displayed for this file.
+     */
+    Icon getIcon() {
+        switch (this.status) {
+            case STATUS_LOADED:
+                return this.icon;
+            case STATUS_NOT_LOADED:
+                // ?? This picture should not be in this state. Perhaps the user
+                // changes of directory, then went back to it.
+                // We ask again to calculate its icon.
+                this.fileView.execute(this);
+                return JUploadFileView.emptyIcon;
+            default:
+                return JUploadFileView.emptyIcon;
+        }// switch
+    }// getIcon
+
+    /**
+     * Get the icon from the current upload policy, for this file. This methods
+     * does something only if the current status for the icon is
+     * {@link #STATUS_TO_BE_LOADED}. If not, this method does nothing.
+     */
+    void loadIcon() {
+        try {
+            if (this.status == STATUS_TO_BE_LOADED) {
+                this.status = STATUS_LOADING;
+
+                // This thread is of the lower possible priority. So we first
+                // give a change for other thread to work
+                Thread.yield();
+
+                // This class is used only to do this call, in a separate
+                // thread.
+                this.icon = this.uploadPolicy.fileViewGetIcon(this.file);
+                this.status = STATUS_LOADED;
+
+                // This thread is of the lower possible priority. So we first
+                // give a change for other thread to work
+                Thread.yield();
+
+                // Let's notify the fact the work is done.
+                this.fileChooser.repaint();
+
+                // A try to minimize memory footprint
+                PictureFileData.freeMemory(this.getClass().getName()
+                        + ".loadIcon()", this.uploadPolicy);
+            }
+        } catch (OutOfMemoryError e) {
+            this.uploadPolicy
+                    .displayWarn("OutOfMemoryError in IconWorker.loadIcon()");
+            this.status = STATUS_ERROR_WHILE_LOADING;
+            this.icon = null;
+        }
+    }
+
+    /** Implementation of the Runnable interface */
+    public void run() {
+        loadIcon();
+    }
+}
+
+// //////////////////////////////////////////////////////////////////////////////////////////////////
+// ///////////////// JUploadFileView
+// //////////////////////////////////////////////////////////////////////////////////////////////////
+
+/**
+ * This class provides the icon view for the file selector.
+ * 
+ * @author etienne_sf
+ */
+public class JUploadFileView extends FileView implements
+        PropertyChangeListener, ThreadFactory {
+
+    /**
+     * This thread group is used to contain all icon worker threads. Its
+     * priority is the MIN_PRIORITY, to try to minimize CPU footprint. Its
+     * thread max priority is set in the
+     * {@link JUploadFileView#JUploadFileView(UploadPolicy, JFileChooser)}
+     * constructor.
+     */
+    ThreadGroup iconWorkerThreadGroup = new ThreadGroup("JUpload ThreadGroup");
+
+    /** The current upload policy. */
+    UploadPolicy uploadPolicy = null;
+
+    /** The current file chooser. */
+    JFileChooser fileChooser = null;
+
+    /** This map will contain all instances of {@link IconWorker}. */
+    ConcurrentHashMap<String, IconWorker> hashMap = new ConcurrentHashMap<String, IconWorker>(
+            1000, (float) 0.5, 3);
+
+    /**
+     * This executor will crate icons from files, one at a time. It is used to
+     * create these icon asynchronously.
+     * 
+     * @see #execute(IconWorker)
+     */
+    ExecutorService executorService = null;
+
+    /**
+     * An empty icon, having the good file size.
+     */
+    public static ImageIcon emptyIcon = null;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param uploadPolicy The upload policy to apply.
+     * @param fileChooser The desired file chooser to use.
+     */
+    public JUploadFileView(UploadPolicy uploadPolicy, JFileChooser fileChooser) {
+        this.uploadPolicy = uploadPolicy;
+        this.fileChooser = fileChooser;
+        this.fileChooser.addPropertyChangeListener(this);
+
+        // The real interest of the thread group, here, is to lower the priority
+        // of the icon workers threads:
+        this.iconWorkerThreadGroup.setMaxPriority(Thread.MIN_PRIORITY);
+
+        // emptyIcon needs an upload policy, to be set, but we'll create it
+        // only once.
+        if (emptyIcon == null
+                || emptyIcon.getIconHeight() != uploadPolicy
+                        .getFileChooserIconSize()) {
+            // The empty icon has not been calculated yet, or its size changed
+            // since the icon creation. This can happen when the applet is
+            // reloaded, and the applet parameter changed: the static attribute
+            // are not recalculated.
+            // Let's construct the resized picture.
+            emptyIcon = new ImageIcon(new BufferedImage(uploadPolicy
+                    .getFileChooserIconSize(), uploadPolicy
+                    .getFileChooserIconSize(), BufferedImage.TYPE_INT_ARGB_PRE));
+        }
+    }
+
+    synchronized void execute(IconWorker iconWorker) {
+        if (this.executorService == null || this.executorService.isShutdown()) {
+            this.executorService = Executors.newSingleThreadExecutor();
+        }
+        iconWorker.status = IconWorker.STATUS_TO_BE_LOADED;
+        this.executorService.execute(iconWorker);
+    }
+
+    /**
+     * Stop all current and to come thread. To be called when the file chooser
+     * is closed.
+     */
+    synchronized public void shutdownNow() {
+        if (this.executorService != null) {
+            stopRunningJobs();
+
+            this.executorService.shutdownNow();
+            this.executorService = null;
+        }
+    }
+
+    /**
+     * Lazily mark all jobs as not done. No particular thread management.
+     */
+    private void stopRunningJobs() {
+        Enumeration<IconWorker> e = this.hashMap.elements();
+        IconWorker iw = null;
+        while (e.hasMoreElements()) {
+            iw = e.nextElement();
+            if (iw.status == IconWorker.STATUS_TO_BE_LOADED) {
+                iw.status = IconWorker.STATUS_NOT_LOADED;
+            }
+        }
+    }
+
+    /**
+     * Waiting for JFileChooser events. Currently managed:
+     * DIRECTORY_CHANGED_PROPERTY, to stop the to be loaded icons.
+     * 
+     * @param e
+     */
+    public void propertyChange(PropertyChangeEvent e) {
+        String prop = e.getPropertyName();
+        // If the directory changed, don't show an image.
+        if (JFileChooser.DIRECTORY_CHANGED_PROPERTY.equals(prop)) {
+            // We stops all running job. If the user gets back to this
+            // directory, the non calculated icons will be added to the job
+            // list.
+            this.uploadPolicy.displayDebug(
+                    "[JUploadFileView] Directory changed", 50);
+            stopRunningJobs();
+        }
+    }
+
+    // ///////////////////////////////////////////////////////////////////////:
+    // /////////////////////// Methods from the FileView class
+    // ///////////////////////////////////////////////////////////////////////:
+
+    /** #see javax.swing.filechooser.FileView#getDescription(File)) */
+    @Override
+    public String getDescription(File f) {
+        return null; // let the L&F FileView figure this out
+    }
+
+    /**
+     * The fileChooserIconFromFileContent applet parameter defies which icon is
+     * to be returned here.
+     * 
+     * @see javax.swing.filechooser.FileView#getIcon(java.io.File)
+     * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+     */
+    @Override
+    public Icon getIcon(File file) {
+        // For DefaultUploadPolicy, a value of 1 means calculating the icon.
+        // For PictureUploadPolicy and sisters, a value of 0 also means
+        // calculating the icon
+        // Otherwise: return null, for default icon.
+        if (!((this.uploadPolicy.getFileChooserIconFromFileContent() == 1 && this.uploadPolicy instanceof DefaultUploadPolicy) || (this.uploadPolicy
+                .getFileChooserIconFromFileContent() == 0 && this.uploadPolicy instanceof PictureUploadPolicy))) {
+            return null;
+        }
+        // For PictureUploadPolicy and sisters, a value of 0
+        if (file.isDirectory()) {
+            // We let the L&F display the system icon for directories.
+            return null;
+        }
+        IconWorker iconWorker = this.hashMap.get(file.getAbsolutePath());
+        if (iconWorker == null) {
+            // This file has not been loaded.
+            iconWorker = new IconWorker(this.uploadPolicy, this.fileChooser,
+                    this, file);
+            // We store it in the global Icon container.
+            this.hashMap.put(file.getAbsolutePath(), iconWorker);
+            // Then, we ask the current Thread to load its icon. It will be done
+            // later.
+            execute(iconWorker);
+            // We currently have no icon to display.
+            return emptyIcon;
+        }
+        // Ok, let's take the icon.
+        return iconWorker.getIcon();
+    }
+
+    /** #see {@link javax.swing.filechooser.FileView#getName(File)} */
+    @Override
+    public String getName(File f) {
+        return null; // let the L&F FileView figure this out
+    }
+
+    /** #see {@link javax.swing.filechooser.FileView#getTypeDescription(File)} */
+    @Override
+    public String getTypeDescription(File f) {
+        return null; // let the L&F FileView figure this out
+    }
+
+    /** #see {@link javax.swing.filechooser.FileView#isTraversable(File)} */
+    @Override
+    public Boolean isTraversable(File f) {
+        return null; // let the L&F FileView figure this out
+    }
+
+    /**
+     * Implementation of ThreadFactory. Creates a thread in the
+     * iconWorkerThreadGroup thread group. This thread group has the lower
+     * available priority.
+     * 
+     * @param runnable The runnable instance to start.
+     * @return The newly created thread
+     */
+    public Thread newThread(Runnable runnable) {
+        Thread thread = new Thread(this.iconWorkerThreadGroup, runnable);
+        thread.setPriority(Thread.MIN_PRIORITY);
+        return thread;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DialogUploadRetry.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DialogUploadRetry.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DialogUploadRetry.java	(revision 3951)
@@ -0,0 +1,308 @@
+//
+// $Id: DialogPicturePanel.java 95 2007-05-02 03:27:05 +0000 (mer., 02 mai 2007)
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-07-11
+// Creator: etienne_sf
+// Last modified: $Date: 2009-02-16 12:42:50 +0100 (lun., 16 fÃ©vr. 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.BorderLayout;
+import java.awt.Cursor;
+import java.awt.Dimension;
+import java.awt.Frame;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ComponentEvent;
+import java.awt.event.ComponentListener;
+import java.lang.reflect.InvocationTargetException;
+
+import javax.swing.BorderFactory;
+import javax.swing.Box;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+import javax.swing.JPanel;
+import javax.swing.JTextArea;
+import javax.swing.Timer;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This JDialog displays a message to the user, to allow him to accept or refuse
+ * a retry of an upload, when a 'resumable upload error' occurs. The message is
+ * displayed, followed by a timer countdown. When the timer value falls to 0,
+ * the retry is automatically executed. This allows the user to quit is screen,
+ * and have automatic retries, even for long upload.
+ * 
+ * @author etienne_sf
+ */
+@SuppressWarnings("serial")
+public class DialogUploadRetry extends JDialog implements ActionListener,
+        ComponentListener {
+
+    JButton buttonYes;
+
+    JButton buttonNo;
+
+    JButton buttonDetails;
+
+    JTextArea jtextArea;
+
+    JTextArea detailTestArea;
+
+    JUploadException juploadException = null;
+
+    UploadPolicy uploadPolicy = null;
+
+    /**
+     * This timer allows the display of seconds countdown before automatic
+     * retry, to the user
+     */
+    Timer countdownTimer = null;
+
+    /**
+     * How many seconds, before automatic validation (response=yes) of this
+     * dialog box
+     */
+    int countdownValue;
+
+    /**
+     * Indicates whether the user choosed to accept or refuse the retry. If the
+     * countdown falls to 0, this boolean is switched to true, for an automatic
+     * retry.
+     */
+    boolean retryValidated = false;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param owner The parent frame. Mandatory, as this is a modal dialog.
+     * @param juploadException The exception, which occurs. Used to present an
+     *            error message.
+     * @param numRetry number of the current retry
+     * @param uploadPolicy The upload policy which applies.
+     * @throws JUploadException
+     */
+    public DialogUploadRetry(Frame owner, JUploadException juploadException,
+            int numRetry, UploadPolicy uploadPolicy) throws JUploadException {
+        super(owner, uploadPolicy.getLocalizedString("dialogUploadRetryTitle"),
+                true);
+
+        this.uploadPolicy = uploadPolicy;
+        this.juploadException = juploadException;
+
+        // Creation of the countdown timer.
+        // The number of seconds between two retries is exponentiel: as
+        // parameterized at the beginning, then more and more time between two
+        // uploads.
+        // The first retry should use the applet parameter value, so, we should
+        // have pow(1.5, 0) for this one. Actually, the first call to this
+        // dialog occurs after the first try, so numRetry is 0 then.
+        double retryDelayFactor = Math.pow(1.5, numRetry);
+        this.countdownValue = (int) (uploadPolicy.getRetryNbSecondsBetween() * retryDelayFactor);
+        this.countdownTimer = new Timer(1000, this);
+        this.countdownTimer.start();
+
+        // Creates the components. This must be done in the AWT event
+        // dispatching thread.
+        try {
+            javax.swing.SwingUtilities.invokeAndWait(new Runnable() {
+                public void run() {
+                    createGUI();
+                }
+            });
+        } catch (InterruptedException e) {
+            throw new JUploadException("Error while creating the "
+                    + this.getClass().getName(), e.getCause());
+        } catch (InvocationTargetException e) {
+            throw new JUploadException("Error while creating the "
+                    + this.getClass().getName(), e.getCause());
+        }
+
+        // The dialog is modal: the next line will return when the DialogPicture
+        // is hidden (to be closed, in our case)
+        // But we want to know when it will becom visible, to clear the wait
+        // cursor.
+        setVisible(true);
+
+        // We arrive here, when the dialog is closed.
+    }
+
+    /**
+     * This method allows the caller, to know if the retry of the last upload
+     * should be executed.
+     * 
+     * @return the retryValidated
+     */
+    public boolean isRetryValidated() {
+        return this.retryValidated;
+    }
+
+    /**
+     * Creation of the GUI, based on the current parameters
+     */
+    private void createGUI() {
+        // //////////////////////////////////////////////////////////
+        // //////////// 1) ERROR TEXT AREA (with countdown value)
+        // //////////////////////////////////////////////////////////
+        JPanel jPanelText = new JPanel();
+        this.jtextArea = new JTextArea(this.uploadPolicy.getLocalizedString(
+                "dialogUploadRetryText", this.countdownValue));
+        this.jtextArea.setEditable(false);
+        this.jtextArea.setMinimumSize(new Dimension(400, 100));
+        this.jtextArea.setBackground(jPanelText.getBackground());
+        jPanelText.add(this.jtextArea);
+        getContentPane().add(jPanelText, BorderLayout.CENTER);
+
+        // //////////////////////////////////////////////////////////
+        // //////////// 2) BUTTONS
+        // //////////////////////////////////////////////////////////
+        // Creation of the yes button
+        this.buttonYes = new JButton(this.uploadPolicy
+                .getLocalizedString("buttonYes"));
+        this.buttonYes.setMinimumSize(new Dimension(80, 30));
+        this.buttonYes.setMaximumSize(new Dimension(100, 100));
+        this.buttonYes.addActionListener(this);
+        // Creation of the nobutton
+        this.buttonNo = new JButton(this.uploadPolicy
+                .getLocalizedString("buttonNo"));
+        this.buttonNo.setMinimumSize(new Dimension(80, 30));
+        this.buttonNo.setMaximumSize(new Dimension(100, 100));
+        this.buttonNo.addActionListener(this);
+        // Creation of the nobutton
+        this.buttonDetails = new JButton(this.uploadPolicy
+                .getLocalizedString("buttonDetails"));
+        this.buttonDetails.setMinimumSize(new Dimension(80, 30));
+        this.buttonDetails.setMaximumSize(new Dimension(100, 100));
+        this.buttonDetails.addActionListener(this);
+
+        JPanel jPanelButton = new JPanel();
+        jPanelButton
+                .setLayout(new BoxLayout(jPanelButton, BoxLayout.LINE_AXIS));
+        jPanelButton.setBorder(BorderFactory.createEmptyBorder(0, 10, 10, 10));
+        jPanelButton.add(Box.createHorizontalGlue());
+        jPanelButton.add(this.buttonYes);
+        jPanelButton.add(Box.createRigidArea(new Dimension(10, 0)));
+        jPanelButton.add(this.buttonNo);
+        jPanelButton.add(Box.createRigidArea(new Dimension(10, 0)));
+        jPanelButton.add(this.buttonDetails);
+
+        // //////////////////////////////////////////////////////////
+        // //////////// 3) DETAIL TEXT AREA
+        // //////////////////////////////////////////////////////////
+        JPanel jPanelDetail = new JPanel();
+        this.detailTestArea = new JTextArea(this.juploadException.getMessage());
+        this.detailTestArea.setEditable(false);
+        this.detailTestArea.setMinimumSize(new Dimension(400, 500));
+        this.detailTestArea.setBackground(jPanelDetail.getBackground());
+        jPanelDetail.add(this.detailTestArea);
+        getContentPane().add(jPanelDetail, BorderLayout.CENTER);
+
+        // //////////////////////////////////////////////////////////
+        // //////////// 4) Agregation in the root pane
+        // //////////////////////////////////////////////////////////
+        JPanel mainPanel = new JPanel();
+        mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.PAGE_AXIS));
+        mainPanel.add(this.jtextArea);
+        mainPanel.add(jPanelButton);
+        mainPanel.add(jPanelDetail);
+
+        getContentPane().add(mainPanel);
+        getRootPane().setDefaultButton(this.buttonYes);
+
+        // Let's put all this together.
+        pack();
+
+        // Details are hidden, at the beginning
+        this.detailTestArea.setVisible(false);
+    }
+
+    /**
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    public void actionPerformed(ActionEvent event) {
+        if (event.getSource() == this.countdownTimer) {
+            // One timer event every second.
+            this.countdownValue -= 1;
+            if (this.countdownValue <= 0) {
+                disposeDialog(true);
+            } else {
+                this.jtextArea.setText(this.uploadPolicy.getLocalizedString(
+                        "dialogUploadRetryText", this.countdownValue));
+            }
+        } else if (event.getActionCommand() == this.buttonDetails
+                .getActionCommand()) {
+            this.uploadPolicy
+                    .displayDebug(
+                            "[DialogUploadRetry] User choose to display or hide details",
+                            10);
+            this.detailTestArea.setVisible(!this.detailTestArea.isVisible());
+            // Resizing of the components
+            if (this.detailTestArea.isVisible()) {
+                this.detailTestArea.setMinimumSize(new Dimension(400, 500));
+                this.detailTestArea.setMaximumSize(new Dimension(400, 500));
+            } else {
+                this.detailTestArea.setMinimumSize(new Dimension(0, 0));
+                this.detailTestArea.setMaximumSize(new Dimension(0, 0));
+            }
+        } else if (event.getActionCommand() == this.buttonNo.getActionCommand()) {
+            this.uploadPolicy.displayDebug(
+                    "[DialogUploadRetry] User choose buttonNo", 10);
+            disposeDialog(false);
+        } else if (event.getActionCommand() == this.buttonYes
+                .getActionCommand()) {
+            this.uploadPolicy.displayDebug(
+                    "[DialogUploadRetry] User choose buttonYes", 10);
+            disposeDialog(true);
+        }
+    }
+
+    /**
+     * Actually closes the dialog box, and set the retryValidated status
+     * 
+     * @param retryValidated
+     */
+    private void disposeDialog(boolean retryValidated) {
+        this.retryValidated = retryValidated;
+        this.countdownTimer.stop();
+        this.dispose();
+    }
+
+    /** {@inheritDoc} */
+    public void componentHidden(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentMoved(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentResized(ComponentEvent arg0) {
+        // No action
+    }
+
+    /** {@inheritDoc} */
+    public void componentShown(ComponentEvent arg0) {
+        // We set the cursor back to normal
+        setCursor(new Cursor(Cursor.HAND_CURSOR));
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DnDListener.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DnDListener.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/DnDListener.java	(revision 3951)
@@ -0,0 +1,153 @@
+//
+// $Id: DnDListener.java 997 2010-02-18 10:30:30Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-02-18 08:30:30 -0200 (Qui, 18 Fev 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.UnsupportedFlavorException;
+import java.awt.dnd.DnDConstants;
+import java.awt.dnd.DropTargetDragEvent;
+import java.awt.dnd.DropTargetDropEvent;
+import java.awt.dnd.DropTargetEvent;
+import java.awt.dnd.DropTargetListener;
+import java.io.File;
+import java.io.IOException;
+import java.net.URI;
+import java.net.URISyntaxException;
+import java.util.ArrayList;
+import java.util.List;
+
+import wjhk.jupload2.filedata.DefaultFileData;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Our implementation of DND.
+ * 
+ * @author William JinHua Kwong
+ * @version $Release$
+ */
+public class DnDListener implements DropTargetListener {
+
+    private JUploadPanel uploadPanel;
+
+    private UploadPolicy uploadPolicy;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param uploadPanel The corresponding upload panel.
+     * @param uploadPolicy
+     */
+    public DnDListener(JUploadPanel uploadPanel, UploadPolicy uploadPolicy) {
+        this.uploadPanel = uploadPanel;
+        this.uploadPolicy = uploadPolicy;
+    }
+
+    // DataFlavor javaFileListFlavor = createConstant("application/x-java-file-list;class=java.util.List", null);
+
+    DataFlavor uriListFlavor = new DataFlavor("text/uri-list;class=java.lang.String", null);
+
+
+    /**
+     * @see java.awt.dnd.DropTargetListener#dragEnter(java.awt.dnd.DropTargetDragEvent)
+     */
+    public void dragEnter(DropTargetDragEvent e) {
+      //System.out.println(e);
+      //System.out.println(e.getCurrentDataFlavorsAsList());
+
+        if (!e.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && !e.isDataFlavorSupported(uriListFlavor)) {
+            e.rejectDrag();
+        }
+    }
+
+    /**
+     * @see java.awt.dnd.DropTargetListener#dragOver(java.awt.dnd.DropTargetDragEvent)
+     */
+    public void dragOver(DropTargetDragEvent e) {
+        // Nothing to do.
+    }
+
+    /**
+     * @see java.awt.dnd.DropTargetListener#dropActionChanged(java.awt.dnd.DropTargetDragEvent)
+     */
+    public void dropActionChanged(DropTargetDragEvent e) {
+        // Nothing to do.
+    }
+
+    /**
+     * @see java.awt.dnd.DropTargetListener#drop(java.awt.dnd.DropTargetDropEvent)
+     */
+    @SuppressWarnings("unchecked")
+    public void drop(DropTargetDropEvent e) {
+        if (!e.isDataFlavorSupported(DataFlavor.javaFileListFlavor) && !e.isDataFlavorSupported(uriListFlavor)) {
+            e.rejectDrop();
+        } else {
+            e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
+            try {
+                File[] fileArray;
+
+                if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
+                  List<File> fileList = (List<File>) e.getTransferable()
+                          .getTransferData(DataFlavor.javaFileListFlavor);
+
+                  fileArray = (File[]) (fileList.toArray());
+                } else {
+                  // uriListFlavor; attempt to convert URIs to files
+                  String strList = (String) e.getTransferable()
+                          .getTransferData(uriListFlavor);
+                  //System.out.println(strList);
+                  List<File> fileList = new ArrayList<File>();
+                  for (String s : strList.split("\n")) try {
+                    fileList.add(new File(new URI(s.trim())));
+                  } catch (URISyntaxException ex) {
+                    ex.printStackTrace();
+                    e.rejectDrop();
+                    return;
+                  }
+                  fileArray = (File[]) (fileList.toArray(new File[fileList.size()]));
+                  //System.out.println("fileArray="+Arrays.toString(fileArray));
+                }
+                this.uploadPanel.getFilePanel().addFiles(fileArray,
+                        DefaultFileData.getRoot(fileArray));
+
+                e.getDropTargetContext().dropComplete(true);
+
+                // Let's communicate this to the upload policy: there may be
+                // something to do now.
+                this.uploadPolicy.afterFileDropped(e);
+
+            } catch (IOException ioe) {
+                this.uploadPolicy.displayErr("DnDListener.drop()", ioe);
+                e.rejectDrop();
+            } catch (UnsupportedFlavorException ufe) {
+                this.uploadPolicy.displayErr("DnDListener.drop()", ufe);
+                e.rejectDrop();
+            }
+
+        }
+    }
+
+    /**
+     * @see java.awt.dnd.DropTargetListener#dragExit(java.awt.dnd.DropTargetEvent)
+     */
+    public void dragExit(DropTargetEvent e) {
+        // Nothing to do.
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadMainPopupMenu.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadMainPopupMenu.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadMainPopupMenu.java	(revision 3951)
@@ -0,0 +1,57 @@
+package wjhk.jupload2.gui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.KeyEvent;
+
+import javax.swing.Action;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.KeyStroke;
+import javax.swing.TransferHandler;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * The main contextual menu of the applet. It contains currently, only the paste
+ * action.
+ * 
+ * @author etienne_sf
+ */
+public class JUploadMainPopupMenu extends JPopupMenu {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 4204344561680290852L;
+
+    /**
+     * The current upload policy.
+     */
+    private UploadPolicy uploadPolicy;
+
+    /**
+     * The current upload panel. Can't be retrieve by
+     * uploadPolicy.getAppel().getUploadPanel(), as the menu is cosntructed from
+     * JUploadPanel constructor. That is: the applet did not get the
+     * JUploadPanel reference (getUploadPanel returns null);
+     */
+    @SuppressWarnings("unused")
+    private JUploadPanel uploadPanel;
+
+    JUploadMainPopupMenu(UploadPolicy uploadPolicy, JUploadPanel uploadPanel) {
+        this.uploadPolicy = uploadPolicy;
+        this.uploadPanel = uploadPanel;
+
+        // ////////////////////////////////////////////////////////////////////////
+        // Creation of the menu items
+        // ////////////////////////////////////////////////////////////////////////
+        JMenuItem menuItem = new JMenuItem(this.uploadPolicy.getLocalizedString("menuitem_paste"));
+        menuItem.setActionCommand((String) TransferHandler.getPasteAction()
+                .getValue(Action.NAME));
+        menuItem.addActionListener(uploadPanel.getActionListener());
+        menuItem.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_V,
+                ActionEvent.CTRL_MASK));
+        menuItem.setMnemonic(KeyEvent.VK_P);
+
+        add(menuItem);
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTextArea.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTextArea.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadTextArea.java	(revision 3951)
@@ -0,0 +1,298 @@
+//
+// $Id: JUploadTextArea.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-06-29 16:47:31 -0300 (Ter, 29 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.Color;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+import java.util.concurrent.BlockingQueue;
+import java.util.concurrent.LinkedBlockingQueue;
+
+import javax.swing.JTextArea;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class represents the text area for debug output.
+ */
+@SuppressWarnings("serial")
+public class JUploadTextArea extends JTextArea {
+
+	/**
+	 * Maximum number of characters in the logWindow.
+	 */
+	public final static int MAX_LOG_WINDOW_LENGTH = 800000;
+
+	/**
+	 * The size we truncate the output to, when the maximum size of debug output
+	 * is reach. We remove 20%.
+	 */
+	public final static int SIZE_TO_TRUNCATE_TO = (int) (MAX_LOG_WINDOW_LENGTH * 0.8);
+
+	/**
+	 * The current upload policy
+	 */
+	UploadPolicy uploadPolicy;
+
+	/**
+	 * Indicates whether the logging in the LogMessageThread is active or not.
+	 * It's marked as active before starting this thread. It's marked as
+	 * non-active, when this thread is interrupted, in {@link #unload()}
+	 */
+	boolean loggingActive = false;
+
+	/**
+	 * The ConcurrentLinkedQueue that'll contain the messages.
+	 */
+	private BlockingQueue<String> messages;
+
+	/**
+	 * This value is logged in the debug file, and in the debug output, for each
+	 * line. This allows to sort the outputed line correctly.
+	 * 
+	 * @see #displayMsg(String, String)
+	 */
+	private int messageId = 1;
+
+	/**
+	 * A thread, that will be called in the EventDispatcherThread, to have a
+	 * tread-safe update of the GUI. This thread is responsible to display one
+	 * String.
+	 */
+	static class LogMessageThread extends Thread {
+
+		/**
+		 * The text area that'll contain the messages.
+		 */
+		private JUploadTextArea textArea;
+
+		/**
+		 * @param textArea
+		 */
+		LogMessageThread(JUploadTextArea textArea) {
+			this.textArea = textArea;
+			setDaemon(true);
+		}
+
+		/** The run method of the Runnable Interface */
+		@Override
+		public void run() {
+			String nextMessage = null;
+
+			if (this.textArea.uploadPolicy.getDebugLevel() >= 30) {
+				int messageBackup = this.textArea.messageId;
+				this.textArea.messageId = 0;
+				this.textArea.setText(this.textArea.formatMessageOutput(
+						"[DEBUG]", "Logging system is initialized\n"));
+				this.textArea.messageId = messageBackup;
+			}
+
+			while (this.textArea.loggingActive) {
+				try {
+					nextMessage = this.textArea.messages.take() + "\n";
+
+					// Ah, a new message has been delivered...
+
+					synchronized (this.textArea) {
+						String content = this.textArea.getText();
+						int contentLength = content.length();
+						// If the current content is too long, we truncate it.
+						if (contentLength > JUploadTextArea.MAX_LOG_WINDOW_LENGTH) {
+							content += nextMessage;
+							String newContent = content.substring(content
+									.length()
+									- SIZE_TO_TRUNCATE_TO, content.length());
+							this.textArea.setText(newContent);
+							contentLength = SIZE_TO_TRUNCATE_TO;
+						} else {
+							// The result is not too long
+							this.textArea.append(nextMessage);
+							contentLength += nextMessage.length();
+						}
+						this.textArea.setCaretPosition(contentLength - 1);
+					} // synchronized
+				} catch (InterruptedException e) {
+					// If we're not running any more, then this 'stop' is
+					// not a
+					// problem any more. We're then just notified we must
+					// stop
+					// the thread.
+					if (this.textArea.loggingActive) {
+						// This should not happen, and we can not put in the
+						// standard JUpload output, as this thread is
+						// responsible for it.
+						e.printStackTrace();
+					}
+				}// try
+			}// while
+		}
+	}
+
+	/**
+	 * The thread, that will put messages in the debug log.
+	 */
+	LogMessageThread logMessageThread = null;
+
+	/**
+	 * Constructs a new empty TextArea with the specified number of rows and
+	 * columns.
+	 * 
+	 * @param rows
+	 *            The desired number of text rows (lines).
+	 * @param columns
+	 *            The desired number of columns.
+	 * @param uploadPolicy
+	 *            The current uploadPolicy
+	 */
+	public JUploadTextArea(int rows, int columns, UploadPolicy uploadPolicy) {
+		super(rows, columns);
+		this.uploadPolicy = uploadPolicy;
+		this.messages = new LinkedBlockingQueue<String>();
+		setBackground(new Color(255, 255, 203));
+		setEditable(false);
+		setLineWrap(true);
+		setWrapStyleWord(true);
+
+		// The queue, where messages to display will be posted.
+		this.logMessageThread = new LogMessageThread(this);
+		this.logMessageThread.setName(this.logMessageThread.getClass()
+				.getName());
+		// NO START HERE: the logMessageThread needs to know the upload policy,
+		// to run properly. The thread is started in the setUploadPolicy method.
+
+		// The unload callback will be registered, once the uploadPolicy has
+		// been built, by DefaultJUploadContext.init(JUploadApplet)
+	}
+
+	/**
+	 * Add a string to the queue of string to be added to the logWindow. This is
+	 * necessary, to manage the non-thread-safe Swing environment.
+	 * 
+	 * @param tag
+	 *            The tag (eg: INFO, DEBUG...)
+	 * @param msg
+	 *            The message to add, at the end of the JUploadTextArea.
+	 * @return The formatted text that was added to the log window.
+	 */
+	public final String displayMsg(String tag, String msg) {
+		String fullMessage = formatMessageOutput(tag, msg);
+
+		try {
+			// messages is a BlockingQueue. So the next line may 'block' the
+			// applet main thread. But, we're optimistic: this should not happen
+			// as we instanciate an unbound LinkedBlockingQueue. We'll be
+			// blocked at Integer.MAX_VALUE, that is ... much after an
+			// OutOfMemory is thrown !
+			this.messages.put(fullMessage);
+		} catch (InterruptedException e) {
+			System.out.println("WARNING - [" + this.getClass().getName()
+					+ "] Message lost due to " + e.getClass().getName() + " ("
+					+ fullMessage + ")");
+		}
+		return fullMessage;
+	}
+
+	/**
+	 * This call must be synchronized, so that there is no interaction with the
+	 * LogMessageThread thread.
+	 * 
+	 * @see JTextArea#append(String)
+	 */
+	synchronized public void append(String t) {
+		super.append(t);
+	}
+
+	/**
+	 * This call must be synchronized, so that there is no interaction with the
+	 * LogMessageThread thread.
+	 * 
+	 * @see JTextArea#insert(String, int)
+	 */
+	synchronized public void insert(String str, int pos) {
+		super.insert(str, pos);
+	}
+
+	/**
+	 * This call must be synchronized, so that there is no interaction with the
+	 * LogMessageThread thread.
+	 * 
+	 * @see JTextArea#replaceRange(String, int, int)
+	 */
+	synchronized public void replaceRange(String str, int start, int end) {
+		super.replaceRange(str, start, end);
+	}
+
+	/**
+	 * This call must be synchronized, so that there is no interaction with the
+	 * LogMessageThread thread.
+	 * 
+	 * @see JTextArea#setText(String)
+	 */
+	synchronized public void setText(String t) {
+		super.setText(t);
+	}
+
+	/**
+	 * @param uploadPolicy
+	 *            the uploadPolicy to set
+	 */
+	public void setUploadPolicy(UploadPolicy uploadPolicy) {
+		this.uploadPolicy = uploadPolicy;
+		this.uploadPolicy.getContext().registerUnload(this, "unload");
+		// We can now start the log thread.
+		this.loggingActive = true;
+		this.logMessageThread.start();
+	}
+
+	/**
+	 * Free any used ressources. Actually close the LogMessageThread thread.
+	 */
+	public synchronized void unload() {
+		this.loggingActive = false;
+		this.logMessageThread.interrupt();
+	}
+
+	/**
+	 * Format the message, with the given tag. This method also add the time and
+	 * the Thread name.<BR>
+	 * e.g.:<BR>
+	 * messageId[tab]14:04:30.718[tab]FileUploadManagerThread[tab][DEBUG][tab]
+	 * Found one reader for jpg extension
+	 * 
+	 * @param tag
+	 *            The tag ([WARN], [ERROR]...)
+	 * @param msg
+	 *            The message to format.
+	 * @return The formatted message, without trailing EOL character.
+	 */
+	String formatMessageOutput(String tag, String msg) {
+		final String stamp = String.format("%1$05d", this.messageId++) + " \t"
+				+ new SimpleDateFormat("HH:mm:ss.SSS ").format(new Date())
+				+ "\t" + Thread.currentThread().getName() + "\t" + tag + " \t";
+		while (msg.endsWith("\n")) {
+			msg = msg.substring(0, msg.length() - 1);
+		}
+		return (stamp + msg.replaceAll("\n", "\n" + stamp));
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadDebugPopupMenu.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadDebugPopupMenu.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadDebugPopupMenu.java	(revision 3951)
@@ -0,0 +1,161 @@
+//
+// $Id: JUploadPanelImpl.java 303 2007-07-21 07:42:51 +0000 (sam., 21 juil. 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: etienne_sf
+// Last modified: $Date: 2007-10-08 10:02:41 +0200 (lun., 08 oct. 2007) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+
+import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.PopupMenuEvent;
+import javax.swing.event.PopupMenuListener;
+
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * Global applet popup menu. It currently contains only the debug on/off menu
+ * entry.
+ */
+
+final class JUploadDebugPopupMenu extends JPopupMenu implements ActionListener,
+        ItemListener, PopupMenuListener {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -5473337111643079720L;
+
+    /**
+     * Identifies the menu item that will set debug mode on or off (on means:
+     * debugLevel=100)
+     */
+    JCheckBoxMenuItem cbmiDebugOnOff = null;
+
+    JCheckBoxMenuItem cbmiLogWindowOnOff = null;
+
+    JMenuItem jMenuItemViewLastResponseBody = null;
+
+    JMenuItem jMenuItemClearLogWindowContent = null;
+
+    JMenuItem jMenuItemCopyLogWindowContent = null;
+
+    /**
+     * The current upload policy.
+     */
+    private UploadPolicy uploadPolicy;
+
+    JUploadDebugPopupMenu(UploadPolicy uploadPolicy) {
+        this.uploadPolicy = uploadPolicy;
+
+        this.addPopupMenuListener(this);
+
+        // ////////////////////////////////////////////////////////////////////////
+        // Creation of the menu items
+        // ////////////////////////////////////////////////////////////////////////
+        // First: debug on or off
+        this.cbmiDebugOnOff = new JCheckBoxMenuItem("Debug enabled");
+        this.cbmiDebugOnOff.setState(this.uploadPolicy.getDebugLevel() == 100);
+        add(this.cbmiDebugOnOff);
+        this.cbmiDebugOnOff.addItemListener(this);
+        // Show or hide the log window
+        this.cbmiLogWindowOnOff = new JCheckBoxMenuItem("Show log window");
+        this.cbmiLogWindowOnOff.setState(this.uploadPolicy.getShowLogWindow()
+                .equals("true"));
+        add(this.cbmiLogWindowOnOff);
+        this.cbmiLogWindowOnOff.addItemListener(this);
+        // Clear the last stringResponseBody
+        this.jMenuItemClearLogWindowContent = new JMenuItem(
+                "Clear the log window content");
+        add(this.jMenuItemClearLogWindowContent);
+        this.jMenuItemClearLogWindowContent.addActionListener(this);
+        // Copy the last stringResponseBody
+        this.jMenuItemCopyLogWindowContent = new JMenuItem(
+                "Copy the log window content");
+        add(this.jMenuItemCopyLogWindowContent);
+        this.jMenuItemCopyLogWindowContent.addActionListener(this);
+        // View the last stringResponseBody
+        this.jMenuItemViewLastResponseBody = new JMenuItem(
+                "View last response body");
+        add(this.jMenuItemViewLastResponseBody);
+        this.jMenuItemViewLastResponseBody.addActionListener(this);
+        // ////////////////////////////////////////////////////////////////////////
+    }
+
+    /**
+     * @see java.awt.event.ItemListener#itemStateChanged(java.awt.event.ItemEvent)
+     */
+    public void itemStateChanged(ItemEvent e) {
+        if (this.cbmiDebugOnOff == e.getItem()) {
+            this.uploadPolicy
+                    .setDebugLevel((this.cbmiDebugOnOff.isSelected() ? 100 : 0));
+        } else if (this.cbmiLogWindowOnOff == e.getItem()) {
+            if (this.cbmiLogWindowOnOff.isSelected()) {
+                this.uploadPolicy
+                        .setShowLogWindow(UploadPolicy.SHOWLOGWINDOW_TRUE);
+            } else {
+                this.uploadPolicy
+                        .setShowLogWindow(UploadPolicy.SHOWLOGWINDOW_FALSE);
+            }
+        }
+    }
+
+    /**
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    public void actionPerformed(ActionEvent e) {
+        if (this.jMenuItemViewLastResponseBody == e.getSource()) {
+            try {
+                new DebugDialog(null, this.uploadPolicy.getLastResponseBody(),
+                        this.uploadPolicy);
+            } catch (JUploadIOException e1) {
+                this.uploadPolicy.displayErr(e1);
+            }
+        } else if (this.jMenuItemClearLogWindowContent == e.getSource()) {
+            this.uploadPolicy.getContext().getUploadPanel().clearLogWindow();
+        } else if (this.jMenuItemCopyLogWindowContent == e.getSource()) {
+            this.uploadPolicy.getContext().getUploadPanel().copyLogWindow();
+        }
+    }
+
+    /** @see javax.swing.event.PopupMenuListener#popupMenuCanceled(javax.swing.event.PopupMenuEvent) */
+    public void popupMenuCanceled(PopupMenuEvent arg0) {
+        // Nothing to do.
+    }
+
+    /** @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeInvisible(javax.swing.event.PopupMenuEvent) */
+    public void popupMenuWillBecomeInvisible(PopupMenuEvent arg0) {
+        // Nothing to do.
+    }
+
+    /**
+     * Set the "View last response body" menu enabled or disabled.
+     * 
+     * @see javax.swing.event.PopupMenuListener#popupMenuWillBecomeVisible(javax.swing.event.PopupMenuEvent)
+     */
+    public void popupMenuWillBecomeVisible(PopupMenuEvent arg0) {
+        String s = this.uploadPolicy.getLastResponseBody();
+        this.jMenuItemViewLastResponseBody.setEnabled(s != null
+                && !s.equals(""));
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanel.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanel.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/JUploadPanel.java	(revision 3951)
@@ -0,0 +1,208 @@
+//
+// $Id: JUploadPanelImpl.java 303 2007-07-21 07:42:51 +0000 (sam., 21 juil.
+// 2007)
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-02-09 08:32:18 -0200 (Ter, 09 Fev 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.gui;
+
+import java.awt.event.ActionListener;
+import java.awt.event.MouseEvent;
+import java.awt.event.MouseListener;
+
+import javax.swing.JButton;
+import javax.swing.JComponent;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.JScrollPane;
+import javax.swing.TransferHandler;
+
+import wjhk.jupload2.gui.filepanel.FilePanel;
+import wjhk.jupload2.upload.FileUploadManagerThread;
+
+/**
+ * Interface for the central object of the JUpload GUI. It creates and contains
+ * all GUI items: creation of necessary elements, and calls to
+ * {@link wjhk.jupload2.policies.UploadPolicy} methods to allow easy
+ * personalization.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public interface JUploadPanel {
+
+    /**
+     * This methods show or hides the logWindow, depending on the following
+     * applet parameters. The following conditions must be met, to hide the log
+     * window: <DIR> <LI>showLogWindow (must be False) <LI>debugLevel (must be 0
+     * or less) </DIR>
+     */
+    public void showOrHideLogWindow();
+
+    /**
+     * Reaction to a click on the browse button.
+     */
+    public void doBrowse();
+
+    /**
+     * Reaction to a click on the remove button. This method actually removes
+     * the selected files in the file list.
+     */
+    public void doRemove();
+
+    /**
+     * Reaction to a click on the removeAll button. This method actually removes
+     * all the files in the file list.
+     */
+    public void doRemoveAll();
+
+    /**
+     * Reaction to a click on the upload button. This method can be called from
+     * outside to start the upload.
+     */
+    public void doStartUpload();
+
+    /**
+     * Reaction to a click on the stop button. This stops the running on upload.
+     * This method can be called from outside to start the upload.
+     */
+    public void doStopUpload();
+
+    /**
+     * Select or unselect the applet buttons
+     */
+    public void updateButtonState();
+
+    /** Clear the current log window content. */
+    public void clearLogWindow();
+
+    /**
+     * Copy the log window content into the clipboard. Allows easy access to the
+     * debug output.
+     * 
+     */
+    public void copyLogWindow();
+
+    /**
+     * @return the actionListener, that'll manage the button interaction.
+     */
+    public ActionListener getActionListener();
+
+    /**
+     * @return the browseButton
+     */
+    public JButton getBrowseButton();
+
+    /**
+     * Returns the awt container, that contains all the objects of the GUI.
+     * 
+     * @return The Container.
+     */
+    public JComponent getJComponent();
+
+    /**
+     * @return the dndListener
+     */
+    public DnDListener getDndListener();
+
+    /**
+     * @return the filePanel
+     */
+    public FilePanel getFilePanel();
+
+    /**
+     * The component that contains the log window. It is used to display the
+     * content of the log window, with the relevant scroll bars.
+     * 
+     * @return the jLogWindowPane
+     */
+    public JScrollPane getJLogWindowPane();
+
+    /**
+     * The component that manages the mouse.
+     * 
+     * @return the MouseListener
+     */
+    public MouseListener getMouseListener();
+
+    /**
+     * @return the preparationProgressBar
+     */
+    public JProgressBar getPreparationProgressBar();
+
+    /**
+     * @return the uploadProgressBar
+     */
+    public JProgressBar getUploadProgressBar();
+
+    /**
+     * @return the removeAllButton
+     */
+    public JButton getRemoveAllButton();
+
+    /**
+     * @return the removeButton
+     */
+    public JButton getRemoveButton();
+
+    /**
+     * @return the statusLabel
+     */
+    public JLabel getStatusLabel();
+
+    /**
+     * @return the stopButton
+     */
+    public JButton getStopButton();
+
+    /**
+     * @see JPanel#getTransferHandler()
+     * 
+     * @return The TransfertHandler
+     */
+    public TransferHandler getTransferHandler();
+
+    /**
+     * @return the uploadButton
+     */
+    public JButton getUploadButton();
+
+    /**
+     * This method opens the popup menu, if the mouseEvent is relevant. In this
+     * case it returns true. Otherwise, it does nothing and returns false.
+     * 
+     * @param mouseEvent The triggered mouse event.
+     * @return true if the popup menu was opened, false otherwise.
+     */
+    public boolean maybeOpenPopupMenu(MouseEvent mouseEvent);
+
+    /**
+     * Standard setter for filePanel.
+     * 
+     * @param filePanel
+     */
+    public void setFilePanel(FilePanel filePanel);
+
+    /**
+     * @return the fileUploadManagerThread
+     */
+    public FileUploadManagerThread getFileUploadManagerThread();
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/gui/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/gui/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/gui/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+Implementation of caching and special algorithms for various file types.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPConnectionHelper.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPConnectionHelper.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPConnectionHelper.java	(revision 3951)
@@ -0,0 +1,933 @@
+//
+// $Id: FileUploadThreadHTTP.java 488 2008-07-06 20:21:43Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-03-07
+// Creator: etienne_sf
+// Last modified: $Date: 2008-07-06 22:21:43 +0200 (dim., 06 juil. 2008) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.io.BufferedOutputStream;
+import java.io.DataOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.PushbackInputStream;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.Socket;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class contains utilities to delegate network manipulation. It hides the
+ * management for the current upload policy connection parameters.<BR>
+ * This class goes through the following states, stored in the private
+ * connectionStatus attribute: <DIR> <LI>STATUS_NOT_INITIALIZED: default status
+ * when the instance in created. Only available action:
+ * {@link #initRequest(URL, String, boolean, boolean)} <LI>
+ * STATUS_BEFORE_SERVER_CONNECTION: the instance is initialized, and the caller
+ * may begin writing the request to this HttpConnectionHelper. All data written
+ * to it, will be stored in a {@link ByteArrayEncoderHTTP}. The connection
+ * switches to this status when the
+ * {@link #initRequest(URL, String, boolean, boolean)} is called. <LI>
+ * STATUS_WRITING_REQUEST: The network connection to the server is now opened.
+ * The content of the ByteArrayEncoderHTTP has been sent to the server. All
+ * subsequent calls to write methods will directly write on the socket to the
+ * server. The {@link #sendRequest()} method changes the connection to this
+ * status. <LI>STATUS_READING_RESPONSE: The request to the server has been
+ * totally written. No more calls to the write methods are allowed. The
+ * {@link #readHttpResponse()} is responsible to put the HttpConnectionHelper to
+ * this status. <LI>STATUS_CONNECTION_CLOSED: The response has been read. All
+ * getters can be called, to get information about the server response. The only
+ * other method allowed is the
+ * {@link #initRequest(URL, String, boolean, boolean)}, to start a new request
+ * to the server. Using the same HttpConnectionHelper allows to use the same
+ * network connection, when the allowHttpPersistent applet parameter is used.
+ * </DIR>
+ * 
+ * @author etienne_sf
+ */
+public class HTTPConnectionHelper extends OutputStream {
+
+	// FIXME Does HTTPConnectionHelper really need to be an OutputStream? (Find
+	// Bug generate not closed exception)
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// PRIVATE CONSTANTS
+	// ////////////////////////////////////////////////////////////////////////////////////
+	/**
+	 * Indicates that the connection has not been initialized. The only
+	 * authorized action in this state is a call to
+	 * {@link #initRequest(URL, String, boolean, boolean)}.
+	 */
+	final static private int STATUS_NOT_INITIALIZED = 0;
+
+	/**
+	 * Indicates that the network connection to the server has not been opened.
+	 * All data sent to the HttpConnectionHelper with write methods are sent to
+	 * the current ByteArrayEncoder.
+	 */
+	final static private int STATUS_BEFORE_SERVER_CONNECTION = 1;
+
+	/**
+	 * Indicates that the network connection to the server is opened, but the
+	 * request has not been totally sent to the server. All data sent to the
+	 * HttpConnectionHelper with write methods is sent to the network
+	 * connection, that is: to the current OutputStream. <BR>
+	 * That is: the ByteArrayEncoder is now read only (closed).
+	 */
+	final static private int STATUS_WRITING_REQUEST = 2;
+
+	/**
+	 * Indicates that the network connection to the server is opened, but the
+	 * request has not been totally sent to the server. All data sent to the
+	 * HttpConnectionHelper with write methods is sent to the network
+	 * connection, that is: to the current OutputStream. <BR>
+	 * That is: the ByteArrayEncoder is now read only (closed).
+	 */
+	final static private int STATUS_READING_RESPONSE = 3;
+
+	/**
+	 * Indicates that the network connection to the server is now closed, that
+	 * is: we've written the request, read the response, and free the server
+	 * connection. If the keepAlive parameter is used, the connection may remain
+	 * opened for the next request. <BR>
+	 * No more action may be done on this connection helper, out of reading
+	 * data, until the application do a call to
+	 * {@link #initRequest(URL, String, boolean, boolean)}.
+	 */
+	final static private int STATUS_CONNECTION_CLOSED = 4;
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// ATTRIBUTE USED TO CONTROL THE OUTPUT TO THE SERVER
+	// ////////////////////////////////////////////////////////////////////////////////////
+	/**
+	 * http boundary, for the posting multipart post.
+	 */
+	private String boundary = calculateRandomBoundary();
+
+	/**
+	 * Is chunk upload on for this request ?
+	 */
+	private boolean bChunkEnabled;
+
+	/**
+	 * Is it the last chunk ? If yes, we'll try to keep the connection open,
+	 * according to the current applet configuration.
+	 */
+	private boolean bLastChunk;
+
+	/**
+	 * The encoder that will contain the HTTP request.
+	 */
+	private ByteArrayEncoder byteArrayEncoder = null;
+
+	/**
+	 * Indicates where data sent to appendXxx method should be added. It must be
+	 * one of the SENDING_XXX private strings.
+	 */
+	private int connectionStatus = STATUS_NOT_INITIALIZED;
+
+	/**
+	 * Contains the HTTP reader. All data coming from the server response are
+	 * read from it. If this attribute is null, it means that the server
+	 * response has not been read.
+	 */
+	private HTTPInputStreamReader httpInputStreamReader = null;
+
+	/**
+	 * This stream allows the applet to get the server response. It is opened
+	 * and closed as the {@link #outputStream}.
+	 */
+	private PushbackInputStream inputStream = null;
+
+	/**
+	 * The HTTP method: POST, GET, HEAD...
+	 */
+	private String method = null;
+
+	/**
+	 * This stream is open by {@link #sendRequest()}. It is closed by the
+	 * {@link #readHttpResponse()} method.
+	 * 
+	 * @see #sendRequest()
+	 * @see #readHttpResponse()
+	 * @see #getOutputStream()
+	 */
+	private DataOutputStream outputStream = null;
+
+	/**
+	 * The current proxy, if any
+	 */
+	private Proxy proxy = null;
+
+	/**
+	 * The network socket where the bytes should be written.
+	 */
+	private Socket socket = null;
+
+	/**
+	 * The current upload policy
+	 */
+	private UploadPolicy uploadPolicy = null;
+
+	/**
+	 * The current URL
+	 */
+	private URL url = null;
+
+	/**
+	 * Should we use a proxy
+	 */
+	private boolean useProxy;
+
+	/**
+	 * Is SSL mode on ?
+	 */
+	private boolean useSSL;
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// PUBLIC METHODS
+	// ////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * The standard constructor for this class.
+	 * 
+	 * @param uploadPolicy
+	 *            The current upload policy.
+	 */
+	public HTTPConnectionHelper(UploadPolicy uploadPolicy) {
+		this.uploadPolicy = uploadPolicy;
+	}
+
+	/**
+	 * The standard constructor for this class.
+	 * 
+	 * @param url
+	 *            The target URL
+	 * @param method
+	 *            The HTTP method (POST, GET, HEAD...)
+	 * @param bChunkEnabled
+	 *            Indicates if chunkUpload is enabled for this query. Put false,
+	 *            if non chunked request or if it is not relevant.
+	 * @param bLastChunk
+	 *            Indicates whether this chunk is the last one. Put true, if non
+	 *            chunked request or if it is not relevant.
+	 * @param uploadPolicy
+	 *            The current upload policy.
+	 * @throws JUploadIOException
+	 */
+	public HTTPConnectionHelper(URL url, String method, boolean bChunkEnabled,
+			boolean bLastChunk, UploadPolicy uploadPolicy)
+			throws JUploadIOException {
+		this.uploadPolicy = uploadPolicy;
+		initRequest(url, method, bChunkEnabled, bLastChunk);
+	}
+
+	/**
+	 * The standard constructor for this class.
+	 * 
+	 * @param url
+	 *            The target URL
+	 * @param bChunkEnabled
+	 *            Indicates if chunkUpload is enabled for this query. Put false,
+	 *            if non chunked request or if it is not relevant.
+	 * @param method
+	 *            The HTTP method (POST, GET, HEAD...)
+	 * @param bLastChunk
+	 *            Indicates whether this chunk is the last one. Put true, if non
+	 *            chunked request or if it is not relevant.
+	 * @throws JUploadIOException
+	 */
+	public synchronized void initRequest(URL url, String method,
+			boolean bChunkEnabled, boolean bLastChunk)
+			throws JUploadIOException {
+		// This method expects that the connection has not been initialized yet,
+		// or that the previous request is finished.
+		if (this.connectionStatus != STATUS_NOT_INITIALIZED
+				&& this.connectionStatus != STATUS_CONNECTION_CLOSED) {
+			throw new JUploadIOException(
+					"Bad status of the HttpConnectionHelper in initRequest: "
+							+ getStatusLabel());
+		}
+
+		// Clean any current request.
+		if (isKeepAlive()) {
+			dispose();
+		}
+
+		// Load the new parameters.
+		this.url = url;
+		this.method = method;
+		this.bChunkEnabled = bChunkEnabled;
+		this.bLastChunk = bLastChunk;
+		// We will write to the local ByteArrayEncoder, until a connection to
+		// the server is opened.
+		initByteArrayEncoder();
+
+		// Ok, the HttpConnectionHelper is now ready to get write commands.
+		this.connectionStatus = STATUS_BEFORE_SERVER_CONNECTION;
+	}
+
+	/**
+	 * Return the current {@link ByteArrayEncoder}. If it was not created, it is
+	 * initialized.
+	 * 
+	 * @return The current {@link ByteArrayEncoder}, null if called before the
+	 *         first initialization.
+	 * @throws JUploadIOException
+	 * @see #initRequest(URL, String, boolean, boolean)
+	 */
+	public ByteArrayEncoder getByteArrayEncoder() throws JUploadIOException {
+		return this.byteArrayEncoder;
+	}
+
+	/**
+	 * @return Returns the boundary for this HTTP request.
+	 */
+	public String getBoundary() {
+		return this.boundary;
+	}
+
+	/**
+	 * Closes the byteArrayEncoder, create the socket (or not, depending on the
+	 * current uploadPolicy, and upload history), send the request, and create
+	 * the InputStream to read the server response.
+	 * 
+	 * @throws JUploadIOException
+	 */
+	public synchronized void sendRequest() throws JUploadIOException {
+		// This method expects that the connection is writing data to the
+		// server.
+		if (this.connectionStatus != STATUS_BEFORE_SERVER_CONNECTION) {
+			throw new JUploadIOException(
+					"Bad status of the HttpConnectionHelper in sendRequest: "
+							+ getStatusLabel());
+		}
+
+		try {
+			// We've finished with the current encoder.
+			if (!this.byteArrayEncoder.isClosed()) {
+				this.byteArrayEncoder.close();
+			}
+
+			// Let's clear any field that could have been read in a previous
+			// step:
+			this.httpInputStreamReader = null;
+
+			// Only connect, if sock is null!!
+			// ... or if we don't persist HTTP connections (patch for IIS, based
+			// on Marc Reidy's patch)
+			if (this.socket == null
+					|| !this.uploadPolicy.getAllowHttpPersistent()) {
+				this.socket = new HttpConnect(this.uploadPolicy).connect(
+						this.url, this.proxy);
+				this.outputStream = new DataOutputStream(
+						new BufferedOutputStream(this.socket.getOutputStream()));
+				this.inputStream = new PushbackInputStream(this.socket
+						.getInputStream(), 1);
+			}
+
+			// Send http request to server
+			this.outputStream
+					.write(this.byteArrayEncoder.getEncodedByteArray());
+
+			// The request has been sent. The current ByteArrayEncoder is now
+			// useless. A new one is to be created for the next request.
+			this.connectionStatus = STATUS_WRITING_REQUEST;
+
+		} catch (IOException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (KeyManagementException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (UnrecoverableKeyException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (NoSuchAlgorithmException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (KeyStoreException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (CertificateException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		} catch (IllegalArgumentException e) {
+			throw new JUploadIOException("Unable to open socket", e);
+		}
+
+	}
+
+	/**
+	 * Releases all reserved resources.
+	 * 
+	 * @throws JUploadIOException
+	 */
+	public synchronized void dispose() throws JUploadIOException {
+		// A try to properly clean the connection to the server.
+		try {
+			// Let's shutdown the output, to free the server connection. Only
+			// valid for non https connections.
+			if (this.socket != null && !this.useSSL
+					&& !this.socket.isOutputShutdown()) {
+				this.socket.shutdownOutput();
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		}
+		try {
+			if (this.socket != null && !this.useSSL
+					&& !this.socket.isInputShutdown()) {
+				this.socket.shutdownInput();
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		}
+
+		try {
+			if (this.outputStream != null) {
+				this.outputStream.close();
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		} finally {
+			this.outputStream = null;
+		}
+
+		try {
+			if (this.inputStream != null) {
+				this.inputStream.close();
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		} finally {
+			this.inputStream = null;
+		}
+
+		try {
+			if (this.socket != null) {
+				if (!this.socket.isClosed()) {
+					this.socket.close();
+				}
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		} finally {
+			this.socket = null;
+		}
+	}
+
+	/**
+	 * Return the current socket. If the byteArrayEncoder is not closed: close
+	 * it, and send the request to the server.
+	 * 
+	 * @return public Socket getSocket() { }
+	 */
+
+	/**
+	 * get the output stream, where HTTP data can be written.
+	 * 
+	 * @return The current output stream to the server, where things can be
+	 *         written, event after the socket is open, if the byteArrayEncoder
+	 *         did not contain the full request.
+	 */
+	public OutputStream getOutputStream() {
+		return this;
+	}
+
+	/**
+	 * get the input stream, where HTTP server response can be read.
+	 * 
+	 * @return The current input stream of the socket.
+	 */
+	public PushbackInputStream getInputStream() {
+		return this.inputStream;
+	}
+
+	/**
+	 * Get the HTTP method (HEAD, POST, GET...)
+	 * 
+	 * @return The HTTP method
+	 */
+	public String getMethod() {
+		return this.method;
+	}
+
+	/**
+	 * Get the last response body.
+	 * 
+	 * @return The full response body, that is: the HTTP body of the server
+	 *         response.
+	 */
+	public String getResponseBody() {
+		return this.httpInputStreamReader.getResponseBody();
+	}
+
+	/**
+	 * Get the headers of the HTTP response.
+	 * 
+	 * @return The HTTP headers.
+	 */
+	public String getResponseHeaders() {
+		return this.httpInputStreamReader.getResponseHeaders();
+	}
+
+	/**
+	 * Get the last response message.
+	 * 
+	 * @return the response message, like "200 OK"
+	 */
+	public String getResponseMsg() {
+		return this.httpInputStreamReader.getResponseMsg();
+	}
+
+	/**
+	 * Get the label describing the current state of this connection helper.
+	 * 
+	 * @return A text describing briefly the current connection status.
+	 */
+	public synchronized String getStatusLabel() {
+		switch (this.connectionStatus) {
+		case STATUS_NOT_INITIALIZED:
+			return "Not initialized";
+		case STATUS_BEFORE_SERVER_CONNECTION:
+			return "Before server connection";
+		case STATUS_WRITING_REQUEST:
+			return "Writing request to the network";
+		case STATUS_READING_RESPONSE:
+			return "Reading server response";
+		case STATUS_CONNECTION_CLOSED:
+			return "Connection closed";
+		}
+		return "Unknown status in HTTPConnectionHelper.getStatusLabel()";
+	}
+
+	/**
+	 * Get the current socket.
+	 * 
+	 * @return return the current Socket, opened toward the server.
+	 */
+	Socket getSocket() {
+		return this.socket;
+	}
+
+	/**
+	 * Append bytes to the current query. The bytes will be written to the
+	 * current ByteArrayEncoder if the the connection to the server is not open,
+	 * or directly to the server if the connection is opened.
+	 * 
+	 * @param b
+	 *            The byte to send to the server.
+	 * @return Returns the current HttpConnectionHelper, to allow coding like
+	 *         StringBuffers: a.append(b).append(c);
+	 * @throws JUploadIOException
+	 */
+	public synchronized HTTPConnectionHelper append(int b)
+			throws JUploadIOException {
+		if (this.connectionStatus == STATUS_BEFORE_SERVER_CONNECTION) {
+			this.byteArrayEncoder.append(b);
+		} else if (this.connectionStatus == STATUS_WRITING_REQUEST) {
+			try {
+				this.outputStream.write(b);
+			} catch (IOException e) {
+				throw new JUploadIOException(e.getClass().getName()
+						+ " while writing to httpDataOut", e);
+			}
+		} else {
+			throw new JUploadIOException(
+					"Wrong status in HTTPConnectionHelper.write() ["
+							+ getStatusLabel() + "]");
+		}
+		return this;
+	}
+
+	/**
+	 * Append bytes to the current query. The bytes will be written to the
+	 * current ByteArrayEncoder if the the connection to the server is not open,
+	 * or directly to the server if the connection is opened.
+	 * 
+	 * @param bytes
+	 *            The bytes to send to the server.
+	 * @return Returns the current HttpConnectionHelper, to allow coding like
+	 *         StringBuffers: a.append(b).append(c);
+	 * @throws JUploadIOException
+	 */
+	public synchronized HTTPConnectionHelper append(byte[] bytes)
+			throws JUploadIOException {
+		return this.append(bytes, 0, bytes.length);
+	}
+
+	/**
+	 * Append bytes to the current query. The bytes will be written to the
+	 * current ByteArrayEncoder if the the connection to the server is not open,
+	 * or directly to the server if the connection is opened.
+	 * 
+	 * @param bytes
+	 *            The bytes to send to the server.
+	 * @param off
+	 *            The first byte to send
+	 * @param len
+	 *            Number of bytes to send.
+	 * @return Returns the current HttpConnectionHelper, to allow coding like
+	 *         StringBuffers: a.append(b).append(c);
+	 * @throws JUploadIOException
+	 */
+	public synchronized HTTPConnectionHelper append(byte[] bytes, int off,
+			int len) throws JUploadIOException {
+
+		if (this.connectionStatus == STATUS_BEFORE_SERVER_CONNECTION) {
+			this.byteArrayEncoder.append(bytes);
+		} else if (this.connectionStatus == STATUS_WRITING_REQUEST) {
+			try {
+				this.outputStream.write(bytes, off, len);
+			} catch (IOException e) {
+				throw new JUploadIOException(e.getClass().getName()
+						+ " while writing to httpDataOut", e);
+			}
+		} else {
+			throw new JUploadIOException(
+					"Wrong status in HTTPConnectionHelper.write() ["
+							+ getStatusLabel() + "]");
+		}
+
+		if (this.uploadPolicy.getDebugLevel() > 100) {
+			this.uploadPolicy
+					.displayDebug(
+							"[HTTPConnectionHelper append(byte[],int,int)] ("
+									+ len
+									+ " bytes appended to "
+									+ (this.connectionStatus == STATUS_BEFORE_SERVER_CONNECTION ? " current ByteArrayEncoder"
+											: " socket") + ")", 101);
+		}
+
+		return this;
+	}
+
+	/**
+	 * write a string to the current HTTP request.
+	 * 
+	 * @param str
+	 *            The string to write
+	 * @return The current HTTPConnectionHelper
+	 * @throws JUploadIOException
+	 *             If any problem occurs during the writing operation.
+	 * @see #append(byte[])
+	 */
+	public synchronized HTTPConnectionHelper append(String str)
+			throws JUploadIOException {
+		this.uploadPolicy.displayDebug("[HTTPConnectionHelper append] " + str,
+				70);
+		if (this.connectionStatus == STATUS_BEFORE_SERVER_CONNECTION) {
+			this.byteArrayEncoder.append(str);
+		} else if (this.connectionStatus == STATUS_WRITING_REQUEST) {
+			ByteArrayEncoder bae = new ByteArrayEncoderHTTP(this.uploadPolicy,
+					this.byteArrayEncoder.getBoundary(), this.byteArrayEncoder
+							.getEncoding());
+			bae.append(str);
+			bae.close();
+			this.append(bae);
+		}
+		return this;
+	}
+
+	/**
+	 * Appends a string to the current HTTP request.
+	 * 
+	 * @param bae
+	 *            The ByteArrayEncoder to write. It is expected to be correctly
+	 *            encoded. That is: it is up to the caller to check that its
+	 *            encoding is the same as the current HTTP request encoding.
+	 * @return The current HTTPConnectionHelper
+	 * @throws JUploadIOException
+	 *             If any problem occurs during the writing operation.
+	 * @see #append(byte[])
+	 */
+	public synchronized HTTPConnectionHelper append(ByteArrayEncoder bae)
+			throws JUploadIOException {
+		this.uploadPolicy.displayDebug("[HTTPConnectionHelper append] "
+				+ bae.getString(), 70);
+		return this.append(bae.getEncodedByteArray());
+	}
+
+	/**
+	 * Read the response of the server. This method delegates the work to the
+	 * HTTPInputStreamReader. handles the chunk HTTP response.
+	 * 
+	 * @return The HTTP status. Should be 200, when everything is right.
+	 * @throws JUploadException
+	 */
+	public synchronized int readHttpResponse() throws JUploadException {
+		// This method expects that the connection is writing data to the
+		// server.
+		if (this.connectionStatus != STATUS_WRITING_REQUEST) {
+			throw new JUploadIOException(
+					"Bad status of the HttpConnectionHelper in readHttpResponse: "
+							+ getStatusLabel());
+		}
+		this.connectionStatus = STATUS_READING_RESPONSE;
+
+		// Let's connect in InputStream to read this server response.
+		if (this.httpInputStreamReader == null) {
+			this.httpInputStreamReader = new HTTPInputStreamReader(this,
+					this.uploadPolicy);
+		}
+
+		// Let's do the job
+		try {
+			this.outputStream.flush();
+		} catch (IOException ioe) {
+			throw new JUploadIOException("flushing outputStream, in "
+					+ getClass().getName() + ".readHttpResponse()");
+		}
+		this.httpInputStreamReader.readHttpResponse();
+
+		if (this.httpInputStreamReader.gotClose) {
+			// RFC 2868, section 8.1.2.1
+			dispose();
+		}
+
+		// We got the response
+		this.connectionStatus = STATUS_CONNECTION_CLOSED;
+
+		// FIXME Should close the connection, from time to time...
+
+		//
+		return this.httpInputStreamReader.gethttpStatusCode();
+	}
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// PRIVATE METHODS
+	// ////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * creating of a new {@link ByteArrayEncoderHTTP}, and initializing of the
+	 * following header items: First line (POST currentProtocol URI), Host,
+	 * Connection, Keep-Alive, Proxy-Connection.
+	 * 
+	 * @throws JUploadIOException
+	 */
+	private synchronized void initByteArrayEncoder() throws JUploadIOException {
+		if (this.byteArrayEncoder != null && !this.byteArrayEncoder.isClosed()) {
+			this.byteArrayEncoder.close();
+			this.byteArrayEncoder = null;
+		}
+		this.byteArrayEncoder = new ByteArrayEncoderHTTP(this.uploadPolicy,
+				this.boundary);
+		this.connectionStatus = STATUS_BEFORE_SERVER_CONNECTION;
+		this.proxy = null;
+		try {
+			this.proxy = ProxySelector.getDefault().select(this.url.toURI())
+					.get(0);
+		} catch (URISyntaxException e) {
+			throw new JUploadIOException("Error while managing url "
+					+ this.url.toExternalForm(), e);
+		}
+		this.useProxy = ((this.proxy != null) && (this.proxy.type() != Proxy.Type.DIRECT));
+		this.useSSL = this.url.getProtocol().equals("https");
+
+		// Header: Request line
+		// Let's clear it. Useful only for chunked uploads.
+		this.byteArrayEncoder.append(this.method);
+		this.byteArrayEncoder.append(" ");
+		this.uploadPolicy.displayDebug("[initByteArrayEncoder] proxy=" + proxy
+				+ ", proxy.type=" + this.proxy.type() + ", useProxy="
+				+ useProxy + ", url.host=" + this.url.getHost() + ", url.port="
+				+ this.url.getPort(), 80);
+		if (this.useProxy && (!this.useSSL)) {
+			// with a proxy we need the absolute URL, but only if not
+			// using SSL. (with SSL, we first use the proxy CONNECT method,
+			// and then a plain request.)
+			this.byteArrayEncoder.append(this.url.getProtocol()).append("://")
+					.append(this.url.getHost());
+			// TODO port in proxy mode: to be tested !
+			if (this.url.getPort() > 0) {
+				this.byteArrayEncoder.append(":").append(
+						Integer.toString(this.url.getPort()));
+			}
+		}
+		this.byteArrayEncoder.append(this.url.getPath());
+
+		// Append the query params.
+		// TODO: This probably can be removed as we now have everything in POST
+		// data. However in order to be
+		// backwards-compatible, it stays here for now. So we now provide
+		// *both* GET and POST params.
+		if (null != this.url.getQuery() && !"".equals(this.url.getQuery()))
+			this.byteArrayEncoder.append("?").append(this.url.getQuery());
+
+		this.byteArrayEncoder.append(" ").append(
+				this.uploadPolicy.getServerProtocol()).append("\r\n");
+
+		// Header: General
+		this.byteArrayEncoder.append("Host: ").append(this.url.getHost())
+				.append("\r\nAccept: */*\r\n");
+		// We do not want gzipped or compressed responses, so we must
+		// specify that here (RFC 2616, Section 14.3)
+		this.byteArrayEncoder.append("Accept-Encoding: identity\r\n");
+
+		// Seems like the Keep-alive doesn't work properly, at least on my
+		// local dev (Etienne).
+		if (!this.uploadPolicy.getAllowHttpPersistent()) {
+			this.byteArrayEncoder.append("Connection: close\r\n");
+		} else {
+			if (!this.bChunkEnabled
+					|| this.bLastChunk
+					|| this.useProxy
+					|| !this.uploadPolicy.getServerProtocol()
+							.equals("HTTP/1.1")) { // RFC 2086, section 19.7.1
+				this.byteArrayEncoder.append("Connection: close\r\n");
+			} else {
+				this.byteArrayEncoder.append("Keep-Alive: 300\r\n");
+				if (this.useProxy)
+					this.byteArrayEncoder
+							.append("Proxy-Connection: keep-alive\r\n");
+				else
+					this.byteArrayEncoder.append("Connection: keep-alive\r\n");
+			}
+		}
+
+		// Get specific headers for this upload.
+		this.uploadPolicy.onAppendHeader(this.byteArrayEncoder);
+	}
+
+	/**
+	 * Indicates whether the current socket should be reused ... if any.
+	 */
+	private boolean isKeepAlive() {
+		if (this.socket == null) {
+			return false;
+		} else if (!this.uploadPolicy.getAllowHttpPersistent()) {
+			return false;
+		} else {
+			if (!this.bChunkEnabled
+					|| this.bLastChunk
+					|| this.useProxy
+					|| !this.uploadPolicy.getServerProtocol()
+							.equals("HTTP/1.1")) { // RFC 2086, section 19.7.1
+				return false;
+			} else {
+				return true;
+			}
+		}
+	}
+
+	/**
+	 * Construction of a random boundary, to separate the uploaded files, in the
+	 * HTTP upload request.
+	 * 
+	 * @return The calculated boundary.
+	 */
+	private final String calculateRandomBoundary() {
+		StringBuffer sbRan = new StringBuffer(11);
+		sbRan.append("-----------------------------");
+		String alphaNum = "1234567890abcdefghijklmnopqrstuvwxyz";
+		int num;
+		for (int i = 0; i < 11; i++) {
+			num = (int) (Math.random() * (alphaNum.length() - 1));
+			sbRan.append(alphaNum.charAt(num));
+		}
+		return sbRan.toString();
+	}
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// OVERRIDE OF OutputStream METHODS
+	// ////////////////////////////////////////////////////////////////////////////////////
+	/** {@inheritDoc} */
+	@Override
+	public void write(int b) throws IOException {
+		try {
+			append(b);
+		} catch (JUploadIOException e) {
+			// Hum, HTTPConnectionHelper catch IOException, and throws a
+			// JUploadIOException. Now we get the cause, that is the original
+			// IOException. Not optimized.
+			if (e.getCause() == null) {
+				// This should not happen
+				throw new IOException();
+			} else if (e.getCause() instanceof IOException) {
+				throw (IOException) e.getCause();
+			} else {
+				// Hum, can something like an OutOfMemory. We must throw it.
+				throw new IOException(e.getCause().getClass().getName() + ": "
+						+ e.getCause().getMessage());
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void write(byte[] b, int off, int len) throws IOException {
+		try {
+			append(b, off, len);
+		} catch (JUploadIOException e) {
+			// Hum, HTTPConnectionHelper catch IOException, and throws a
+			// JUploadIOException. Now we get the cause, that is the original
+			// IOException. Not optimized.
+			if (e.getCause() == null) {
+				// This should not happen
+				throw new IOException();
+			} else if (e.getCause() instanceof IOException) {
+				throw (IOException) e.getCause();
+			} else {
+				// Hum, can something like an OutOfMemory. We must throw it.
+				throw new IOException(e.getCause().getClass().getName() + ": "
+						+ e.getCause().getMessage());
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void write(byte[] b) throws IOException {
+		write(b, 0, b.length);
+	}
+
+	/**
+	 * This method is the override of {@link OutputStream#close()} one. It may
+	 * not been called. You must use the {@link #sendRequest()} or
+	 * {@link #readHttpResponse()} methods instead.
+	 * 
+	 * @see java.io.OutputStream#close()
+	 */
+	@Override
+	public void close() throws IOException {
+		throw new IOException(
+				"Forbidden action (HTTPConnectionHelper.close()). Please use the "
+						+ getClass().getName() + ".sendRequest() method");
+	}
+
+	/**
+	 * Flushes the output stream. Useful only when the HTTPConnectionHelper is
+	 * writing to the socket toward the server, that is when the status is:
+	 * STATUS_WRITING_REQUEST.
+	 * 
+	 * @see java.io.OutputStream#flush()
+	 */
+	@Override
+	public void flush() throws IOException {
+		if (this.connectionStatus == STATUS_WRITING_REQUEST) {
+			this.outputStream.flush();
+		} else {
+			throw new IOException("Wrong status in " + getClass().getName()
+					+ ".flush method: " + getStatusLabel());
+		}
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpProtocolFinderThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpProtocolFinderThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpProtocolFinderThread.java	(revision 3951)
@@ -0,0 +1,137 @@
+//
+// $Id: DefaultUploadPolicy.java 289 2007-06-19 10:04:46 +0000 (mar., 19 juin
+// 2007) etienne_sf $
+//
+// jupload - A file upload juploadContext.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-04
+// Creator: etienne_sf
+// Last modified: $Date: 2010-01-23 18:39:37 +0100 (sam., 23 janv. 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+package wjhk.jupload2.upload.helper;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This Thread executes a HEAD request to the server. From the server response,
+ * the exact HTTP protocol, and any possible redirection are checked and used
+ * (if any) to update the uploadURL.<BR>
+ * The entry point for this method is the static
+ * {@link #computeServerProtocol(UploadPolicy, String)} method.
+ * 
+ * @author etienne_sf
+ */
+public class HttpProtocolFinderThread extends Thread {
+    /** The current upload policy */
+    UploadPolicy uploadPolicy;
+
+    /** The given which should be analysed, to find the server protocol */
+    String givenServerProtocol;
+
+    /**
+     * This static method is the entry point for this class. It creates a
+     * thread, and launch it, returning immediatly. The finding of the server
+     * protocol is then executed in a separated thread. So whenver long it is,
+     * the user won't see it. A default protocol is set immediatly, in the run
+     * method, to be sure that there will be no NullPointerException.
+     * 
+     * @param uploadPolicy The current upload policy
+     * @param givenServerProtocol The protocol given as parameter. If valid it
+     *            will be used. If not, the serverProtocol will be computed from
+     *            the post URL (and from a HEAD request for HTTP URL).
+     */
+    static public void computeServerProtocol(UploadPolicy uploadPolicy,
+            String givenServerProtocol) {
+        new HttpProtocolFinderThread(uploadPolicy, givenServerProtocol).start();
+    }
+
+    /**
+     * @param uploadPolicy The current upload policy
+     * @param givenServerProtocol The protocol given as parameter. If valid it
+     *            will be used. If not, the serverProtocol will be computed from
+     *            the post URL (and from a HEAD request for HTTP URL).
+     */
+    public HttpProtocolFinderThread(UploadPolicy uploadPolicy,
+            String givenServerProtocol) {
+        //Let's name this thread. It's easier for debugging.
+        super("HttpProtocolFinderThread");
+        
+        this.uploadPolicy = uploadPolicy;
+        this.givenServerProtocol = givenServerProtocol;
+    }
+
+    /**
+     * The job itself. Will do a HEAD request if it's a HTTP URL. Will just note
+     * ftp if FTP. Otherwise: will throw an error.
+     */
+    public void run() {
+        String computedProtocol = null;
+        String postURL = this.uploadPolicy.getPostURL();
+
+        if (null == givenServerProtocol || givenServerProtocol.equals("")) {
+            if (null == postURL || postURL.equals("")) {
+                this.uploadPolicy.displayErr("postURL not set");
+                computedProtocol = UploadPolicy.DEFAULT_SERVER_PROTOCOL;
+            } else if (postURL.substring(0, 3).equals("ftp")) {
+                computedProtocol = "ftp";
+            } else {
+                try {
+                    this.uploadPolicy.displayDebug(
+                            "Getting serverProtocol from HEAD request", 30);
+
+                    // Let's set a default protocol immediatly. It should be
+                    // good, and avoid a NullPointerException if an upload
+                    // starts immediatly.
+                    this.uploadPolicy
+                            .setServerProtocol(UploadPolicy.DEFAULT_SERVER_PROTOCOL);
+                    // Then we do the head request to the server
+                    computedProtocol = new HttpConnect(this.uploadPolicy)
+                            .getProtocol();
+                } catch (Exception e) {
+                    // If we throw an error here, we prevent the applet
+                    // to
+                    // start. So we just log it, and try the default protocol
+                    this.uploadPolicy.displayErr(
+                            "Unable to access to the postURL: '" + postURL
+                                    + "'", e);
+                    // Let's try with default value.
+                    computedProtocol = UploadPolicy.DEFAULT_SERVER_PROTOCOL;
+                }
+            }
+        } else if (this.givenServerProtocol.startsWith("HTTP")) {
+            try {
+                // In HTTP mode, we always give a try to HTTPConnect, to check
+                // if the page has moved, and other stuff.
+                // But we keep the parameter given when calling this method.
+                this.uploadPolicy.displayDebug(
+                        "Checking any redirect, from HEAD request", 30);
+                // Let's set a default protocol immediatly. It should be
+                // good, and avoid a NullPointerException if an upload
+                // starts immediatly.
+                this.uploadPolicy
+                        .setServerProtocol(UploadPolicy.DEFAULT_SERVER_PROTOCOL);
+                // Then we do the head request to the server
+                computedProtocol = new HttpConnect(this.uploadPolicy)
+                        .getProtocol();
+            } catch (Exception e) {
+                // If we throw an error here, we prevent the applet to
+                // start. So we just log it, and try the default protocol
+                this.uploadPolicy.displayErr(
+                        "Unknown to get protocol in the given postURL ("
+                                + this.uploadPolicy.getPostURL()
+                                + "), due to error: " + e.getMessage(), e);
+            }
+        }
+        this.uploadPolicy.setServerProtocol(computedProtocol);
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoder.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoder.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoder.java	(revision 3951)
@@ -0,0 +1,178 @@
+package wjhk.jupload2.upload.helper;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.upload.FileUploadThreadHTTP;
+
+/**
+ * This interface contains all technical methods to encode data, into a given
+ * character encoding. This is especially useful to encode the HTTP output to
+ * the server. <BR>
+ * <BR>
+ * Each appendXxxx method returns the current instance. This allows easy
+ * concatanation of calls to this class. For instance:<BR>
+ * 
+ * <PRE>
+ * bae.append(a).appendFileProperty(b, c).append(d);
+ * </PRE>
+ * 
+ * @author etienne_sf
+ * @see FileUploadThreadHTTP
+ */
+public interface ByteArrayEncoder {
+
+    /**
+     * Closes the encoding writer, and prepares the encoded length and byte
+     * array. This method must be called before call to
+     * {@link #getEncodedLength()} and {@link #getEncodedByteArray()}.
+     * <B>Note:</B> After a call to this method, you can not append any new data
+     * to the encoder.
+     * 
+     * @throws JUploadIOException Encapsulates any IO Exception
+     */
+    public void close() throws JUploadIOException;
+
+    /**
+     * Append a string, to be encoded at the current end of the byte array.
+     * 
+     * @param str The string to append and encode.
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     */
+    public ByteArrayEncoder append(String str) throws JUploadIOException;
+
+    /**
+     * Append a byte, to be encoded at the current end of the byte array. he
+     * byte to be written is the eight low-order bits of the argument b. The 24
+     * high-order bits of b are ignored.
+     * 
+     * @param b Writes the specified byte to this output stream.
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     */
+    public ByteArrayEncoder append(int b) throws JUploadIOException;
+
+    /**
+     * Append a stream, to be encoded at the current end of the byte array.
+     * 
+     * @param b
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     */
+    public ByteArrayEncoder append(byte[] b) throws JUploadIOException;
+
+    /**
+     * Append a property, name and value. It will be encoded at the current end
+     * of the byte array.<BR>
+     * Note: After the last call to appendTextProperty, you should call
+     * {@link #appendEndPropertyList()}, to properly finish the property list.
+     * In HTTP mode, it will add the last boundary, at a specific format.
+     * 
+     * @param name Name of the property to be added
+     * @param value Value of this property for the current file. It's up to the
+     *            caller to call this method at the right time.
+     * @param index Index of the file concerned by this value. -1 if this is a
+     *            global parameter.
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     * @see #appendEndPropertyList()
+     */
+    public ByteArrayEncoder appendTextProperty(String name, String value,
+            int index) throws JUploadIOException;
+
+    /**
+     * Finish a property list. In HTTP mode, the last boundary for the
+     * form/multipart content is added. After a call to this method, no more
+     * property may be written. If several ByteEncoder are used, it's up to the
+     * called to call this mehod only once, for the ByteEncoder that will be
+     * written last on the request.
+     * 
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     */
+    public ByteArrayEncoder appendEndPropertyList() throws JUploadIOException;
+
+    /**
+     * Add to the current encoder all properties contained in the given HTML
+     * form. There is no index for the current file: all the form parameters are
+     * global parameters (index will be set to -1 when calling
+     * {@link #appendTextProperty(String, String, int)}.
+     * 
+     * @param formname The HTML form name. This method will get the data from
+     *            this form, by using the {@link JUploadContext#getApplet()}
+     *            method.
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException
+     */
+    public ByteArrayEncoder appendFormVariables(String formname)
+            throws JUploadIOException;
+
+    /**
+     * Append a string, to be encoded at the current end of the byte array.
+     * 
+     * @param bae The ByteArrayEncoder whose encoding result should be appended
+     *            to the current encoder. bae must be closed, before being
+     *            appended.
+     * @return Return the current ByteArrayEncoder, to allow chained call (see
+     *         explanation, here above).
+     * @throws JUploadIOException This exception is thrown when this method is
+     *             called on a non-closed encoder.
+     */
+    public ByteArrayEncoder append(ByteArrayEncoder bae)
+            throws JUploadIOException;
+
+    /**
+     * @return the closed
+     */
+    public boolean isClosed();
+
+    /**
+     * Gets the HTTP boundary, that separate the form variables.
+     * 
+     * @return The HTTP boundary, that was generated when the instance was
+     *         created.
+     */
+    public String getBoundary();
+
+    /**
+     * @return the encoding
+     */
+    public String getEncoding();
+
+    /**
+     * Get the length of the encoded result. Can be called only once the encoder
+     * has been closed.
+     * 
+     * @return the encodedLength
+     * @throws JUploadIOException This exception is thrown when this method is
+     *             called on a non-closed encoder.
+     */
+    public int getEncodedLength() throws JUploadIOException;
+
+    /**
+     * Get the encoded result. Can be called only once the encoder has been
+     * closed.
+     * 
+     * @return the encodedByteArray
+     * @throws JUploadIOException This exception is thrown when this method is
+     *             called on a non-closed encoder.
+     */
+    public byte[] getEncodedByteArray() throws JUploadIOException;
+
+    /**
+     * Get the String that matches the encoded result. Can be called only once
+     * the encoder has been closed.
+     * 
+     * @return the String that has been encoded.
+     * @throws JUploadIOException This exception is thrown when this method is
+     *             called on a non-closed encoder.
+     */
+    public String getString() throws JUploadIOException;
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoderHTTP.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoderHTTP.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ByteArrayEncoderHTTP.java	(revision 3951)
@@ -0,0 +1,443 @@
+//
+// $Id: FileUploadThreadFTP.java 136 2007-05-12 20:15:36 +0000 (sam., 12 mai
+// 2007) etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-12-11
+// Creator: etienne_sf
+// Last modified: $Date: 2007-07-21 09:42:51 +0200 (sam., 21 juil. 2007) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.OutputStreamWriter;
+import java.io.UnsupportedEncodingException;
+import java.io.Writer;
+
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class is a utility, which provide easy encoding for HTTP queries. The
+ * way to use this class is:
+ * <OL TYPE=1>
+ * <LI>Instantiate a new object
+ * <LI>Append data to it, using the append methods. Available for: String,
+ * byte[], other ByteArrayEncode...
+ * <LI>Close the stream. This will prevent any new data to be appended to it.
+ * The encoded length can now be calculated.
+ * <LI>Get the encoded length.
+ * <LI>Get the encoded byte array
+ * </OL>
+ * 
+ * @author etienne_sf
+ * 
+ */
+
+public class ByteArrayEncoderHTTP implements ByteArrayEncoder {
+
+    /**
+     * The default encoding. It can be retrieved with
+     * {@link #getDefaultEncoding()}.
+     */
+    final static String DEFAULT_ENCODING = "UTF-8";
+
+    /**
+     * The boundary, to put between to post variables. Can not be changed during
+     * the object 'life'.
+     */
+    private String bound = null;
+
+    /**
+     * The current encoding. Can not be changed during the object 'life'.
+     */
+    private String encoding = DEFAULT_ENCODING;
+
+    /**
+     * Indicate whether the encoder is closed or not. If closed, it's impossible
+     * to append new data to it. If not closed, it's impossible to get the
+     * encoded length or the encoded byte array.<BR>
+     * <B>Note:</B> a closed byte array can not be re-opened.
+     */
+    boolean closed = false;
+
+    /**
+     * The actual array, which will collect the encoded bytes.
+     */
+    private ByteArrayOutputStream baos = new ByteArrayOutputStream();
+
+    /**
+     * The byte array length. Calculated when the ByteArrayOutput is closed.
+     */
+    private int encodedLength = -1;
+
+    /**
+     * The encoded byte array. Calculated when the ByteArrayOutput is closed.
+     */
+    private byte[] encodedByteArray = null;
+
+    /**
+     * The current upload policy.
+     */
+    private UploadPolicy uploadPolicy;
+
+    /**
+     * The writer, that will encode the input parameters to {@link #baos}.
+     */
+    private Writer writer;
+
+    // ///////////////////////////////////////////////////////////////////////
+    // //////////////// VARIOUS UTILITIES ////////////////////////////////////
+    // ///////////////////////////////////////////////////////////////////////
+
+    // ///////////////////////////////////////////////////////////////////////
+    // //////////////// CONSTRUCTORS /////////////////////////////////////////
+    // ///////////////////////////////////////////////////////////////////////
+
+    /**
+     * Create an encoder, using the DEFAULT_ENCODING encoding.
+     * 
+     * @param uploadPolicy The current upload policy
+     * @throws JUploadIOException Any IO exception
+     */
+    public ByteArrayEncoderHTTP(UploadPolicy uploadPolicy)
+            throws JUploadIOException {
+        init(uploadPolicy, null, DEFAULT_ENCODING);
+    }
+
+    /**
+     * Create an encoder, and specifies the encoding to use.
+     * 
+     * @param uploadPolicy The current upload policy
+     * @param bound Any specific boundary. May be null: in this case a default
+     *            boundary is used.
+     * @throws JUploadIOException Any IO exception
+     */
+    public ByteArrayEncoderHTTP(UploadPolicy uploadPolicy, String bound)
+            throws JUploadIOException {
+        init(uploadPolicy, bound, DEFAULT_ENCODING);
+    }
+
+    /**
+     * Create an encoder, and specifies the boundary and encoding to use.
+     * 
+     * @param uploadPolicy The current upload policy
+     * @param bound Any specific boundary. May be null: in this case a default
+     *            boundary is used.
+     * @param encoding The encoding to use. For instance, "UTF-8".
+     * @throws JUploadIOException Any IO exception
+     */
+    public ByteArrayEncoderHTTP(UploadPolicy uploadPolicy, String bound,
+            String encoding) throws JUploadIOException {
+        init(uploadPolicy, bound, encoding);
+    }
+
+    // ///////////////////////////////////////////////////////////////////////
+    // //////////////// Public methods ///////////////////////////////////////
+    // ///////////////////////////////////////////////////////////////////////
+
+    /**
+     * @throws JUploadIOException
+     * @see wjhk.jupload2.upload.helper.ByteArrayEncoder#close()
+     */
+    synchronized public void close() throws JUploadIOException {
+        if (isClosed()) {
+            throw new JUploadIOException(
+                    "Trying to close an already closed ByteArrayEncoded");
+        }
+        try {
+            this.writer.close();
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+        this.encodedByteArray = this.baos.toByteArray();
+        this.encodedLength = this.encodedByteArray.length;
+        this.closed = true;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder append(String str) throws JUploadIOException {
+        try {
+            this.writer.append(str);
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+        // Returning the encoder allows calls like:
+        // bae.append("qdqd").append("qsldqd"); (like StringBuffer)
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder append(int b) throws JUploadIOException {
+        try {
+            this.writer.flush();
+            this.baos.write(b);
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+        // Returning the encoder allows calls like:
+        // bae.append("qdqd").append("qsldqd"); (like StringBuffer)
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder append(byte[] b) throws JUploadIOException {
+        try {
+            this.writer.flush();
+            this.baos.write(b);
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+        // Returning the encoder allows calls like:
+        // bae.append("qdqd").append("qsldqd"); (like StringBuffer)
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder append(ByteArrayEncoder bae)
+            throws JUploadIOException {
+        this.append(bae.getEncodedByteArray());
+
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder appendTextProperty(String name, String value,
+            int index) throws JUploadIOException {
+        String propertySuffix = "";
+        // if an index is given, we may have to suffix the name of the upload
+        // parameter, depending on the value of httpUploadParameterType
+        if (index >= 0) {
+            if (this.uploadPolicy.getHttpUploadParameterType().equals(
+                    UploadPolicy.HTTPUPLOADPARAMETERTYPE_ARRAY)) {
+                propertySuffix = "[]";
+            } else if (this.uploadPolicy.getHttpUploadParameterType().equals(
+                    UploadPolicy.HTTPUPLOADPARAMETERTYPE_ITERATION)) {
+                propertySuffix = Integer.toString(index);
+            }
+        }
+        this.append(this.bound).append("\r\n");
+        this.append("Content-Disposition: form-data; name=\"").append(name)
+                .append(propertySuffix).append("\"\r\n");
+        this.append("Content-Transfer-Encoding: 8bit\r\n");
+        this.append("Content-Type: text/plain; charset=").append(this.getEncoding())
+                .append("\r\n");
+        // An empty line before the actual value.
+        this.append("\r\n");
+        // And then, the value!
+        this.append(value).append("\r\n");
+
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder appendEndPropertyList() throws JUploadIOException {
+        this.append(this.bound).append("--\r\n");
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public ByteArrayEncoder appendFormVariables(String formname)
+            throws JUploadIOException {
+        String action = "Entering ByteArrayEncoderHTTP.appendFormVariables() [html form: "
+                + formname + "]";
+        try {
+            this.uploadPolicy.displayDebug(action, 80);
+            // TODO Do not use getApplet() anymore, here.
+            action = "win = netscape.javascript.JSObject.getWindow";
+            netscape.javascript.JSObject win = netscape.javascript.JSObject
+                    .getWindow(this.uploadPolicy.getContext().getApplet());
+
+            action = "o = win.eval";
+            Object o = win.eval("document.forms[\"" + formname
+                    + "\"].elements.length");
+            if (o instanceof Number) {
+                int len = ((Number) o).intValue();
+                if (len <= 0) {
+                    this.uploadPolicy.displayWarn("The specified form \""
+                            + formname + "\" does not contain any elements.");
+                }
+                int i;
+                for (i = 0; i < len; i++) {
+                    try {
+                        action = "name = win.eval";
+                        Object name = win.eval("document.forms[\"" + formname
+                                + "\"][" + i + "].name");
+                        action = "value = win.eval";
+                        Object value = win.eval("document.forms[\"" + formname
+                                + "\"][" + i + "].value");
+                        action = "elementType = win.eval";
+                        Object elementType = win.eval("document.forms[\""
+                                + formname + "\"][" + i + "].type");
+                        action = "elementClass = win.eval";
+                        // elementClass seems to be not supported by IE7
+                        // The next line prevents formData to be sent to the
+                        // server, when formData is used on IE7. Works fine with
+                        // firefox.
+                        // Object elementClass = win.eval("document." + formname
+                        // + "[" + i + "].class");
+                        action = "etype = win.eval";
+                        Object etype = win.eval("document.forms[\"" + formname
+                                + "\"][" + i + "].type");
+                        if (etype instanceof String) {
+                            String t = (String) etype;
+                            if (t.equals("checkbox") || t.equals("radio")) {
+                                action = "on = win.eval";
+                                Object on = win.eval("document.forms[\""
+                                        + formname + "\"][" + i + "].checked");
+                                if (on instanceof Boolean) {
+                                    // Skip unchecked checkboxes and
+                                    // radiobuttons
+                                    if (!((Boolean) on).booleanValue()) {
+                                        this.uploadPolicy
+                                                .displayDebug(
+                                                        "  [ByteArrayEncoder.appendFormVariables] Skipping unchecked checkboxes and radiobuttons",
+                                                        80);
+                                        // TODO Do not use getApplet() anymore,
+                                        // here.
+                                        continue;
+                                    }
+                                }
+                            }
+                        }
+                        if (name instanceof String
+                                && ((String) name).length() > 0) {
+                            if (value instanceof String) {
+                                this.uploadPolicy.displayDebug(
+                                        "  [ByteArrayEncoder.appendFormVariables] Adding formdata element num "
+                                                + i + " (name: " + name
+                                                + ", value: " + value
+                                                + ", type: " + elementType
+                                                /* + ", class: " + elementClass */
+                                                + ")", 80);
+                                this.appendTextProperty((String) name,
+                                        (String) value, -1);
+                            } else {
+                                this.uploadPolicy
+                                        .displayWarn("  [ByteArrayEncoder.appendFormVariables] Value must be an instance of String (name: "
+                                                + name
+                                                + ", value: )"
+                                                + value
+                                                + ")");
+                            }
+                        } else {
+                            this.uploadPolicy
+                                    .displayWarn("  [ByteArrayEncoder.appendFormVariables] Name must be an instance of String (name: "
+                                            + name + ", value: )" + value + ")");
+                        }
+                    } catch (netscape.javascript.JSException e1) {
+                        this.uploadPolicy
+                                .displayWarn(e1.getStackTrace()[1]
+                                        + ": got JSException in ByteArrayEncoderHTTP.appendFormVariables() [html form: "
+                                        + formname
+                                        + "] - bailing out (action: " + action
+                                        + ")");
+                        i = len;
+                    }
+                }
+            } else {
+                this.uploadPolicy
+                        .displayWarn("  [ByteArrayEncoder.appendFormVariables] The specified form \""
+                                + formname
+                                + "\" could not be found (or has no element).");
+            }
+        } catch (netscape.javascript.JSException e) {
+            this.uploadPolicy.displayDebug(e.getStackTrace()[1]
+                    + ": No JavaScript available (action: " + action + ")", 10);
+        }
+
+        this.uploadPolicy
+                .displayDebug(
+                        "  [ByteArrayEncoder.appendFormVariables] End of ByteArrayEncoderHTTP.appendFormVariables()",
+                        80);
+        return this;
+    }
+
+    /** {@inheritDoc} */
+    public String getBoundary() {
+        return this.bound;
+    }
+
+    /**
+     * @return value of the DEFAULT_ENCODING constant.
+     */
+    public static String getDefaultEncoding() {
+        return DEFAULT_ENCODING;
+    }
+
+    /** {@inheritDoc} */
+    public boolean isClosed() {
+        return this.closed;
+    }
+
+    /** {@inheritDoc} */
+    public String getEncoding() {
+        return this.encoding;
+    }
+
+    /** {@inheritDoc} */
+    public int getEncodedLength() throws JUploadIOException {
+        if (!isClosed()) {
+            throw new JUploadIOException(
+                    "Trying to get length of a on non-closed ByteArrayEncoded");
+        }
+        return this.encodedLength;
+    }
+
+    /** {@inheritDoc} */
+    public byte[] getEncodedByteArray() throws JUploadIOException {
+        if (!isClosed()) {
+            throw new JUploadIOException(
+                    "Trying to get the byte array of a on non-closed ByteArrayEncoded");
+        }
+        return this.encodedByteArray;
+    }
+
+    /** {@inheritDoc} */
+    public String getString() throws JUploadIOException {
+        if (!isClosed()) {
+            throw new JUploadIOException(
+                    "Trying to get the byte array of a on non-closed ByteArrayEncoded");
+        }
+        try {
+            return new String(this.encodedByteArray, getEncoding());
+        } catch (UnsupportedEncodingException e) {
+            throw new JUploadIOException(e);
+        }
+    }
+
+    // ///////////////////////////////////////////////////////////////////////
+    // //////////////// Private methods //////////////////////////////////////
+    // ///////////////////////////////////////////////////////////////////////
+
+    /**
+     * Initialization: called by the constructors.
+     * 
+     * @throws JUploadIOException
+     */
+    private void init(UploadPolicy uploadPolicy, String bound, String encoding)
+            throws JUploadIOException {
+        this.uploadPolicy = uploadPolicy;
+        this.encoding = encoding;
+        this.bound = bound;
+
+        try {
+            this.writer = new OutputStreamWriter(this.baos, encoding);
+        } catch (UnsupportedEncodingException e) {
+            throw new JUploadIOException(e);
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ProgressBarManager.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ProgressBarManager.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/ProgressBarManager.java	(revision 3951)
@@ -0,0 +1,551 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2010 The JUpload Team
+//
+// Created: 10 févr. 2010
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+
+import javax.swing.JProgressBar;
+import javax.swing.Timer;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.filepanel.SizeRenderer;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.FilePreparationThread;
+import wjhk.jupload2.upload.FileUploadManagerThread;
+import wjhk.jupload2.upload.UploadFileData;
+import wjhk.jupload2.upload.UploadFilePacket;
+
+/**
+ * @author etienne_sf
+ */
+public class ProgressBarManager implements ActionListener {
+	/**
+	 * The delay between to updates of the progress bar, in ms.
+	 */
+	public final static int DELAY_FOR_UPDATE_OF_PROGRESS_BAR = 100;
+
+	/**
+	 * Contains the date/time (as a long) of the start of the current upload.
+	 * This allows to sum the time of the actual upload, and ignore the time the
+	 * applet is waiting for the server's response. Once the request is
+	 * finished, and the applet waits for the server's response, the duration of
+	 * the sending to the server is added to currentRequestStartTime, and
+	 * currentRequestStartTime is reseted to 0. It's then ready for the next
+	 * upload request.
+	 */
+	long currentRequestStartTime = 0;
+
+	/**
+	 * The file that is currently being uploaded. Allow to refresh the progress
+	 * bar, with up to date information, based on a timer event.
+	 */
+	UploadFileData currentUploadFileData = null;
+
+	/**
+	 * The files which is currently being sent to the server.
+	 */
+	UploadFilePacket currentUploadFilePacket = null;
+
+	/**
+	 * The file preparatoin thread prepares each file for upload, and manage
+	 * possible errors that can occurs at preparation time.
+	 */
+	FilePreparationThread filePreparationThread = null;
+
+	/**
+	 * Contains the system time of the start of the global upload. This is used
+	 * to calculate the ETA, and display it to the user, on the status bar.
+	 */
+	long globalStartTime = 0;
+
+	/**
+	 * Indicated the number of bytes that have currently been sent for the
+	 * current file. This allows the management of the progress bar.
+	 */
+	long nbBytesUploadedForCurrentFile = 0;
+
+	/**
+	 * Number of files that have already been sent. The control on the upload
+	 * success may be done or not. It's used to properly display the progress
+	 * bar.
+	 */
+	int nbSentFiles = 0;
+
+	/** Current number of bytes that have been uploaded. */
+	long nbUploadedBytes = 0;
+
+	/**
+	 * The {@link JUploadPanel} progress bar, to follow the file preparation
+	 * progress.
+	 */
+	JProgressBar preparationProgressBar = null;
+
+	/**
+	 * The timer which schedules the update for the progress and status bar.
+	 */
+	Timer timer;
+
+	/**
+	 * Contains the sum of the upload duration for all requests, in
+	 * milliseconds. For instance, if sending in 10 chunks one big file, the
+	 * uploadDuration contains the sum of the sending of these 10 request to the
+	 * server. This allows to calculate the true upload speed, and ignore the
+	 * time we'll wait for the server's response.
+	 */
+	long totalUploadDuration = 0;
+
+	/** The current upload policy */
+	UploadPolicy uploadPolicy;
+
+	/**
+	 * The {@link JUploadPanel} progress bar, to follow the upload of the
+	 * prepared files to the server.
+	 */
+	JProgressBar uploadProgressBar = null;
+
+	/**
+	 * Indicates what is the current file being uploaded, and its upload status.
+	 */
+	int uploadStatus = FileUploadManagerThread.UPLOAD_STATUS_NOT_STARTED;
+
+	/**
+	 * @param uploadPolicy
+	 * @param filePreparationThread
+	 */
+	public ProgressBarManager(UploadPolicy uploadPolicy,
+			FilePreparationThread filePreparationThread) {
+		this.uploadPolicy = uploadPolicy;
+		this.filePreparationThread = filePreparationThread;
+		// our timer is a daemon.
+		this.timer = new Timer(DELAY_FOR_UPDATE_OF_PROGRESS_BAR, this);
+
+		JUploadPanel uploadPanel = uploadPolicy.getContext().getUploadPanel();
+
+		this.uploadProgressBar = uploadPanel.getUploadProgressBar();
+		this.preparationProgressBar = uploadPanel.getPreparationProgressBar();
+
+		updateUploadProgressBarText();
+	}
+
+	/**
+	 * The only event managed here is the timer event. We update the progress
+	 * and status bar.
+	 * 
+	 * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+	 */
+	public void actionPerformed(ActionEvent arg0) {
+		updateUploadProgressBarValue();
+		updateUploadStatusBar();
+
+	}
+
+	/**
+	 * Called when a new file is uploaded. This method update the bars
+	 * accordingly to this new status, by calling the
+	 * updateUploadProgressBarText() method.
+	 * 
+	 * @param uploadFilePacket
+	 * @param uploadFileData
+	 * @throws JUploadException
+	 * @see wjhk.jupload2.upload.FileUploadManagerThread#anotherFileHasBeenSent(wjhk.jupload2.upload.UploadFilePacket,
+	 *      wjhk.jupload2.upload.UploadFileData)
+	 */
+	public synchronized void anotherFileHasBeenSent(
+			UploadFilePacket uploadFilePacket, UploadFileData uploadFileData)
+			throws JUploadException {
+		if (uploadFilePacket != this.currentUploadFilePacket) {
+			throw new java.lang.AssertionError("Wrong file packet in "
+					+ this.getClass().getName() + ".anotherFileHasBeenSent()");
+		}
+		if (uploadFileData != this.currentUploadFileData) {
+			throw new java.lang.AssertionError("Wrong file packet in "
+					+ this.getClass().getName() + ".anotherFileHasBeenSent()");
+		}
+		this.nbSentFiles += 1;
+		this.nbBytesUploadedForCurrentFile = 0;
+		this.uploadPolicy
+				.displayDebug(
+						this.getClass().getName()
+								+ ".anotherFileHasBeenSent(): before call to newlyUploadedFileData.getUploadLength()",
+						100);
+
+		// We are finished with this one. Let's display it.
+		this.uploadStatus = FileUploadManagerThread.UPLOAD_STATUS_UPLOADED;
+		updateUploadProgressBarText();
+	}
+
+	/**
+	 * Clean all bar content.
+	 */
+	public void clearBarContent() {
+		// Let's stop the update process.
+		this.timer.stop();
+
+		this.preparationProgressBar.setValue(0);
+		this.preparationProgressBar.setString("");
+		this.uploadProgressBar.setValue(0);
+		this.uploadProgressBar.setString("");
+
+	}
+
+	/**
+	 * @return the globalStartTime
+	 */
+	public long getGlobalStartTime() {
+		return this.globalStartTime;
+	}
+
+	/**
+	 * @return the nbUploadedBytes
+	 */
+	public long getNbUploadedBytes() {
+		return this.nbUploadedBytes;
+	}
+
+	/**
+	 * @return the uploadDuration
+	 */
+	public long getUploadDuration() {
+	    long currentRequestDuration = 0;
+	    if (this.currentRequestStartTime!=0) {
+	        //A request is running on
+	        currentRequestDuration=System.currentTimeMillis()-this.currentRequestStartTime;
+	    }
+
+		return this.totalUploadDuration + currentRequestDuration;
+	}
+
+	/**
+	 * Initialize the maximum value for the two progress bar: 100*the number of
+	 * files to upload.
+	 * 
+	 * @throws JUploadException
+	 * @see #updateUploadProgressBar(UploadFilePacket, UploadFileData)
+	 */
+	private void initProgressBar() throws JUploadException {
+		// To follow the state of file preparation
+		this.preparationProgressBar.setMaximum(100 * this.filePreparationThread
+				.getNbFilesToSent());
+		this.preparationProgressBar.setString("");
+
+		// To follow the state of the actual upload
+		this.uploadProgressBar.setMaximum(100 * this.uploadPolicy.getContext()
+				.getUploadPanel().getFilePanel().getFilesLength());
+		this.uploadProgressBar.setString("");
+	}
+
+	/**
+	 * The progressBar is updated each 50ms and each 10% of the target file.
+	 * 
+	 * @param nbBytes
+	 * @param uploadFileData
+	 * @throws JUploadException
+	 * @see wjhk.jupload2.upload.FileUploadManagerThread#nbBytesUploaded(long,
+	 *      UploadFileData)
+	 */
+	public synchronized void nbBytesUploaded(long nbBytes,
+			UploadFileData uploadFileData) throws JUploadException {
+		this.nbUploadedBytes += nbBytes;
+		this.nbBytesUploadedForCurrentFile += nbBytes;
+	}
+
+	/**
+	 * Set an error text, that will be displayed on the progress bar
+	 * 
+	 * @param errorTexte
+	 */
+	public void setErrorMessage(String errorTexte) {
+		this.preparationProgressBar.setString(errorTexte);
+	}
+
+	/**
+	 * @param uploadFilePacket
+	 * @param uploadFileData
+	 * @param uploadStatus
+	 * @throws JUploadException
+	 */
+	public synchronized void setUploadStatus(UploadFilePacket uploadFilePacket,
+			UploadFileData uploadFileData, int uploadStatus)
+			throws JUploadException {
+		// Let's store the file we're working on.
+		this.currentUploadFileData = uploadFileData;
+		this.currentUploadFilePacket = uploadFilePacket;
+
+		switch (uploadStatus) {
+		case FileUploadManagerThread.UPLOAD_STATUS_CHUNK_UPLOADED_WAITING_FOR_RESPONSE:
+		case FileUploadManagerThread.UPLOAD_STATUS_FILE_UPLOADED_WAITING_FOR_RESPONSE:
+			// We're waiting for the server: let's add it to the sending
+			// duration.
+			this.totalUploadDuration += System.currentTimeMillis()
+					- this.currentRequestStartTime;
+			this.currentRequestStartTime = 0;
+			break;
+		case FileUploadManagerThread.UPLOAD_STATUS_UPLOADING:
+		    //We mark the start of the request, if it was not already done.
+			if (this.currentRequestStartTime == 0) {
+				this.currentRequestStartTime = System.currentTimeMillis();
+			}
+			break;
+		case FileUploadManagerThread.UPLOAD_STATUS_UPLOADED:
+			// Indicated that the current request is finished. Nothing to do
+			break;
+		default:
+			this.uploadPolicy.displayWarn("Unknown value for uploadStatus: "
+					+ uploadStatus);
+		}
+		this.uploadStatus = uploadStatus;
+
+		this.updateUploadProgressBarText();
+	}
+
+	/**
+	 * Update the progress bar, based on the following data: <DIR> <LI>
+	 * nbSentFiles: number of files that have already been updated. <LI>
+	 * nbBytesUploadedForCurrentFile: allows calculation of the upload progress
+	 * for the current file, based on it total upload length. </DIR> <BR>
+	 * Note 1: The progress bar update is ignored, if last update was less than
+	 * 100ms before.<BR>
+	 * Note 2: This method calls the
+	 * {@link #updateUploadProgressBarValue(UploadFileData)} method, to also
+	 * update its value.
+	 * 
+	 * @throws JUploadException
+	 */
+	private void updateUploadProgressBarText() {
+		/*
+		 * final String msgInfoUploaded = this.uploadPolicy
+		 * .getLocalizedString("infoUploaded"); final String msgInfoUploading =
+		 * this.uploadPolicy .getLocalizedString("infoUploading"); final String
+		 * msgNbUploadedFiles = this.uploadPolicy
+		 * .getLocalizedString("nbUploadedFiles");
+		 */
+		updateUploadProgressBarValue();
+
+		String msg = null;
+		switch (this.uploadStatus) {
+		case FileUploadManagerThread.UPLOAD_STATUS_NOT_STARTED:
+			msg = "";
+			break;
+		case FileUploadManagerThread.UPLOAD_STATUS_UPLOADING:
+		case FileUploadManagerThread.UPLOAD_STATUS_CHUNK_UPLOADED_WAITING_FOR_RESPONSE:
+			// Uploading files %1$s
+			msg = this.uploadPolicy.getLocalizedString("infoUploading",
+					(this.nbSentFiles + 1));
+			break;
+		case FileUploadManagerThread.UPLOAD_STATUS_FILE_UPLOADED_WAITING_FOR_RESPONSE:
+			// %1$s file(s) uploaded. Waiting for server response ...
+
+			// nbSentFiles it number of files whose data is already sent to
+			// the server. This include the currentUploadFileData (which
+			// should be the last file in the packet)
+			int firstFileInPacket = this.currentUploadFileData
+					.getNumOfFileInCurrentUpload();
+			int currentFile = this.nbSentFiles;
+
+			if (this.currentUploadFilePacket.size() == 1) {
+				msg = currentFile + "/"
+						+ this.filePreparationThread.getNbFilesToSent();
+			} else {
+				msg = firstFileInPacket + "-" + currentFile + "/"
+						+ this.filePreparationThread.getNbFilesToSent();
+			}
+			msg = this.uploadPolicy.getLocalizedString("infoUploaded", msg);
+
+			break;
+		case FileUploadManagerThread.UPLOAD_STATUS_UPLOADED:
+			// %1$d file(s) uploaded
+			msg = this.uploadPolicy.getLocalizedString("nbUploadedFiles",
+					(this.nbSentFiles));
+			break;
+		default:
+			// Hum, that's strange !
+			this.uploadPolicy
+					.displayWarn("Unknown upload status in FileUploadManagerThreadImpl.updateProgressBar(): "
+							+ this.uploadStatus);
+		}
+
+		// Let's show the modifications to the user
+		this.uploadProgressBar.setString(msg);
+		// To be sure that the new text is displayed, we force instantaneous
+		// refresh. This won't slow down the upload, as it's done in separate
+		// thread.
+		this.uploadProgressBar.repaint(0);
+	}
+
+	/**
+	 * Update the progress bar value, that is: the percent of upload of the
+	 * current file. This is based on nbBytesUploadedForCurrentFile and the
+	 * total upload length of the current file.<BR>
+	 * Note: The progress bar update is ignored, if last update was less than
+	 * 100ms before.
+	 * 
+	 * @throws JUploadException
+	 */
+	private void updateUploadProgressBarValue() {
+		/*
+		 * final String msgInfoUploaded = this.uploadPolicy
+		 * .getLocalizedString("infoUploaded"); final String msgInfoUploading =
+		 * this.uploadPolicy .getLocalizedString("infoUploading"); final String
+		 * msgNbUploadedFiles = this.uploadPolicy
+		 * .getLocalizedString("nbUploadedFiles");
+		 */
+		int percent = 0;
+
+		// First, we update the bar itself.
+		if (this.nbBytesUploadedForCurrentFile == 0
+				|| this.nbSentFiles == this.filePreparationThread
+						.getNbFilesToSent()) {
+			percent = 0;
+		} else if (this.currentUploadFileData == null) {
+			percent = 0;
+		} else {
+			if (this.currentUploadFileData.isPreparedForUpload()) {
+				percent = (int) (this.nbBytesUploadedForCurrentFile * 100 / this.currentUploadFileData
+						.getUploadLength());
+			} else {
+				// Hum, hum. The file is not prepared for upload yet. So we
+				// actually didn't send any thing for it.
+				percent = 0;
+			}
+			// Usually, a percentage if advancement for one file is no more than
+			// 100. Let's check that.
+			if (percent > 100) {
+				this.uploadPolicy
+						.displayWarn("percent is more than 100 ("
+								+ percent
+								+ ") in FileUploadManagerThreadImpl.update.UploadProgressBar");
+				percent = 100;
+			}
+		}
+
+		this.uploadProgressBar.setValue(100 * this.nbSentFiles + percent);
+	}
+
+	/**
+	 * Displays the current upload speed on the status bar.
+	 */
+	private void updateUploadStatusBar() {
+		// We'll update the status bar, only if it exists and if the upload
+		// actually started.
+		if (null != this.uploadPolicy.getContext().getUploadPanel()
+				.getStatusLabel()
+				&& this.nbUploadedBytes > 0) {
+			double percent;
+			// uploadCPS: contains the upload speed.
+			double uploadSpeed;
+			// globalCPS: contains the average speed, including the time the
+			// applet is waiting for the server response.
+			double globalCPS;
+			long remaining;
+			String eta;
+
+			try {
+				percent = 100.0 * this.nbUploadedBytes
+						/ this.filePreparationThread.getTotalFileBytesToSend();
+
+			} catch (ArithmeticException e1) {
+				percent = 100;
+			}
+
+			// Calculation of the 'pure' upload speed.
+			uploadSpeed = ((double) this.nbUploadedBytes)
+					/ ((double) getUploadDuration() / 1000);
+			if (uploadSpeed == Double.POSITIVE_INFINITY) {
+				this.uploadPolicy.displayDebug(
+						"uploadSpeed is Infinity, for nbUploadedBytes="
+								+ nbUploadedBytes
+								+ " and actualUploadDuration(ms)="
+								+ getUploadDuration(), 80);
+			}
+
+			// Calculation of the 'global' upload speed.
+			try {
+				globalCPS = ((double) this.nbUploadedBytes)
+						/ (System.currentTimeMillis() - this.globalStartTime)
+						* 1000;
+			} catch (ArithmeticException e1) {
+				globalCPS = this.nbUploadedBytes;
+			}
+
+			// Calculation of the ETA. It's based on the global upload speed.
+			try {
+				remaining = (long) ((this.filePreparationThread
+						.getTotalFileBytesToSend() - this.nbUploadedBytes) / globalCPS);
+				if (remaining > 3600) {
+					eta = this.uploadPolicy.getLocalizedString("timefmt_hms",
+							Long.valueOf(remaining / 3600), Long
+									.valueOf((remaining / 60) % 60), Long
+									.valueOf(remaining % 60));
+				} else if (remaining > 60) {
+					eta = this.uploadPolicy.getLocalizedString("timefmt_ms",
+							Long.valueOf(remaining / 60), Long
+									.valueOf(remaining % 60));
+				} else
+					eta = this.uploadPolicy.getLocalizedString("timefmt_s",
+							Long.valueOf(remaining));
+			} catch (ArithmeticException e1) {
+				eta = this.uploadPolicy.getLocalizedString("timefmt_unknown");
+			}
+			String status = this.uploadPolicy.getLocalizedString("status_msg",
+					Integer.valueOf((int) percent), SizeRenderer
+							.formatFileUploadSpeed(uploadSpeed,
+									this.uploadPolicy), eta);
+			this.uploadPolicy.getContext().getUploadPanel().getStatusLabel()
+					.setText(status);
+			// this.uploadPanel.getStatusLabel().repaint();
+			this.uploadPolicy.getContext().showStatus(status);
+			// this.uploadPolicy.displayDebug("[updateUploadStatusBar] " +
+			// status, 101);
+		}
+	}
+
+	/**
+	 * This just stops the timer. A 'last' update is done.
+	 */
+	public void uploadIsFinished() {
+		// Let's stop the update process.
+		this.timer.stop();
+
+		updateUploadProgressBarText();
+		updateUploadStatusBar();
+	}
+
+	/**
+	 * @throws JUploadException
+	 */
+	public void uploadIsStarted() throws JUploadException {
+		// Ok, the upload just starts. We keep the date, to later calculate the
+		// ETA.
+		this.globalStartTime = System.currentTimeMillis();
+		initProgressBar();
+
+		// Let's start the update process.
+		this.timer.start();
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/CookieJar.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/CookieJar.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/CookieJar.java	(revision 3951)
@@ -0,0 +1,317 @@
+//
+// $Id: CookieJar.java 816 2009-06-26 18:49:10Z etienne_sf $
+//
+// jupload - A file upload applet.
+//
+// Copyright 2007 The JUpload Team
+//
+// Created: 08.06.2007
+// Creator: felfert
+// Last modified: $Date: 2009-06-26 15:49:10 -0300 (Sex, 26 Jun 2009) $
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.net.URL;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.HashMap;
+import java.util.StringTokenizer;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class implements a container for multiple cookies in a single domain.
+ * 
+ * @author felfert
+ */
+public class CookieJar {
+
+    final static Pattern pNvPair = Pattern.compile(
+            "^\\s*([^=\\s]+)(\\s*=\\s*(.+))*$", Pattern.CASE_INSENSITIVE);
+
+    /**
+     * The current upload policy, always useful.
+     */
+    private UploadPolicy uploadPolicy = null;
+
+    private HashMap<String, Cookie> jar = new HashMap<String, Cookie>();
+
+    private String domain = null;
+
+    private static class Cookie implements Cloneable {
+
+        String domain = null;
+
+        String name = null;
+
+        String value = null;
+
+        String path = null;
+
+        long max_age = 0;
+
+        int version = 0;
+
+        int secure = 0;
+
+        Cookie() {
+            //
+        }
+
+        /**
+         * @throws CloneNotSupportedException
+         * @see java.lang.Object#clone()
+         */
+        @Override
+        public Cookie clone() throws CloneNotSupportedException {
+            Cookie ret = (Cookie) super.clone();
+            ret.domain = this.domain;
+            ret.name = this.name;
+            ret.value = this.value;
+            ret.path = this.path;
+            ret.max_age = this.max_age;
+            ret.version = this.version;
+            ret.secure = this.secure;
+            return ret;
+        }
+
+        /**
+         * Retrieves the hash value of this cookie. Cookies are hashed by name
+         * and path.
+         * 
+         * @return The hash value of this cookie.
+         */
+        public String getKey() {
+            String ret = this.name;
+            if (null != this.path)
+                ret += this.path;
+            return ret;
+        }
+
+        /**
+         * Returns a single client cookie header element
+         * 
+         * @param path The path of the corresponding request URI
+         * @param secure 1, if the current connection is secure (SSL), 0
+         *            otherwise
+         * @return The part of the cookie header or an empty string
+         */
+        public String getHeader(String path, int secure) {
+            StringBuffer sb = new StringBuffer();
+            if ((null == this.path || this.path.equals("/") || this.path
+                    .startsWith(path))
+                    && (this.secure <= secure)
+                    && (this.max_age > System.currentTimeMillis())) {
+                if (this.version > 0) {
+                    sb.append("$Version=").append(this.version).append("; ");
+                    sb.append(this.name).append("=").append(this.value).append(
+                            ";");
+                    if (null != this.path)
+                        sb.append(" $Path=").append(this.path).append(";");
+                    if (null != this.domain)
+                        sb.append(" $Domain=").append(this.domain).append(";");
+                } else {
+                    sb.append(this.name).append("=").append(this.value).append(
+                            ";");
+                }
+            }
+            return sb.toString();
+        }
+
+    }
+
+    /*
+     * **************************************************************************
+     * *************************** Start of CookieJar code
+     * ***********************
+     * ***************************************************
+     * **************************
+     */
+
+    /**
+     * The creator for this class.
+     * 
+     * @param uploadPolicy The current upload policy
+     */
+    public CookieJar(UploadPolicy uploadPolicy) {
+        this.uploadPolicy = uploadPolicy;
+    }
+
+    private String stripQuotes(String s) {
+        if (s.startsWith("\"") && s.endsWith("\""))
+            return s.substring(1, s.length() - 1);
+        return s;
+    }
+
+    private boolean domainMatch(String cd) {
+        if (cd == null) {
+            return false;
+        } else {
+            if (!cd.startsWith(".")) {
+                int dot = cd.indexOf('.');
+                if (dot >= 0)
+                    cd = cd.substring(dot);
+
+            }
+            return cd.equals(this.domain);
+        }
+    }
+
+    /**
+     * Sets the domain for this cookie jar. If set, only cookies matching the
+     * specified domain are handled.
+     * 
+     * @param domain The domain of this instance
+     */
+    public void setDomain(String domain) {
+        if (!domain.startsWith(".")) {
+            int dot = domain.indexOf('.');
+            if (dot >= 0)
+                domain = domain.substring(dot);
+
+        }
+        this.domain = domain;
+    }
+
+    /**
+     * Builds a RFC 2109 compliant client cookie header for the specified URL.
+     * 
+     * @param url The URL for which the cookie header is to be used.
+     * @return A client cookie header (including the "Cookie: " prefix) or null
+     *         if no cookies are to be set.
+     */
+    public String buildCookieHeader(URL url) {
+        String domain = url.getHost();
+        int dot = domain.indexOf('.');
+        if (dot >= 0)
+            domain = domain.substring(dot);
+        if (domain.equals(this.domain)) {
+            String path = url.getPath();
+            int secure = url.getProtocol().equalsIgnoreCase("https") ? 1 : 0;
+            StringBuffer sb = new StringBuffer();
+            for (String key : this.jar.keySet()) {
+                Cookie c = this.jar.get(key);
+                if (null != c)
+                    sb.append(c.getHeader(path, secure));
+            }
+            if (sb.length() > 0) {
+                sb.append("\r\n");
+                return "Cookie: " + sb.toString();
+            }
+        }
+        return null;
+    }
+
+    /**
+     * Parses a "Set-Cookie" header and creates/updates/deletes cookies
+     * according to the parsed values. Parsing is done according to the
+     * specification in RFC 2109
+     * 
+     * @param s The plain value of the "Set-Cookie" HTTP header. e.g.: without
+     *            the "Set-Cookie: " prefix.
+     */
+    public void parseCookieHeader(String s) {
+        StringTokenizer t = new StringTokenizer(s, ";");
+        Cookie cookie = new Cookie();
+        while (t.hasMoreTokens()) {
+            Matcher m = pNvPair.matcher(t.nextToken());
+            if (m.matches()) {
+                String n = m.group(1);
+                String v = (m.groupCount() > 2 && m.group(3) != null) ? m
+                        .group(3).trim() : "";
+                if (n.compareToIgnoreCase("version") == 0) {
+                    cookie.version = Integer.parseInt(v);
+                    continue;
+                }
+                if (n.compareToIgnoreCase("domain") == 0) {
+                    cookie.domain = v;
+                    continue;
+                }
+                if (n.compareToIgnoreCase("path") == 0) {
+                    cookie.path = v;
+                    continue;
+                }
+                if (n.compareToIgnoreCase("max-age") == 0) {
+                    cookie.max_age = Integer.parseInt(v);
+                    if (cookie.max_age < 0)
+                        cookie.max_age = 0;
+                    cookie.max_age *= 1000;
+                    cookie.max_age += System.currentTimeMillis();
+                    continue;
+                }
+                if (n.compareToIgnoreCase("expires") == 0) {
+                    SimpleDateFormat df = new SimpleDateFormat(
+                            "EEE, dd-MMM-yy HH:mm:ss zzz");
+                    try {
+                        cookie.max_age = System.currentTimeMillis()
+                                - df.parse(v).getTime();
+                        if (cookie.max_age < 0)
+                            cookie.max_age = 0;
+                    } catch (ParseException e) {
+                        cookie.max_age = 0;
+                    }
+                    continue;
+                }
+                if (n.compareToIgnoreCase("comment") == 0) {
+                    // ignored
+                    continue;
+                }
+                if (n.compareToIgnoreCase("secure") == 0) {
+                    cookie.secure = 1;
+                    continue;
+                }
+                if (!n.startsWith("$")) {
+                    if (null != cookie.name) {
+                        if (cookie.version > 0) {
+                            // Strip possible quotes
+                            cookie.domain = stripQuotes(cookie.domain);
+                            cookie.path = stripQuotes(cookie.path);
+                            // cookie.comment = stripQuotes(cookie.comment);
+                            // cookie.name = stripQuotes(cookie.name);
+                            // cookie.value = stripQuotes(cookie.value);
+                        }
+                        if (domainMatch(cookie.domain)) {
+                            if (cookie.max_age > 0) {
+                                this.jar.put(cookie.getKey(), cookie);
+                                this.uploadPolicy.displayDebug(
+                                        "[CookieJar] Adding cookie: "
+                                                + cookie.getKey() + ": "
+                                                + cookie, 50);
+
+                            } else {
+                                this.jar.put(cookie.getKey(), null);
+                                this.uploadPolicy.displayDebug(
+                                        "[CookieJar] Ignoring cookie: "
+                                                + cookie.getKey() + ": "
+                                                + cookie, 50);
+                            }
+                        }
+                        try {
+                            cookie = cookie.clone();
+                        } catch (CloneNotSupportedException e) {
+                            cookie = new Cookie();
+                        }
+                    }
+                    cookie.name = n;
+                    cookie.value = v;
+                }
+            }
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpConnect.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpConnect.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HttpConnect.java	(revision 3951)
@@ -0,0 +1,428 @@
+//
+// $Id: HttpConnect.java 286 2007-06-17 09:03:29 +0000 (dim., 17 juin 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+//
+// Copyright 2007 The JUpload Team
+//
+// Created: 07.05.2007
+// Creator: felfert
+// Last modified: $Date: 2010-09-20 09:14:51 -0300 (Seg, 20 Set 2010) $
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.io.IOException;
+import java.net.ConnectException;
+import java.net.InetSocketAddress;
+import java.net.Proxy;
+import java.net.ProxySelector;
+import java.net.Socket;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.net.UnknownHostException;
+import java.security.KeyManagementException;
+import java.security.KeyStoreException;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import javax.net.ssl.SSLContext;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+import javax.net.ssl.X509TrustManager;
+
+import java.security.cert.X509Certificate;
+
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+
+/**
+ * This class implements the task of connecting to a HTTP(S) url using a proxy.
+ * 
+ * @author felfert
+ */
+public class HttpConnect {
+
+	// TrustManager to allow all certificates
+	private final class TM implements X509TrustManager {
+		public void checkClientTrusted(X509Certificate[] arg0, String arg1)
+				throws CertificateException {
+		}
+
+		public void checkServerTrusted(X509Certificate[] chain, String authType)
+				throws CertificateException {
+		}
+
+		public X509Certificate[] getAcceptedIssuers() {
+			return new X509Certificate[0];
+		}
+	}
+
+	private final static String HTTPCONNECT_DEFAULT_PROTOCOL = "HTTP/1.1";
+
+	/**
+	 * The current upload policy. Used for logging, and to get the post URL.
+	 * Also used to change this URL, when it has moved (301, 302 or 303 return
+	 * code)
+	 */
+	private UploadPolicy uploadPolicy;
+
+	/**
+	 * Connects to a given URL.
+	 * 
+	 * @param url
+	 *            The URL to connect to
+	 * @param proxy
+	 *            The proxy to be used, may be null if direct connection is
+	 *            needed
+	 * @return A socket, connected to the specified URL. May be null if an error
+	 *         occurs.
+	 * @throws NoSuchAlgorithmException
+	 * @throws KeyManagementException
+	 * @throws IOException
+	 * @throws UnknownHostException
+	 * @throws ConnectException
+	 * @throws CertificateException
+	 * @throws KeyStoreException
+	 * @throws UnrecoverableKeyException
+	 * @throws IllegalArgumentException
+	 */
+	public Socket connect(URL url, Proxy proxy)
+			throws NoSuchAlgorithmException, KeyManagementException,
+			ConnectException, UnknownHostException, IOException,
+			KeyStoreException, CertificateException, IllegalArgumentException,
+			UnrecoverableKeyException {
+		// Temporary socket for SOCKS support
+		Socket tsock;
+		Socket ret = null;
+		String host = url.getHost();
+		int port;
+		boolean useProxy = ((proxy != null) && (proxy.type() != Proxy.Type.DIRECT));
+
+		// Check if SSL connection is needed
+		if (url.getProtocol().equals("https")) {
+			port = (-1 == url.getPort()) ? 443 : url.getPort();
+			SSLContext context = SSLContext.getInstance("SSL");
+			// Allow all certificates
+			context.init(null, new X509TrustManager[] { new TM() }, null);
+			if (useProxy) {
+				if (proxy.type() == Proxy.Type.HTTP) {
+					// First establish a CONNECT, then do a normal SSL
+					// thru that connection.
+					
+					//Patch given by cuspy (Patch 3043476 on Sourceforge) 
+					BufferedWriter writer;
+					BufferedReader reader;
+					String proxyhost;
+					int proxyport;
+					InetSocketAddress sa = (InetSocketAddress) proxy.address();
+					proxyhost = (sa.isUnresolved()) ? sa.getHostName() : sa
+							.getAddress().getHostAddress();
+					proxyport = sa.getPort();
+					this.uploadPolicy.displayDebug(
+							"Using SSL socket, via HTTP proxy", 20);
+					tsock = new Socket(proxyhost, proxyport);
+					writer = new BufferedWriter(new OutputStreamWriter(tsock
+							.getOutputStream()));
+					reader = new BufferedReader(new InputStreamReader(tsock
+							.getInputStream()));
+					String hostport = host + ":" + port;
+					String req = "CONNECT " + hostport + " HTTP/1.0\r\n\r\n";
+					writer.write(req);
+					writer.flush();
+					String res = reader.readLine();
+					String[] status = res.split(" ", 3);
+					if(status.length < 2 || !status[1].startsWith("200")) {
+                        this.uploadPolicy.displayDebug("res: " + res, 10);
+						throw new ConnectException("proxy connection error");
+					}
+					ret = context.getSocketFactory().createSocket(tsock,
+							url.getHost(), port, true);
+				} else if (proxy.type() == Proxy.Type.SOCKS) {
+					this.uploadPolicy.displayDebug(
+							"Using SSL socket, via SOCKS proxy", 20);
+					tsock = new Socket(proxy);
+					tsock.connect(new InetSocketAddress(host, port));
+					ret = context.getSocketFactory().createSocket(tsock, host,
+							port, true);
+
+				} else
+					throw new ConnectException("Unkown proxy type "
+							+ proxy.type());
+			} else {
+				// If port not specified then use default https port
+				// 443.
+				this.uploadPolicy.displayDebug(
+						"Using SSL socket, direct connection", 20);
+				ret = context.getSocketFactory().createSocket(host, port);
+			}
+		} else {
+			// If we are not in SSL, just use the old code.
+			port = (-1 == url.getPort()) ? 80 : url.getPort();
+			if (useProxy) {
+				if (proxy.type() == Proxy.Type.HTTP) {
+					InetSocketAddress sa = (InetSocketAddress) proxy.address();
+					host = (sa.isUnresolved()) ? sa.getHostName() : sa
+							.getAddress().getHostAddress();
+					port = sa.getPort();
+					this.uploadPolicy.displayDebug(
+							"Using non SSL socket, proxy=" + host + ":" + port,
+							20);
+					ret = new Socket(host, port);
+				} else if (proxy.type() == Proxy.Type.SOCKS) {
+					this.uploadPolicy.displayDebug(
+							"Using non SSL socket, via SOCKS proxy", 20);
+					tsock = new Socket(proxy);
+					tsock.connect(new InetSocketAddress(host, port));
+					ret = tsock;
+				} else
+					throw new ConnectException("Unkown proxy type "
+							+ proxy.type());
+			} else {
+				this.uploadPolicy.displayDebug(
+						"Using non SSL socket, direct connection", 20);
+				ret = new Socket(host, port);
+			}
+		}
+		return ret;
+	}
+
+	/**
+	 * Connects to a given URL automatically using a proxy.
+	 * 
+	 * @param url
+	 *            The URL to connect to
+	 * @return A socket, connected to the specified URL. May be null if an error
+	 *         occurs.
+	 * @throws NoSuchAlgorithmException
+	 * @throws KeyManagementException
+	 * @throws IOException
+	 * @throws UnknownHostException
+	 * @throws ConnectException
+	 * @throws URISyntaxException
+	 * @throws UnrecoverableKeyException
+	 * @throws CertificateException
+	 * @throws KeyStoreException
+	 * @throws UnrecoverableKeyException
+	 * @throws IllegalArgumentException
+	 */
+	public Socket connect(URL url) throws NoSuchAlgorithmException,
+			KeyManagementException, ConnectException, UnknownHostException,
+			IOException, URISyntaxException, KeyStoreException,
+			CertificateException, IllegalArgumentException,
+			UnrecoverableKeyException {
+		Proxy proxy = ProxySelector.getDefault().select(url.toURI()).get(0);
+		return connect(url, proxy);
+	}
+
+	/**
+	 * Retrieve the protocol to be used for the postURL of the current policy.
+	 * This method issues a HEAD request to the postURL and then examines the
+	 * protocol version returned in the response.
+	 * 
+	 * @return The string, describing the protocol (e.g. "HTTP/1.1")
+	 * @throws URISyntaxException
+	 * @throws IOException
+	 * @throws UnrecoverableKeyException
+	 * @throws IllegalArgumentException
+	 * @throws CertificateException
+	 * @throws KeyStoreException
+	 * @throws UnknownHostException
+	 * @throws NoSuchAlgorithmException
+	 * @throws KeyManagementException
+	 * @throws JUploadException
+	 */
+	public String getProtocol() throws URISyntaxException,
+			KeyManagementException, NoSuchAlgorithmException,
+			UnknownHostException, KeyStoreException, CertificateException,
+			IllegalArgumentException, UnrecoverableKeyException, IOException,
+			JUploadException {
+
+		String protocol = HTTPCONNECT_DEFAULT_PROTOCOL;
+		URL url = new URL(this.uploadPolicy.getPostURL());
+		this.uploadPolicy
+				.displayDebug("Checking protocol with URL: " + url, 30);
+		HTTPConnectionHelper connectionHelper = new HTTPConnectionHelper(url,
+				"HEAD", false, true, this.uploadPolicy);
+		connectionHelper.append("\r\n");
+		this.uploadPolicy.displayDebug("Before sendRequest()", 30);
+		connectionHelper.sendRequest();
+		this.uploadPolicy.displayDebug("After sendRequest()", 30);
+		connectionHelper.getOutputStream().flush();
+		if (this.uploadPolicy.getDebugLevel() >= 80) {
+			this.uploadPolicy
+					.displayDebug(
+							"-------------------------------------------------------------------------",
+							80);
+			this.uploadPolicy
+					.displayDebug(
+							"-----------------   HEAD message sent (start)  --------------------------",
+							80);
+			this.uploadPolicy
+					.displayDebug(
+							"-------------------------------------------------------------------------",
+							80);
+			this.uploadPolicy.displayDebug(connectionHelper
+					.getByteArrayEncoder().getString(), 80);
+			this.uploadPolicy
+					.displayDebug(
+							"-------------------------------------------------------------------------",
+							80);
+			this.uploadPolicy
+					.displayDebug(
+							"-----------------   HEAD message sent (end) -----------------------------",
+							80);
+			this.uploadPolicy
+					.displayDebug(
+							"-------------------------------------------------------------------------",
+							80);
+		}
+
+		int status = connectionHelper.readHttpResponse();
+		this.uploadPolicy.displayDebug("HEAD status: " + status, 30);
+		String headers = connectionHelper.getResponseHeaders();
+
+		// Let's look for the protocol
+		Matcher m = Pattern.compile("^(HTTP/\\d\\.\\d)\\s(.*)\\s.*$",
+				Pattern.MULTILINE).matcher(headers);
+		if (!m.find()) {
+			// Using default value. Already initialized.
+			this.uploadPolicy
+					.displayErr("Unexpected HEAD response (can't find the protocol): will use the default one.");
+		} else {
+			// We will return the found protocol.
+			protocol = m.group(1);
+			this.uploadPolicy.displayDebug("HEAD protocol: " + protocol, 30);
+		}
+
+		// Let's check if we're facing an IIS server. The applet is compatible
+		// with IIS, only if allowHttpPersistent is false.
+		Pattern pIIS = Pattern.compile("^Server: .*IIS*$", Pattern.MULTILINE);
+		Matcher mIIS = pIIS.matcher(headers);
+		if (mIIS.find()) {
+			try {
+				this.uploadPolicy.setProperty(
+						UploadPolicy.PROP_ALLOW_HTTP_PERSISTENT, "false");
+				this.uploadPolicy
+						.displayWarn(UploadPolicy.PROP_ALLOW_HTTP_PERSISTENT
+								+ "' forced to false, for IIS compatibility (in HttpConnect.getProtocol())");
+			} catch (JUploadException e) {
+				this.uploadPolicy.displayWarn("Can't set property '"
+						+ UploadPolicy.PROP_ALLOW_HTTP_PERSISTENT
+						+ "' to false, in HttpConnect.getProtocol()");
+			}
+		}
+
+		// if we got a redirection code, we must find the new Location.
+		if (status == 301 || status == 302 || status == 303) {
+			Pattern pLocation = Pattern.compile("^Location: (.*)$",
+					Pattern.MULTILINE);
+			Matcher mLocation = pLocation.matcher(headers);
+			if (mLocation.find()) {
+				// We found the location where we should go instead of the
+				// original postURL
+				this.uploadPolicy.displayDebug("Location read: "
+						+ mLocation.group(1), 50);
+				changePostURL(mLocation.group(1));
+			}
+		}
+
+		// Let's free any used resource.
+		connectionHelper.dispose();
+
+		return protocol;
+	} // getProtocol()
+
+	/**
+	 * Reaction of the applet when a 301, 302 et 303 return code is returned.
+	 * The postURL is changed according to the Location header returned.
+	 * 
+	 * @param newLocation
+	 *            This new location may contain the http://host.name.domain part
+	 *            of the URL ... or not
+	 */
+	private void changePostURL(String newLocation) throws JUploadException {
+		String currentPostURL = this.uploadPolicy.getPostURL();
+		String newPostURL;
+		Pattern pHostName = Pattern.compile("http://([^/]*)/.*");
+		Matcher mOldPostURL = Pattern.compile("(.*)\\?(.*)").matcher(
+				currentPostURL);
+
+		// If there is an interrogation point in the original postURL, we'll
+		// keep the parameters, and just changed the URI part.
+		if (mOldPostURL.matches()) {
+			newPostURL = newLocation + '?' + mOldPostURL.group(2);
+			// Otherwise, we change the whole URL.
+		} else {
+			newPostURL = newLocation;
+		}
+
+		// There are three main cases or newLocation:
+		// 1- It's a full URL, with host name...
+		// 2- It's a local full path on the same server (begins with /)
+		// 3- It's a relative path (for instance, add of a prefix in the
+		// filename) (doesn't begin with /)
+		Matcher mHostOldPostURL = pHostName.matcher(currentPostURL);
+		if (!mHostOldPostURL.matches()) {
+			// Oups ! There is a little trouble here !
+			throw new JUploadException(
+					"[HttpConnect.changePostURL()] No host found in the old postURL !");
+		}
+
+		// Let's analyze the given newLocation for these three cases.
+		Matcher mHostNewLocation = pHostName.matcher(newLocation);
+		if (mHostNewLocation.matches()) {
+			// 1- It's a full URL, with host name. We already got this URL, in
+			// the newPostURL initialization.
+		} else if (newLocation.startsWith("/")) {
+			// 2- It's a local full path on the same server (begins with /)
+			newPostURL = "http://" + mHostOldPostURL.group(1) + newPostURL;
+		} else {
+			// 3- It's a relative path (for instance, add of a prefix in the
+			// filename) (doesn't begin with /)
+			Matcher mOldPostURLAllButFilename = Pattern
+					.compile("(.*)/([^/]*)$").matcher(currentPostURL);
+			if (!mOldPostURLAllButFilename.matches()) {
+				// Hum, that won't be easy.
+				throw new JUploadException(
+						"[HttpConnect.changePostURL()] Can't find the filename in the URL !");
+			}
+			newPostURL = mOldPostURLAllButFilename.group(1) + "/" + newPostURL;
+		}
+
+		// Let's store this new postURL, and display some info about the change
+		this.uploadPolicy.setPostURL(newPostURL);
+		this.uploadPolicy.displayInfo("postURL switched from " + currentPostURL
+				+ " to " + newPostURL);
+	}
+
+	/**
+	 * Creates a new instance.
+	 * 
+	 * @param policy
+	 *            The UploadPolicy to be used for logging.
+	 */
+	public HttpConnect(UploadPolicy policy) {
+		this.uploadPolicy = policy;
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/InteractiveTrustManager.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/InteractiveTrustManager.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/InteractiveTrustManager.java	(revision 3951)
@@ -0,0 +1,619 @@
+//
+// $Id: InteractiveTrustManager.java 918 2010-01-08 22:21:44Z etienne_sf $
+//
+// jupload - A file upload applet.
+//
+// Copyright 2007 The JUpload Team
+//
+// Created: 30.05.2007
+// Creator: felfert
+// Last modified: $Date: 2010-01-08 20:21:44 -0200 (Sex, 08 Jan 2010) $
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload.helper;
+
+import java.awt.BorderLayout;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.security.KeyStore;
+import java.security.KeyStoreException;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.security.UnrecoverableKeyException;
+import java.security.cert.CertificateException;
+import java.security.cert.CertificateExpiredException;
+import java.security.cert.CertificateNotYetValidException;
+import java.security.cert.X509Certificate;
+import java.util.Iterator;
+import java.util.StringTokenizer;
+import java.util.Vector;
+
+import javax.crypto.BadPaddingException;
+import javax.net.ssl.KeyManager;
+import javax.net.ssl.KeyManagerFactory;
+import javax.net.ssl.TrustManager;
+import javax.net.ssl.TrustManagerFactory;
+import javax.net.ssl.X509TrustManager;
+import javax.security.auth.callback.Callback;
+import javax.security.auth.callback.CallbackHandler;
+import javax.security.auth.callback.PasswordCallback;
+import javax.security.auth.callback.UnsupportedCallbackException;
+import javax.swing.BorderFactory;
+import javax.swing.JButton;
+import javax.swing.JEditorPane;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JPasswordField;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * An implementation of {@link javax.net.ssl.X509TrustManager} which can operate
+ * in different modes. If mode is {@link #NONE}, then any server certificate is
+ * accepted and no certificate-based client authentication is performed. If mode
+ * is SERVER, then server certificates are verified and if verification is
+ * unsuccessful, a dialog is presented to the user, which allows accepting a
+ * certificate temporarily or permanently. If mode is CLIENT, then
+ * certificate-based client authentication is performed. Finally, there is a
+ * mode STRICT, which combines both SERVER and CLIENT modes.
+ * 
+ * @author felfert
+ */
+public class InteractiveTrustManager implements X509TrustManager,
+        CallbackHandler {
+
+    /**
+     * Mode for accepting any certificate.
+     */
+    public final static int NONE = 0;
+
+    /**
+     * Mode for verifying server certificate chains.
+     */
+    public final static int SERVER = 1;
+
+    /**
+     * Mode for using client certificates.
+     */
+    public final static int CLIENT = 2;
+
+    /**
+     * Mode for performing both client authentication and server cert
+     * verification.
+     */
+    public final static int STRICT = SERVER + CLIENT;
+
+    private UploadPolicy uploadPolicy;
+
+    private int mode = STRICT;
+
+    private String hostname;
+
+    private final static String TS = ".truststore";
+
+    private final static String TSKEY = "javax.net.ssl.trustStore";
+
+    private final static String USERTS = System.getProperty("user.home")
+            + File.separator + TS;
+
+    /**
+     * Absolute path of the truststore to use.
+     */
+    private String tsname = null;
+
+    private String tspasswd = null;
+
+    private TrustManagerFactory tmf = null;
+
+    private KeyManagerFactory kmf = null;
+
+    /**
+     * The truststore for validation of server certificates
+     */
+    private KeyStore ts = null;
+
+    /**
+     * The keystore for client certificates.
+     */
+    private KeyStore ks = null;
+
+    private String getPassword(String storename) {
+        JPasswordField pwf = new JPasswordField(16);
+        JLabel l = new JLabel(this.uploadPolicy.getLocalizedString(
+                "itm_prompt_pass", storename));
+        l.setLabelFor(pwf);
+        JPanel p = new JPanel(new BorderLayout(10, 0));
+        p.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
+        p.add(l, BorderLayout.LINE_START);
+        p.add(pwf, BorderLayout.LINE_END);
+        int res = JOptionPane.showConfirmDialog(null, p, this.uploadPolicy
+                .getLocalizedString("itm_title_pass", storename),
+                JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
+        if (res == JOptionPane.OK_OPTION)
+            return new String(pwf.getPassword());
+        return null;
+    }
+
+    /**
+     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
+     */
+    public void handle(Callback[] callbacks)
+            throws UnsupportedCallbackException {
+
+        for (int i = 0; i < callbacks.length; i++) {
+            if (callbacks[i] instanceof PasswordCallback) {
+                // prompt the user for sensitive information
+                PasswordCallback pc = (PasswordCallback) callbacks[i];
+                String pw = getPassword(pc.getPrompt());
+                pc.setPassword((pw == null) ? null : pw.toCharArray());
+                pw = null;
+            } else {
+                throw new UnsupportedCallbackException(callbacks[i],
+                        "Unrecognized Callback");
+            }
+        }
+    }
+
+    /**
+     * Create a new instance.
+     * 
+     * @param p The UploadPolicy to use for this instance.
+     * @param hostname
+     * @param passwd An optional password for the truststore.
+     * @throws NoSuchAlgorithmException
+     * @throws KeyStoreException
+     * @throws CertificateException
+     * @throws IllegalArgumentException
+     * @throws UnrecoverableKeyException
+     */
+    public InteractiveTrustManager(UploadPolicy p, String hostname,
+            String passwd) throws NoSuchAlgorithmException, KeyStoreException,
+            CertificateException, IllegalArgumentException,
+            UnrecoverableKeyException {
+        this.mode = p.getSslVerifyCert();
+        this.uploadPolicy = p;
+        if ((this.mode & SERVER) != 0) {
+            if (null == passwd)
+                // The default password as distributed by Sun.
+                passwd = "changeit";
+            this.tsname = System.getProperty(TSKEY);
+            if (null == this.tsname) {
+                // The default system-wide truststore
+                this.tsname = System.getProperty("java.home") + File.separator
+                        + "lib" + File.separator + "security" + File.separator
+                        + "cacerts";
+                // If the a user-specific truststore exists, it has precedence.
+                if (new File(USERTS).exists())
+                    this.tsname = USERTS;
+            }
+            if (null == hostname || hostname.length() == 0)
+                throw new IllegalArgumentException(
+                        "hostname may not be null or empty.");
+            this.hostname = hostname;
+            // Initialize the keystore only once, so that we can
+            // reuse it during the session
+            if (null == this.ts) {
+                this.ts = KeyStore.getInstance(KeyStore.getDefaultType());
+                while (true) {
+                    try {
+                        FileInputStream is = new FileInputStream(this.tsname);
+                        this.ts.load(is, passwd.toCharArray());
+                        is.close();
+                        // need it later for eventual storing.
+                        this.tspasswd = passwd;
+                        break;
+                    } catch (IOException e) {
+                        if (e
+                                .getMessage()
+                                .equals(
+                                        "Keystore was tampered with, or password was incorrect")) {
+                            passwd = getPassword(this.uploadPolicy
+                                    .getLocalizedString("itm_tstore"));
+                            if (null != passwd)
+                                continue;
+                        }
+                        throw new KeyStoreException("Could not load truststore");
+                    }
+                }
+            }
+            this.tmf = TrustManagerFactory.getInstance(TrustManagerFactory
+                    .getDefaultAlgorithm());
+            this.tmf.init(this.ts);
+        }
+        if ((this.mode & CLIENT) != 0) {
+            String ksname = System.getProperty("javax.net.ssl.keyStore");
+            if (null == ksname)
+                ksname = System.getProperty("user.home") + File.separator
+                        + ".keystore";
+            String cpass = "changeit";
+            File f = new File(ksname);
+            if (!(f.exists() && f.isFile()))
+                throw new KeyStoreException("Keystore " + ksname
+                        + " does not exist.");
+            if (null == this.kmf) {
+                String kstype = ksname.toLowerCase().endsWith(".p12") ? "PKCS12"
+                        : KeyStore.getDefaultType();
+                this.ks = KeyStore.getInstance(kstype);
+                while (true) {
+                    try {
+                        FileInputStream is = new FileInputStream(ksname);
+                        this.ks.load(is, cpass.toCharArray());
+                        is.close();
+                        break;
+                    } catch (IOException e) {
+                        if ((e.getCause() instanceof BadPaddingException)
+                                || (e.getMessage()
+                                        .equals("Keystore was tampered with, or password was incorrect"))) {
+                            cpass = getPassword("Keystore");
+                            if (null != cpass)
+                                continue;
+                        }
+                        throw new KeyStoreException("Could not load keystore: "
+                                + e.getMessage());
+                    }
+                }
+                this.kmf = KeyManagerFactory.getInstance(KeyManagerFactory
+                        .getDefaultAlgorithm());
+                this.kmf.init(this.ks, cpass.toCharArray());
+            }
+        }
+
+    }
+
+    /**
+     * Retrieve key managers.
+     * 
+     * @return The current array of key managers.
+     */
+    public KeyManager[] getKeyManagers() {
+        return ((this.mode & CLIENT) == 0) ? null : this.kmf.getKeyManagers();
+    }
+
+    /**
+     * Retrieve trust managers.
+     * 
+     * @return The current array of trust managers
+     */
+    public X509TrustManager[] getTrustManagers() {
+        return new X509TrustManager[] {
+            this
+        };
+    }
+
+    /**
+     * As this class is used on the client side only, The implementation of this
+     * method does nothing.
+     * 
+     * @see javax.net.ssl.X509TrustManager#checkClientTrusted(java.security.cert.X509Certificate[],
+     *      java.lang.String)
+     */
+    public void checkClientTrusted(X509Certificate[] arg0, String arg1) {
+        // Nothing to do.
+    }
+
+    /**
+     * Format a DN. This method formats a DN (Distinguished Name) string as
+     * returned from {@link javax.security.auth.x500.X500Principal#getName()} to
+     * HTML table columns.
+     * 
+     * @param dn The DN to format.
+     * @param cn An optional CN (Common Name) to match against the CN in the DN.
+     *            If this parameter is non null and the CN, encoded in the DN
+     *            does not match the CN specified, it is considered an error and
+     *            the CN is printed accordingly (red).
+     * @param reason A vector of error-strings. If the CN-comparison fails, an
+     *            explanation is added to this vector.
+     * @return A string, containing the HTML code rendering the given DN in a
+     *         table.
+     */
+    private String formatDN(String dn, String cn, Vector<String> reason) {
+        StringBuffer ret = new StringBuffer();
+        StringTokenizer t = new StringTokenizer(dn, ",");
+        while (t.hasMoreTokens()) {
+            String tok = t.nextToken();
+            while (tok.endsWith("\\"))
+                tok += t.nextToken();
+            String kv[] = tok.split("=", 2);
+            if (kv.length == 2) {
+                if (kv[0].equals("C"))
+                    ret.append("<tr><td>").append(
+                            this.uploadPolicy.getLocalizedString("itm_cert_C"))
+                            .append("</td><td>").append(kv[1]).append(
+                                    "</td></tr>\n");
+                if (kv[0].equals("CN")) {
+                    boolean ok = true;
+                    if (null != cn)
+                        ok = cn.equals(kv[1]);
+                    ret.append("<tr><td>")
+                            .append(
+                                    this.uploadPolicy
+                                            .getLocalizedString("itm_cert_CN"))
+                            .append("</td><td");
+                    ret.append(ok ? ">" : " class=\"err\">").append(kv[1])
+                            .append("</td></tr>\n");
+                    if (!ok)
+                        reason.add(this.uploadPolicy.getLocalizedString(
+                                "itm_reason_cnmatch", cn));
+                }
+                if (kv[0].equals("L"))
+                    ret.append("<tr><td>").append(
+                            this.uploadPolicy.getLocalizedString("itm_cert_L"))
+                            .append("</td><td>").append(kv[1]).append(
+                                    "</td></tr>\n");
+                if (kv[0].equals("ST"))
+                    ret.append("<tr><td>")
+                            .append(
+                                    this.uploadPolicy
+                                            .getLocalizedString("itm_cert_ST"))
+                            .append("</td><td>").append(kv[1]).append(
+                                    "</td></tr>\n");
+                if (kv[0].equals("O"))
+                    ret.append("<tr><td>").append(
+                            this.uploadPolicy.getLocalizedString("itm_cert_O"))
+                            .append("</td><td>").append(kv[1]).append(
+                                    "</td></tr>\n");
+                if (kv[0].equals("OU"))
+                    ret.append("<tr><td>")
+                            .append(
+                                    this.uploadPolicy
+                                            .getLocalizedString("itm_cert_OU"))
+                            .append("</td><td>").append(kv[1]).append(
+                                    "</td></tr>\n");
+            }
+        }
+        return ret.toString();
+    }
+
+    private void CertDialog(X509Certificate c) throws CertificateException {
+        int i;
+        boolean expired = false;
+        boolean notyet = false;
+        Vector<String> reason = new Vector<String>();
+        reason.add(this.uploadPolicy.getLocalizedString("itm_reason_itrust"));
+        try {
+            c.checkValidity();
+        } catch (CertificateExpiredException e1) {
+            expired = true;
+            reason.add(this.uploadPolicy
+                    .getLocalizedString("itm_reason_expired"));
+        } catch (CertificateNotYetValidException e2) {
+            notyet = true;
+            reason.add(this.uploadPolicy
+                    .getLocalizedString("itm_reason_notyet"));
+        }
+
+        StringBuffer msg = new StringBuffer();
+        msg.append("<html><head>");
+        msg.append("<style type=\"text/css\">\n");
+        msg.append("td, th, p, body { ");
+        msg.append("font-family: Arial, Helvetica, sans-serif; ");
+        msg.append("font-size: 12pt; ");
+        // PLAF hassle. The PLAF renders controls with different text colors,
+        // but
+        // does not set SystemColor.controlText. So we create a dummy button and
+        // retrieve its text color.
+        Integer ii = Integer
+                .valueOf(new JButton(".").getForeground().getRGB() & 0x00ffffff);
+        msg.append("color: ").append(String.format("#%06x", ii)).append(" }\n");
+        msg.append("th { text-align: left; }\n");
+        msg.append("td { margin-left: 20; }\n");
+        msg.append(".err { color: red; }\n");
+        msg.append("</style>\n");
+        msg.append("</head><body>");
+        msg.append("<h3>").append(
+                this.uploadPolicy.getLocalizedString("itm_fail_verify"))
+                .append("</h3>");
+        msg.append("<h4>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_details"))
+                .append("</h4>");
+        msg.append("<table>");
+        msg.append("<tr><th colspan=2>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_subject"))
+                .append("</th></tr>");
+        msg.append(formatDN(c.getSubjectX500Principal().getName(),
+                this.hostname, reason));
+        msg.append("<tr><td>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_nbefore"))
+                .append("</td>");
+        msg.append(notyet ? "<td class=\"err\">" : "<td>").append(
+                c.getNotBefore()).append("</td></tr>\n");
+        msg.append("<tr><td>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_nafter"))
+                .append("</td>");
+        msg.append(expired ? "<td class=\"err\">" : "<td>").append(
+                c.getNotAfter()).append("</td></tr>\n");
+        msg.append("<tr><td>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_serial"))
+                .append("</td><td>");
+        msg.append(c.getSerialNumber());
+        msg.append("</td></tr>\n");
+        msg.append("<tr><td>")
+                .append(
+                        this.uploadPolicy.getLocalizedString("itm_cert_fprint",
+                                "SHA1")).append("</td><td>");
+        MessageDigest d;
+        StringBuffer fp = new StringBuffer();
+        try {
+            d = MessageDigest.getInstance("SHA1");
+        } catch (NoSuchAlgorithmException e) {
+            throw new CertificateException(
+                    "Unable to calculate certificate SHA1 fingerprint: "
+                            + e.getMessage());
+        }
+        byte[] sha1sum = d.digest(c.getEncoded());
+        for (i = 0; i < sha1sum.length; i++) {
+            if (i > 0)
+                fp.append(":");
+            fp.append(Integer.toHexString((sha1sum[i] >> 4) & 0x0f));
+            fp.append(Integer.toHexString(sha1sum[i] & 0x0f));
+        }
+        msg.append(fp).append("</td></tr>\n");
+        fp.setLength(0);
+        msg.append("<tr><td>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_fprint", "MD5"))
+                .append("</td><td>");
+        try {
+            d = MessageDigest.getInstance("MD5");
+        } catch (NoSuchAlgorithmException e) {
+            throw new CertificateException(
+                    "Unable to calculate certificate MD5 fingerprint: "
+                            + e.getMessage());
+        }
+        byte[] md5sum = d.digest(c.getEncoded());
+        for (i = 0; i < md5sum.length; i++) {
+            if (i > 0)
+                fp.append(":");
+            fp.append(Integer.toHexString((md5sum[i] >> 4) & 0x0f));
+            fp.append(Integer.toHexString(md5sum[i] & 0x0f));
+        }
+        msg.append(fp).append("</td></tr>\n");
+        msg.append("</table><table>");
+        msg.append("<tr><th colspan=2>").append(
+                this.uploadPolicy.getLocalizedString("itm_cert_issuer"))
+                .append("</th></tr>");
+        msg
+                .append(formatDN(c.getIssuerX500Principal().getName(), null,
+                        reason));
+        msg.append("</table>");
+        msg.append("<p><b>").append(
+                this.uploadPolicy.getLocalizedString("itm_reasons")).append(
+                "</b><br><ul>");
+        Iterator<String> it = reason.iterator();
+        while (it.hasNext()) {
+            msg.append("<li>" + it.next() + "</li>\n");
+        }
+        msg.append("</ul></p>");
+        msg.append("<p><b>").append(
+                this.uploadPolicy.getLocalizedString("itm_accept_prompt"))
+                .append("</b></p>");
+        msg.append("</body></html>");
+
+        JPanel p = new JPanel();
+        p.setLayout(new BorderLayout());
+        JEditorPane ep = new JEditorPane("text/html", msg.toString());
+        ep.setEditable(false);
+        ep.setBackground(p.getBackground());
+        p.add(ep, BorderLayout.CENTER);
+
+        String no = this.uploadPolicy.getLocalizedString("itm_accept_no");
+        int ans = JOptionPane.showOptionDialog(null, p,
+                "SSL Certificate Alert", JOptionPane.YES_NO_CANCEL_OPTION,
+                JOptionPane.WARNING_MESSAGE, null, new String[] {
+                        this.uploadPolicy
+                                .getLocalizedString("itm_accept_always"),
+                        this.uploadPolicy.getLocalizedString("itm_accept_now"),
+                        no
+                }, no);
+        switch (ans) {
+            case JOptionPane.CANCEL_OPTION:
+            case JOptionPane.CLOSED_OPTION:
+                throw new CertificateException("Server certificate rejected.");
+            case JOptionPane.NO_OPTION:
+            case JOptionPane.YES_OPTION:
+                // Add certificate to truststore
+                try {
+                    this.ts.setCertificateEntry(fp.toString(), c);
+                } catch (KeyStoreException e) {
+                    throw new CertificateException(
+                            "Unable to add certificate: " + e.getMessage());
+                }
+                if (ans == JOptionPane.YES_OPTION) {
+                    // Save truststore for permanent acceptance.
+                    // If not explicitely specified, we save to a
+                    // user-truststore.
+                    if (null == System.getProperty(TSKEY))
+                        this.tsname = USERTS;
+                    while (true) {
+                        try {
+                            File f = new File(this.tsname);
+                            boolean old = false;
+                            if (f.exists()) {
+                                if (!f.renameTo(new File(this.tsname + ".old")))
+                                    throw new IOException(
+                                            "Could not rename truststore");
+                                old = true;
+                            } else {
+                                // New truststore, get a new password.
+                                this.tspasswd = this
+                                        .getPassword(this.uploadPolicy
+                                                .getLocalizedString("itm_new_tstore"));
+                                if (null == this.tspasswd)
+                                    this.tspasswd = "changeit";
+                            }
+                            FileOutputStream os = new FileOutputStream(
+                                    this.tsname);
+                            this.ts.store(os, this.tspasswd.toCharArray());
+                            os.close();
+                            if (old && (!f.delete()))
+                                throw new IOException(
+                                        "Could not delete old truststore");
+                            // Must re-initialize TrustManagerFactory
+                            this.tmf.init(this.ts);
+                            System.out.println("Saved cert to " + this.tsname);
+                            break;
+                        } catch (Exception e) {
+                            if (this.tsname.equals(USERTS))
+                                throw new CertificateException(e);
+                            this.tsname = USERTS;
+                        }
+                    }
+                }
+        }
+    }
+
+    /**
+     * @see javax.net.ssl.X509TrustManager#checkServerTrusted(java.security.cert.X509Certificate[],
+     *      java.lang.String)
+     */
+    public void checkServerTrusted(X509Certificate[] chain, String authType)
+            throws CertificateException {
+        if ((this.mode & SERVER) != 0) {
+            if (null == chain || chain.length == 0)
+                throw new IllegalArgumentException(
+                        "Certificate chain is null or empty");
+
+            int i;
+            TrustManager[] mgrs = this.tmf.getTrustManagers();
+            for (i = 0; i < mgrs.length; i++) {
+                if (mgrs[i] instanceof X509TrustManager) {
+                    X509TrustManager m = (X509TrustManager) (mgrs[i]);
+                    try {
+                        m.checkServerTrusted(chain, authType);
+                        return;
+                    } catch (Exception e) {
+                        // try next
+                    }
+                }
+            }
+
+            // If we get here, the certificate could not be verified.
+            // Ask the user what to do.
+            CertDialog(chain[0]);
+        }
+        // In dummy mode: Nothing to do.
+    }
+
+    /**
+     * @see javax.net.ssl.X509TrustManager#getAcceptedIssuers()
+     */
+    public X509Certificate[] getAcceptedIssuers() {
+        System.out.println("getAcceptedIssuers");
+        return new X509Certificate[0];
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPInputStreamReader.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPInputStreamReader.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/helper/HTTPInputStreamReader.java	(revision 3951)
@@ -0,0 +1,592 @@
+package wjhk.jupload2.upload.helper;
+
+import java.io.IOException;
+import java.io.PushbackInputStream;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import wjhk.jupload2.exception.JUploadEOFException;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * A helper, to read the response coming from the server.
+ * 
+ * @author etienne_sf
+ */
+public class HTTPInputStreamReader {
+    // //////////////////////////////////////////////////////////////////////////////
+    // //////////////////// Main attributes
+    // //////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * The current upload policy, always useful.
+     */
+    private UploadPolicy uploadPolicy = null;
+
+    private HTTPConnectionHelper httpConnectionHelper = null;
+
+    /**
+     * Contains the HTTP response bytearrayResponseBody, that is: the server
+     * response, without the headers.
+     */
+    String stringResponseBody = null;
+
+    private byte[] bytearrayResponseBody = new byte[0];
+
+    /**
+     * The headers of the HTTP response.
+     */
+    String responseHeaders = null;
+
+    /**
+     * The status message from the first line of the response (e.g. "200 OK").
+     */
+    String responseMsg = null;
+
+    // ////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////// ATTRIBUTE CONTAINING DATA COMING FROM THE RESPONSE
+    // ////////////////////////////////////////////////////////////////////////////////////
+
+    private CookieJar cookies = null;
+
+    boolean gotClose = false;
+
+    private boolean gotChunked = false;
+
+    private boolean gotContentLength = false;
+
+    private int clen = 0;
+
+    /**
+     * The server HTTP response. Should be 200, in case of success.
+     */
+    private int httpStatusCode = 0;
+
+    private String line = "";
+
+    private String charset = "ISO-8859-1";
+
+    // ////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////// CONSTANTS USED TO CONTROL THE HTTP INTPUT
+    // ////////////////////////////////////////////////////////////////////////////////////
+    private final static int CHUNKBUF_SIZE = 4096;
+
+    private final byte chunkbuf[] = new byte[CHUNKBUF_SIZE];
+
+    private final static Pattern pChunked = Pattern.compile(
+            "^Transfer-Encoding:\\s+chunked", Pattern.CASE_INSENSITIVE);
+
+    private final static Pattern pClose = Pattern.compile(
+            "^Connection:\\s+close", Pattern.CASE_INSENSITIVE);
+
+    private final static Pattern pProxyClose = Pattern.compile(
+            "^Proxy-Connection:\\s+close", Pattern.CASE_INSENSITIVE);
+
+    private final static Pattern pHttpStatus = Pattern
+            .compile("^HTTP/\\d\\.\\d\\s+((\\d+)\\s+.*)$");
+
+    private final static Pattern pContentLen = Pattern.compile(
+            "^Content-Length:\\s+(\\d+)$", Pattern.CASE_INSENSITIVE);
+
+    private final static Pattern pContentTypeCs = Pattern.compile(
+            "^Content-Type:\\s+.*;\\s*charset=([^;\\s]+).*$",
+            Pattern.CASE_INSENSITIVE);
+
+    private final static Pattern pSetCookie = Pattern.compile(
+            "^Set-Cookie:\\s+(.*)$", Pattern.CASE_INSENSITIVE);
+
+    /**
+     * The standard constructor: does nothing ! Oh yes, it initialize some
+     * attribute from the given parameter... :-)
+     * 
+     * @param httpConnectionHelper The connection helper, associated with this
+     *            instance.
+     * @param uploadPolicy The current upload policy.
+     */
+    public HTTPInputStreamReader(HTTPConnectionHelper httpConnectionHelper,
+            UploadPolicy uploadPolicy) {
+        this.httpConnectionHelper = httpConnectionHelper;
+        this.uploadPolicy = uploadPolicy;
+        this.cookies = new CookieJar(uploadPolicy);
+    }
+
+    /**
+     * Return the last read http response (200, in case of success).
+     * 
+     * @return The last read http response
+     */
+    public int gethttpStatusCode() {
+        return this.httpStatusCode;
+    }
+
+    /**
+     * Get the last response bytearrayResponseBody.
+     * 
+     * @return The last read response bytearrayResponseBody.
+     */
+    public String getResponseBody() {
+        return this.stringResponseBody;
+    }
+
+    /**
+     * Get the last response bytearrayResponseBody. This byte array should be
+     * decoded by using the {@link #getResponseCharset()}.
+     * 
+     * @return The last read response bytearrayResponseBody.
+     * 
+     */
+    public byte[] getResponseBodyAsByteArray() {
+        return this.bytearrayResponseBody;
+    }
+
+    /**
+     * Get the charset that should be used to decode the last response, when
+     * using the {@link #getResponseBodyAsByteArray()} method.
+     * 
+     * @return The last read response bytearrayResponseBody.
+     */
+    public String getResponseCharset() {
+        return this.charset;
+    }
+
+    /**
+     * Get the headers of the HTTP response.
+     * 
+     * @return The HTTP headers.
+     */
+    public String getResponseHeaders() {
+        return this.responseHeaders;
+    }
+
+    /**
+     * Get the last response message.
+     * 
+     * @return The response message from the first line of the response (e.g.
+     *         "200 OK").
+     */
+    public String getResponseMsg() {
+        return this.responseMsg;
+    }
+
+    /**
+     * The main method: reads the response in the input stream.
+     * 
+     * @return The response status (e.g.: 200 if everything was ok)
+     * @throws JUploadException
+     */
+    public int readHttpResponse() throws JUploadException {
+        PushbackInputStream httpDataIn = this.httpConnectionHelper
+                .getInputStream();
+
+        try {
+            // We first read the headers,
+            readHeaders(httpDataIn);
+
+            // then the bytearrayResponseBody.
+            // If we're in a HEAD request ... we're not interested in the
+            // bytearrayResponseBody!
+            if (this.httpConnectionHelper.getMethod().equals("HEAD")) {
+                this.uploadPolicy
+                        .displayDebug(
+                                "This is a HEAD request: we don't care about the bytearrayResponseBody",
+                                70);
+                this.stringResponseBody = "";
+            } else {
+                readBody(httpDataIn);
+            }
+        } catch (JUploadException e) {
+            throw e;
+        } catch (Exception e) {
+            throw new JUploadException(e);
+        }
+
+        return this.httpStatusCode;
+    }
+
+    // //////////////////////////////////////////////////////////////////////////////////////
+    // //////////////////// Various utilities
+    // //////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Concatenates two byte arrays.
+     * 
+     * @param buf1 The first array
+     * @param buf2 The second array
+     * @return A byte array, containing buf2 appended to buf2
+     */
+    static byte[] byteAppend(byte[] buf1, byte[] buf2) {
+        byte[] ret = new byte[buf1.length + buf2.length];
+        System.arraycopy(buf1, 0, ret, 0, buf1.length);
+        System.arraycopy(buf2, 0, ret, buf1.length, buf2.length);
+        return ret;
+    }
+
+    /**
+     * Concatenates two byte arrays.
+     * 
+     * @param buf1 The first array
+     * @param buf2 The second array
+     * @param len Number of bytes to copy from buf2
+     * @return A byte array, containing buf2 appended to buf2
+     */
+    static byte[] byteAppend(byte[] buf1, byte[] buf2, int len) {
+        if (len > buf2.length)
+            len = buf2.length;
+        byte[] ret = new byte[buf1.length + len];
+        System.arraycopy(buf1, 0, ret, 0, buf1.length);
+        System.arraycopy(buf2, 0, ret, buf1.length, len);
+        return ret;
+    }
+
+    /**
+     * Similar like BufferedInputStream#readLine() but operates on raw bytes.
+     * Line-Ending is <b>always</b> "\r\n".
+     * 
+     * @param inputStream
+     * 
+     * @param charset The input charset of the stream.
+     * @param includeCR Set to true, if the terminating CR/LF should be included
+     *            in the returned byte array.
+     * @return The line, encoded from the input stream with the given charset
+     * @throws IOException
+     * @throws JUploadException
+     */
+    public static String readLine(PushbackInputStream inputStream,
+            String charset, boolean includeCR) throws IOException,
+            JUploadException {
+        byte[] line = readLine(inputStream, includeCR);
+        return (null == line) ? null : new String(line, charset);
+    }
+
+    /**
+     * Similar like BufferedInputStream#readLine() but operates on raw bytes.
+     * According to RFC 2616, and of line may be CR (13), LF (10) or CRLF.
+     * Line-Ending is <b>always</b> "\r\n" in header, but not in text bodies.
+     * Update done by TedA (sourceforge account: tedaaa). Allows to manage
+     * response from web server that send LF instead of CRLF ! Here is a part of
+     * the RFC: <I>"we recommend that applications, when parsing such headers,
+     * recognize a single LF as a line terminator and ignore the leading
+     * CR"</I>. <BR>
+     * Corrected again to manage line finished by CR only. This is not allowed
+     * in headers, but this method is also used to read lines in the
+     * bytearrayResponseBody.
+     * 
+     * @param inputStream
+     * 
+     * @param includeCR Set to true, if the terminating CR/LF should be included
+     *            in the returned byte array. In this case, CR/LF is always
+     *            returned to the caller, whether the input stream got CR, LF or
+     *            CRLF.
+     * @return The byte array from the input stream, with or without a trailing
+     *         CRLF
+     * @throws IOException
+     * @throws JUploadException
+     */
+    public static byte[] readLine(PushbackInputStream inputStream,
+            boolean includeCR) throws IOException, JUploadException {
+        final byte EOS = -1;
+        final byte CR = 13;
+        final byte LF = 10;
+        int len = 0;
+        int buflen = 128; // average line length
+        byte[] buf = new byte[buflen];
+        byte[] ret = null;
+        int b;
+        boolean lineRead = false;
+
+        while (!lineRead) {
+            try {
+                b = inputStream.read();
+            } catch (IOException ioe) {
+                throw new JUploadIOException(ioe.getClass().getName() + ": "
+                        + ioe.getMessage()
+                        + " (while reading server response )", ioe);
+            } catch (Exception e) {
+                throw new JUploadException(e.getClass().getName() + ": "
+                        + e.getMessage() + " (while reading server response )",
+                        e);
+            }
+            switch (b) {
+                case EOS:
+                    // We've finished reading the stream, and so the line is
+                    // finished too.
+                    if (len == 0) {
+                        return null;
+                    }
+                    lineRead = true;
+                    break;
+                /*
+                 * if (len > 0) { ret = new byte[len]; System.arraycopy(buf, 0,
+                 * ret, 0, len); return ret; } return null;
+                 */
+                case LF:
+                    // We found the end of the current line.
+                    lineRead = true;
+                    break;
+                case CR:
+                    // We got a CR. It can be the end of line.
+                    // Is it followed by a LF ? (not mandatory in RFC 2616)
+                    b = inputStream.read();
+
+                    if (b != LF) {
+                        // The end of line was a simple LF: the next one blongs
+                        // to the next line.
+                        inputStream.unread(b);
+                    }
+                    lineRead = true;
+                    break;
+                default:
+                    buf[len++] = (byte) b;
+                    // If the buffer is too small, we let enough space to add CR
+                    // and LF, in case of ...
+                    if (len + 2 >= buflen) {
+                        buflen *= 2;
+                        byte[] tmp = new byte[buflen];
+                        System.arraycopy(buf, 0, tmp, 0, len);
+                        buf = tmp;
+                    }
+            }
+        } // while
+
+        // Let's go back to before any CR and LF.
+        while (len > 0 && (buf[len] == CR || buf[len] == LF)) {
+            len -= 1;
+        }
+
+        // Ok, now len indicates the end of the actual line.
+        // Should we add a proper CRLF, or nothing ?
+        if (includeCR) {
+            // We have enough space to add these two characters (see the default
+            // here above)
+            buf[len++] = CR;
+            buf[len++] = LF;
+        }
+
+        if (len > 0) {
+            ret = new byte[len];
+            if (len > 0)
+                System.arraycopy(buf, 0, ret, 0, len);
+        } else {
+            // line feed for empty line between headers and
+            // bytearrayResponseBody, or within the
+            // bytearrayResponseBody.
+            ret = new byte[0];
+        }
+        return ret;
+    }
+
+    /**
+     * Read the headers from the given input stream.
+     * 
+     * @param httpDataIn The http input stream
+     * @throws IOException
+     * @throws JUploadException
+     */
+    private void readHeaders(PushbackInputStream httpDataIn)
+            throws IOException, JUploadException {
+        StringBuffer sbHeaders = new StringBuffer();
+        // Headers are US-ASCII (See RFC 2616, Section 2.2)
+        String tmp;
+        // We must be reading the first line of the HTTP header.
+        this.uploadPolicy.displayDebug(
+                "-------- Response Headers Start --------", 80);
+
+        do {
+            tmp = readLine(httpDataIn, "US-ASCII", false);
+            if (null == tmp) {
+                throw new JUploadEOFException(this.uploadPolicy,
+                        "reading headers");
+            }
+            if (this.httpStatusCode == 0) {
+                Matcher m = pHttpStatus.matcher(tmp);
+                if (m.matches()) {
+                    this.httpStatusCode = Integer.parseInt(m.group(2));
+                    this.responseMsg = m.group(1);
+                } else {
+                    // The status line must be the first line of the
+                    // response. (See RFC 2616, Section 6.1) so this
+                    // is an error.
+
+                    // We first display the wrong line.
+                    this.uploadPolicy.displayDebug("First line of response: '"
+                            + tmp + "'", 80);
+                    // Then, we throw the exception.
+                    throw new JUploadException(
+                            "HTTP response did not begin with status line.");
+                }
+            }
+            // Handle folded headers (RFC 2616, Section 2.2). This is
+            // handled after the status line, because that line may
+            // not be folded (RFC 2616, Section 6.1).
+            if (tmp.startsWith(" ") || tmp.startsWith("\t"))
+                this.line += " " + tmp.trim();
+            else
+                this.line = tmp;
+
+            // The read line is now correctly formatted.
+            this.uploadPolicy.displayDebug(this.line, 80);
+            sbHeaders.append(tmp).append("\n");
+
+            if (pClose.matcher(this.line).matches())
+                this.gotClose = true;
+            if (pProxyClose.matcher(this.line).matches())
+                this.gotClose = true;
+            if (pChunked.matcher(this.line).matches())
+                this.gotChunked = true;
+            Matcher m = pContentLen.matcher(this.line);
+            if (m.matches()) {
+                this.gotContentLength = true;
+                this.clen = Integer.parseInt(m.group(1));
+            }
+            m = pContentTypeCs.matcher(this.line);
+            if (m.matches())
+                this.charset = m.group(1);
+            m = pSetCookie.matcher(this.line);
+            if (m.matches()) {
+                this.uploadPolicy.displayDebug(
+                        "Calling this.cookies.parseCookieHeader, with parameter: "
+                                + m.group(1), 80);
+                this.cookies.parseCookieHeader(m.group(1));
+                this.uploadPolicy.displayDebug("Cookie header parsed.", 80);
+            }
+            // RFC 2616, Section 6. Body is separated by the header with an
+            // empty line: so end of headers is an empty line.
+        } while (this.line.length() > 0);
+
+        this.responseHeaders = sbHeaders.toString();
+        this.uploadPolicy.displayDebug(
+                "--------- Response Headers End ---------", 80);
+    }// readHeaders()
+
+    /**
+     * Read the bytearrayResponseBody from the given input stream.
+     * 
+     * @param httpDataIn The http input stream
+     * @throws IOException
+     * @throws JUploadException
+     * @throws JUploadException
+     */
+    private void readBody(PushbackInputStream httpDataIn) throws IOException,
+            JUploadException {
+        // && is evaluated from left to right so !stop must come first!
+        while ((!this.gotContentLength) || (this.clen > 0)) {
+            if (this.gotChunked) {
+                // Read the chunk header.
+                // This is US-ASCII! (See RFC 2616, Section 2.2)
+                this.line = readLine(httpDataIn, "US-ASCII", false);
+                if (null == this.line)
+                    throw new JUploadEOFException(this.uploadPolicy,
+                            "reading HTTP Body, HTTP chunked mode (1)");
+                // Handle a single chunk of the response
+                // We cut off possible chunk extensions and ignore them.
+                // The length is hex-encoded (RFC 2616, Section 3.6.1)
+                int len = Integer.parseInt(this.line.replaceFirst(";.*", "")
+                        .trim(), 16);
+                this.uploadPolicy.displayDebug("Chunk: " + this.line + " dec: "
+                        + len, 70);
+                if (len == 0) {
+                    // RFC 2616, Section 3.6.1: A length of 0 denotes
+                    // the last chunk of the bytearrayResponseBody.
+
+                    // This code wrong if the server sends chunks with trailers!
+                    // (trailers are HTTP Headers that are send *after* the
+                    // bytearrayResponseBody. These are announced
+                    // in the regular HTTP header "Trailer".
+                    // Fritz: Never seen them so far ...
+                    // TODO: Implement trailer-handling.
+                    break;
+                }
+
+                // Loop over the chunk (len == length of the chunk)
+                while (len > 0) {
+                    int rlen = (len > CHUNKBUF_SIZE) ? CHUNKBUF_SIZE : len;
+                    int ofs = 0;
+                    if (rlen > 0) {
+                        while (ofs < rlen) {
+                            int res = httpDataIn.read(this.chunkbuf, ofs, rlen
+                                    - ofs);
+                            if (res < 0)
+                                throw new JUploadEOFException(
+                                        this.uploadPolicy,
+                                        "reading body, HTTP chunk mode (2)");
+                            len -= res;
+                            ofs += res;
+                        }
+                        if (ofs < rlen)
+                            throw new JUploadException("short read");
+                        if (rlen < CHUNKBUF_SIZE)
+                            this.bytearrayResponseBody = byteAppend(
+                                    this.bytearrayResponseBody, this.chunkbuf,
+                                    rlen);
+                        else
+                            this.bytearrayResponseBody = byteAppend(
+                                    this.bytearrayResponseBody, this.chunkbuf);
+                    }
+                }
+                // Got the whole chunk, read the trailing CRLF.
+                readLine(httpDataIn, false);
+            } else {
+                // Not chunked. Use either content-length (if available)
+                // or read until EOF.
+                if (this.gotContentLength) {
+                    // Got a Content-Length. Read exactly that amount of
+                    // bytes.
+                    while (this.clen > 0) {
+                        int rlen = (this.clen > CHUNKBUF_SIZE) ? CHUNKBUF_SIZE
+                                : this.clen;
+                        int ofs = 0;
+                        if (rlen > 0) {
+                            while (ofs < rlen) {
+                                int res = httpDataIn.read(this.chunkbuf, ofs,
+                                        rlen - ofs);
+                                if (res < 0)
+                                    throw new JUploadEOFException(
+                                            this.uploadPolicy,
+                                            "reading HTTP bytearrayResponseBody, not chunked mode");
+                                this.clen -= res;
+                                ofs += res;
+                            }
+                            if (ofs < rlen)
+                                throw new JUploadException("short read");
+                            if (rlen < CHUNKBUF_SIZE)
+                                this.bytearrayResponseBody = byteAppend(
+                                        this.bytearrayResponseBody,
+                                        this.chunkbuf, rlen);
+                            else
+                                this.bytearrayResponseBody = byteAppend(
+                                        this.bytearrayResponseBody,
+                                        this.chunkbuf);
+                        }
+                    }
+                } else {
+                    // No Content-length available, read until EOF
+                    //
+                    while (true) {
+                        byte[] lbuf = readLine(httpDataIn, true);
+                        if (null == lbuf)
+                            break;
+                        this.bytearrayResponseBody = byteAppend(
+                                this.bytearrayResponseBody, lbuf);
+                    }
+                    break;
+                }
+            }
+        } // while
+
+        // Convert the whole bytearrayResponseBody according to the charset.
+        // The default for charset ISO-8859-1, but overridden by
+        // the charset attribute of the Content-Type header (if any).
+        // See RFC 2616, Sections 3.4.1 and 3.7.1.
+        this.stringResponseBody = new String(this.bytearrayResponseBody,
+                this.charset);
+
+        // At the higher debug level, we display the response.
+        this.uploadPolicy.displayDebug("-------- Response Body Start --------",
+                99);
+        this.uploadPolicy.displayDebug(this.stringResponseBody, 99);
+        this.uploadPolicy.displayDebug("-------- Response Body End --------",
+                99);
+    }// readBody
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/DefaultFileUploadThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/DefaultFileUploadThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/DefaultFileUploadThread.java	(revision 3951)
@@ -0,0 +1,768 @@
+//
+// $Id: DefaultFileUploadThread.java 287 2007-06-17 09:07:04 +0000 (dim., 17
+// juin 2007) felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-06-29 16:49:10 -0300 (Ter, 29 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import java.io.OutputStream;
+import java.net.SocketException;
+import java.util.concurrent.BlockingQueue;
+import java.util.regex.Pattern;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailed;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.exception.JUploadInterrupted;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.DialogUploadRetry;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class is based on the {@link FileUploadThread} class. It's an abstract
+ * class that contains the default implementation for the
+ * {@link FileUploadThread} interface. <BR>
+ * It contains the following abstract methods, which must be implemented in the
+ * children classes. These methods are called in this order: <DIR> <LI>For each
+ * upload request (for instance, upload of 3 files with nbFilesPerRequest to 2,
+ * makes 2 request: 2 files, then the last one): <DIR> <LI><I>try</I> <LI>
+ * {@link #startRequest}: start of the UploadRequest. <LI>Then, for each file to
+ * upload (according to the nbFilesPerRequest and maxChunkSize applet
+ * parameters) <DIR> <LI>beforeFile(int) is called before writting the bytes for
+ * this file (or this chunk) <LI>afterFile(int) is called after writting the
+ * bytes for this file (or this chunk) </DIR> <LI>finishRequest() </DIR></LI>
+ * <I>finally</I>cleanRequest() <LI>Call of cleanAll(), to clean up any used
+ * resources, common to the whole upload. </DIR>
+ */
+public abstract class DefaultFileUploadThread extends Thread implements
+		FileUploadThread {
+
+	// ////////////////////////////////////////////////////////////////////////
+	// /////////////////////// VARIABLES //////////////////////////////////////
+	// ////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * The queue that'll transmit each packet to upload to the server.
+	 */
+	BlockingQueue<UploadFilePacket> packetQueue = null;
+
+	/**
+	 * The upload manager. The thread that prepares files, and is responsible to
+	 * manage the upload process.
+	 * 
+	 * @see FileUploadManagerThread
+	 */
+	FileUploadManagerThread fileUploadManagerThread = null;
+
+	/**
+	 * The upload policy contains all parameters needed to define the way files
+	 * should be uploaded, including the URL.
+	 */
+	protected UploadPolicy uploadPolicy = null;
+
+	/**
+	 * The value of the applet parameter maxChunkSize, or its default value.
+	 */
+	private long maxChunkSize;
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// PRIVATE ATTRIBUTES
+	// ////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Current retry number, for the resume upload feature. The first try occurs
+	 * with nbRetry=0.
+	 */
+	int nbRetry = 0;
+
+	/**
+	 * The full response message from the server, if any. For instance, in HTTP
+	 * mode, this contains both the headers and the body.
+	 */
+	protected String responseMsg = "";
+
+	/**
+	 * The response message from the application. For instance, in HTTP mode,
+	 * this contains the body response.<BR>
+	 * Note: for easier management on the various server configurations, all end
+	 * or line characters (CR, LF or CRLF) are changed to uniform CRLF.
+	 */
+	protected String responseBody = "";
+
+	/**
+	 * Creates a new instance.
+	 * 
+	 * @param threadName
+	 *            The name of the thread, that will be displayed in the debugger
+	 *            and in the logs.
+	 * @param packetQueue
+	 *            The queue from wich packets to upload are available.
+	 * @param uploadPolicy
+	 *            The upload policy to be applied.
+	 * @param fileUploadManagerThread
+	 *            The thread that is managing the upload.
+	 */
+	public DefaultFileUploadThread(String threadName,
+			BlockingQueue<UploadFilePacket> packetQueue,
+			UploadPolicy uploadPolicy,
+			FileUploadManagerThread fileUploadManagerThread) {
+		// Thread parameters.
+		super(threadName);
+
+		// Specific stuff.
+		this.packetQueue = packetQueue;
+		this.uploadPolicy = uploadPolicy;
+		this.fileUploadManagerThread = fileUploadManagerThread;
+		// Let's read up to date upload parameters.
+		this.maxChunkSize = this.uploadPolicy.getMaxChunkSize();
+
+		this.uploadPolicy.displayDebug("DefaultFileUploadThread created", 30);
+	}
+
+	/**
+	 * This method is called before the upload. It calls the
+	 * {@link FileData#beforeUpload()} method for all files to upload, and
+	 * prepares the progressBar bar (if any), with total number of bytes to
+	 * upload. final private void beforeUpload() throws JUploadException { for
+	 * (int i = 0; i < this.filesToUpload.length &&
+	 * !this.fileUploadManager.isUploadStopped(); i++) {
+	 * this.filesToUpload[i].beforeUpload(); } } /** This methods upload
+	 * overhead for the file number indexFile in the filesDataParam given to the
+	 * constructor. For instance, in HTTP, the upload contains a head and a tail
+	 * for each files.
+	 * 
+	 * @param uploadFileData
+	 *            The file whose additional length is asked.
+	 * @return The additional number of bytes for this file.
+	 */
+	abstract long getAdditionnalBytesForUpload(UploadFileData uploadFileData)
+			throws JUploadIOException;
+
+	/**
+	 * This method is called before starting of each request. It can be used to
+	 * prepare any work, before starting the request. For instance, in HTTP, the
+	 * tail must be properly calculated, as the last one must be different from
+	 * the others.<BR>
+	 * The packets to send are available through the {@link #packetQueue} queue.
+	 */
+	abstract void beforeRequest(UploadFilePacket packet)
+			throws JUploadException;
+
+	/**
+	 * This method is called for each upload request to the server. The number
+	 * of request to the server depends on: <DIR> <LI>The total number of files
+	 * to upload. <LI>The value of the nbFilesPerRequest applet parameter. <LI>
+	 * The value of the maxChunkSize applet parameter. </DIR> The main objective
+	 * of this method is to open the connection to the server, where the files
+	 * to upload will be written. It should also send any header necessary for
+	 * this upload request. The {@link #getOutputStream()} methods is then
+	 * called to know where the uploaded files should be written. <BR>
+	 * Note: it's up to the class containing this method to internally manage
+	 * the connection.
+	 * 
+	 * @param contentLength
+	 *            The total number of bytes for the files (or the chunk) to
+	 *            upload in this query.
+	 * @param bChunkEnabled
+	 *            True if this upload is part of a file (can occurs only if the
+	 *            maxChunkSize applet parameter is set). False otherwise.
+	 * @param chunkPart
+	 *            The chunk number. Should be ignored if bChunkEnabled is false.
+	 * @param bLastChunk
+	 *            True if in chunk mode, and this upload is the last one. Should
+	 *            be ignored if bChunkEnabled is false.
+	 */
+	abstract void startRequest(long contentLength, boolean bChunkEnabled,
+			int chunkPart, boolean bLastChunk) throws JUploadException;
+
+	/**
+	 * This method is called at the end of each request.
+	 * 
+	 * @return The response status code from the server (200 == OK)
+	 * @see #startRequest(long, boolean, int, boolean)
+	 */
+	abstract int finishRequest() throws JUploadException;
+
+	/**
+	 * Reaction of the upload thread, when an interruption has been received.
+	 * This method should close all resource to the server, to allow the server
+	 * to free any resource (temporary file, network connection...).
+	 */
+	abstract void interruptionReceived();
+
+	/**
+	 * This method is called before sending the bytes corresponding to the file
+	 * whose index is given in argument. If the file is splitted in chunks (see
+	 * the maxChunkSize applet parameter), this method is called before each
+	 * chunk for this file.
+	 * 
+	 * @param uploadFilePacket
+	 *            The bunch of files in the current request
+	 * @param uploadFileData
+	 *            The next file that will be sent
+	 */
+	abstract void beforeFile(UploadFilePacket uploadFilePacket,
+			UploadFileData uploadFileData) throws JUploadException;
+
+	/**
+	 * Idem as {@link #beforeFile(UploadFilePacket, UploadFileData)}, but is
+	 * called after each file (and each chunks for each file).
+	 * 
+	 * @param uploadFileData
+	 *            The file that was just sent.
+	 */
+	abstract void afterFile(UploadFileData uploadFileData)
+			throws JUploadException;
+
+	/**
+	 * Clean any used resource of the last executed request. In HTTP mode, the
+	 * output stream, input stream and the socket should be cleaned here.
+	 */
+	abstract void cleanRequest() throws JUploadException;
+
+	/**
+	 * Clean any used resource, like a 'permanent' connection. This method is
+	 * called after the end of the last request (see on the top of this page for
+	 * details).
+	 */
+	abstract void cleanAll() throws JUploadException;
+
+	/**
+	 * Get the output stream where the files should be written for upload.
+	 * 
+	 * @return The target output stream for upload.
+	 */
+	abstract OutputStream getOutputStream() throws JUploadException;
+
+	/**
+	 * Return the the body for the server response. That is: the server response
+	 * without the http header. This is the functional response from the server
+	 * application, that has been as the HTTP reply body, for instance: all
+	 * 'echo' PHP commands. <BR>
+	 * 
+	 * @return The last application response (HTTP body, in HTTP upload)
+	 */
+	public String getResponseBody() {
+		return this.responseBody;
+	}
+
+	/**
+	 * Get the server Output.
+	 * 
+	 * @return The status message from the first line of the response (e.g. "200
+	 *         OK").
+	 */
+	public String getResponseMsg() {
+		return this.responseMsg;
+	}
+
+	/**
+	 * @return the packetQueue
+	 */
+	public BlockingQueue<UploadFilePacket> getPacketQueue() {
+		return packetQueue;
+	}
+
+	/**
+	 * Unused Store the String that contains the server response body.
+	 * 
+	 * @param body
+	 *            The response body that has been read.
+	 */
+	void setResponseBody(String body) {
+		this.responseBody = normalizeCRLF(body);
+	}
+
+	/**
+	 * Add a String that has been read from the server response.
+	 * 
+	 * @param msg
+	 *            The status message from the first line of the response (e.g.
+	 *            "200 OK").
+	 */
+	void setResponseMsg(String msg) {
+		this.responseMsg = normalizeCRLF(msg);
+	}
+
+	// ////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// PRIVATE FUNCTIONS
+	// ////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * This method waits for a packet on the packetQueue. Then, it calls the
+	 * doUpload() method, to send these files to the server.
+	 */
+	@Override
+	final public void run() {
+		this.uploadPolicy.displayDebug("Start of the FileUploadThread", 5);
+
+		// We'll stop the upload if an error occurs. So the try/catch is
+		// outside the while.
+		while (!this.fileUploadManagerThread.isUploadFinished()) {
+			UploadFilePacket packet = null;
+
+			try {
+				// We take the next packet. This method will block until a
+				// packet is ready.
+				packet = packetQueue.take();
+
+				// If the packet is 'poisonned', then it's the standard end of
+				// work.
+				if (packet.isPoisonned()) {
+					break;
+				}
+
+				// /////////////////////////////////////////////////////////////////////////////////
+				// Let's go to work : THIS IS THE UPLOAD, surrounded by the
+				// RESUME LOOP
+				// /////////////////////////////////////////////////////////////////////////////////
+				nbRetry = 0;
+				while (true) {
+					try {
+						// Let's try to upload the current packet.
+						doUpload(packet);
+
+						// If we are here, the last upload is a success. Let's
+						// exit the loop.
+						break;
+					} catch (JUploadException jue) {
+						// manageRetry throw the exception, if no retry should
+						// be done.
+						manageRetry(jue);
+
+						// If we are here, the applet should retry the upload.
+						// We let it loop again.
+						nbRetry += 1;
+					}
+				}// while(resume)
+				// /////////////////////////////////////////////////////////////////////////////////
+				// //////////////// ENF OF RESUME LOOP
+				// /////////////////////////////////////////////////////////////////////////////////
+
+				this.uploadPolicy.displayDebug("After do upload", 50);
+			} catch (InterruptedException e) {
+				this.uploadPolicy.displayWarn(this.getClass().getName()
+						+ ".run(): received in " + e.getClass().getName()
+						+ ", exiting...");
+				break;
+			} catch (JUploadException e) {
+				if (this.fileUploadManagerThread.isUploadFinished()) {
+					// We ignore the error
+					this.uploadPolicy.displayWarn("Ignoring "
+							+ e.getClass().getName()
+							+ " because upload is finished");
+				} else {
+					this.fileUploadManagerThread.setUploadException(e);
+				}
+			} catch (JUploadInterrupted e) {
+				// The upload has been interrupted, probably by the user
+				// (stop
+				// button). The fileManagerUploadThread aleady knows this.
+				this.uploadPolicy.displayInfo("Upload stopped by the user");
+				this.uploadPolicy.displayDebug(e.getMessage(), 30);
+			} finally {
+				// Let's free any locked resource for the current packet.
+				// This is done here, to allow the resume feature (and, even in
+				// case an error occurs, we free resources only after the last
+				// retry)
+				for (UploadFileData uploadFileData : packet) {
+					if (uploadFileData.isPreparedForUpload()) {
+						uploadFileData.afterUpload();
+					}
+				}
+			}
+		}// while (!isUploadFinished)
+
+		this.uploadPolicy.displayDebug("End of the FileUploadThread", 5);
+	}// run
+
+	/**
+	 * @param jue
+	 * @throws JUploadException
+	 */
+	private void manageRetry(JUploadException jue) throws JUploadException {
+		String exceptionCauseClass = (jue.getCause() == null) ? "no exception cause"
+				: jue.getCause().getClass().getName();
+		String errMsg = jue.getClass().getName() + " (" + jue.getMessage()
+				+ "), caused by: " + exceptionCauseClass;
+
+		if (this.fileUploadManagerThread.isUploadFinished()) {
+			// The upload is stopped. This error may be caused
+			this.uploadPolicy
+					.displayWarn("The following error occurs, but the upload is stopped, ignoring it ]"
+							+ errMsg + "]");
+			throw jue;
+		} else if (jue.getCause() instanceof SocketException) {
+			this.uploadPolicy.displayWarn("A 'resumable' error occurred: "
+					+ errMsg);
+			// If it was the last retry, we stop here.
+			if (nbRetry >= this.uploadPolicy.getRetryMaxNumberOf()) {
+				this.uploadPolicy.displayWarn("Too much retries (" + nbRetry
+						+ "), exiting...");
+				throw jue;
+			}
+
+			DialogUploadRetry dialogUploadRetry = new DialogUploadRetry(
+					this.uploadPolicy.getContext().getFrame(), jue, nbRetry,
+					this.uploadPolicy);
+			// The constructor returns, when the dialog is closed. Let's check
+			// the user answer:
+			if (dialogUploadRetry.isRetryValidated()) {
+				this.uploadPolicy.displayDebug(
+						"The user (or the timer) choosed to retry the upload",
+						30);
+			} else {
+				this.uploadPolicy.displayDebug(
+						"The user refuses to retry the upload, exiting...", 30);
+				// No retry, let's note the exception and go out
+				throw jue;
+			}// End of resumable exceptions management.
+		} else {
+			// This exception can't be resumed. We transmit it.
+			this.uploadPolicy
+					.displayWarn("Non resumable error occured, exiting...");
+			throw jue;
+		}
+	}
+
+	/**
+	 * Actual execution file(s) upload. It's called by the run methods, once for
+	 * all files, or file by file, depending on the UploadPolicy. The list of
+	 * files to upload is stored in the packet parameter.<BR>
+	 * This method is called by the run() method. The prerequisite about the
+	 * filesToUpload array are: <DIR> <LI>If the sum of contentLength for the
+	 * files in the array is more than the maxChunkSize, then
+	 * nbFilesToUploadParam is one. <LI>The number of elements in filesToUpload
+	 * is less (or equal) than the nbMaxFilesPerUpload. </DIR>
+	 * 
+	 * @throws JUploadException
+	 * @throws JUploadInterrupted
+	 *             Thrown when an interruption of the thread is detected.
+	 */
+	final private void doUpload(UploadFilePacket packet)
+			throws JUploadException, JUploadInterrupted {
+		boolean bChunkEnabled = false;
+		long totalContentLength = 0;
+		long totalFileLength = 0;
+
+		// We are about to start a new upload.
+		this.fileUploadManagerThread.setUploadStatus(packet, packet.get(0),
+				FileUploadManagerThread.UPLOAD_STATUS_UPLOADING);
+
+		// Prepare upload, for all files to be uploaded.
+		beforeRequest(packet);
+
+		for (UploadFileData uploadFileData : packet) {
+			// The upload may be finished, while we're working on the files...
+			if (this.fileUploadManagerThread.isUploadFinished()) {
+				// Let's stop our work here.
+				return;
+			}
+			// Total length, for HTTP upload.
+			totalContentLength += uploadFileData.getUploadLength();
+			totalContentLength += getAdditionnalBytesForUpload(uploadFileData);
+			// Total file length: used to manage the progress bar (we don't
+			// follow the bytes uploaded within headers and forms).
+			totalFileLength += uploadFileData.getUploadLength();
+
+			this.uploadPolicy.displayDebug("file "
+					+ uploadFileData.getFileName() + ": content="
+					+ uploadFileData.getUploadLength()
+					+ " bytes, getAdditionnalBytesForUpload="
+					+ getAdditionnalBytesForUpload(uploadFileData) + " bytes",
+					50);
+		}// for
+
+		// Ok, now we check that the totalContentLength is less than the chunk
+		// size.
+		if (totalFileLength >= this.maxChunkSize) {
+			// hum, hum, we have to download file by file, with chunk enabled.
+			// This a prerequisite of this method.
+			if (packet.size() > 1) {
+				this.fileUploadManagerThread
+						.setUploadException(new JUploadException(
+								"totalContentLength >= chunkSize: this.filesToUpload.length should be 1 (doUpload)"));
+			}
+			bChunkEnabled = true;
+		}
+
+		// Now, we can actually do the job. This is delegate into smaller
+		// method, for easier understanding.
+		if (bChunkEnabled) {
+			// No more than one file, when in chunk mode.
+			if (packet.size() > 1) {
+				throw new JUploadException(
+						"totalContentLength >= chunkSize: this.filesToUpload.length should not be more than 1 (doUpload)");
+			}
+			doChunkedUpload(packet);
+		} else {
+			doNonChunkedUpload(packet, totalContentLength, totalFileLength);
+		}
+
+		// If the request properly finished, we remove the files from the list
+		// of files to upload.
+		if (this.fileUploadManagerThread.getUploadException() == null
+				&& !this.fileUploadManagerThread.isUploadStopped()) {
+			this.fileUploadManagerThread.currentRequestIsFinished(packet);
+		}
+	}
+
+	/**
+	 * Execution of an upload, in chunk mode. This method expects that the given
+	 * packet contains only one file.
+	 * 
+	 * @param packet
+	 *            The packet that contains the file to upload in chunk mode
+	 * @throws JUploadException
+	 *             When any error occurs, or when there is more than one file in
+	 *             packet.
+	 * @throws JUploadInterrupted
+	 *             Thrown when an interruption of the thread is detected.
+	 */
+	final private void doChunkedUpload(UploadFilePacket packet)
+			throws JUploadException, JUploadInterrupted {
+		boolean bLastChunk = false;
+		int chunkPart = 0;
+
+		long contentLength = 0;
+		long thisChunkSize = 0;
+
+		if (packet.size() > 1) {
+			throw new JUploadException(
+					"doChunkedUpload called with a packet of more than 1 file ("
+							+ packet.size() + " files)");
+		}
+		UploadFileData uploadFileData = packet.get(0);
+
+		// This while enables the chunk management:
+		// In chunk mode, it loops until the last chunk is uploaded. This works
+		// only because, in chunk mode, files are uploaded one y one (the for
+		// loop within the while loops through ... 1 unique file).
+		// In normal mode, it does nothing, as the bLastChunk is set to true in
+		// the first test, within the while.
+		while (!bLastChunk && !this.fileUploadManagerThread.isUploadFinished()) {
+			// Let's manage chunk:
+			// Files are uploaded one by one. This is checked just above.
+			chunkPart += 1;
+			bLastChunk = (contentLength > uploadFileData.getRemainingLength());
+
+			// Is this the last chunk ?
+			if (bLastChunk) {
+				thisChunkSize = uploadFileData.getRemainingLength();
+			} else {
+				thisChunkSize = this.maxChunkSize;
+			}
+			contentLength = thisChunkSize
+					+ getAdditionnalBytesForUpload(uploadFileData);
+
+			// We are about to start a new upload.
+			this.fileUploadManagerThread.setUploadStatus(packet,
+					uploadFileData,
+					FileUploadManagerThread.UPLOAD_STATUS_UPLOADING);
+
+			// Ok, we've prepare the job for chunk upload. Let's do it!
+			startRequest(contentLength, true, chunkPart, bLastChunk);
+
+			// Let's add any file-specific header.
+			beforeFile(packet, uploadFileData);
+
+			// Actual upload of the file:
+			uploadFileData.uploadFile(getOutputStream(), thisChunkSize);
+
+			// If we are not in chunk mode, or if it was the last chunk,
+			// upload should be finished.
+			if (bLastChunk && uploadFileData.getRemainingLength() > 0) {
+				throw new JUploadExceptionUploadFailed(
+						"Files has not be entirely uploaded. The remaining size is "
+								+ uploadFileData.getRemainingLength()
+								+ " bytes. File size was: "
+								+ uploadFileData.getUploadLength() + " bytes.");
+
+			}
+			// Let's add any file-specific header.
+			afterFile(uploadFileData);
+
+			// Let's finish the request, and wait for the server Output, if
+			// any (not applicable in FTP)
+			int status = finishRequest();
+
+			if (bLastChunk) {
+				// We are finished with this one. Let's display it.
+				this.fileUploadManagerThread
+						.setUploadStatus(
+								packet,
+								uploadFileData,
+								FileUploadManagerThread.UPLOAD_STATUS_FILE_UPLOADED_WAITING_FOR_RESPONSE);
+			} else {
+				// We are finished with the current chunk, but not with the
+				// file. Let's display it.
+				this.fileUploadManagerThread
+						.setUploadStatus(
+								packet,
+								uploadFileData,
+								FileUploadManagerThread.UPLOAD_STATUS_CHUNK_UPLOADED_WAITING_FOR_RESPONSE);
+			}
+
+			// We now ask to the uploadPolicy, if it was a success.
+			// If not, the isUploadSuccessful should raise an exception.
+			this.uploadPolicy.checkUploadSuccess(status, getResponseMsg(),
+					getResponseBody());
+
+			cleanRequest();
+		}// while
+
+		// Let's tell our manager that we've done the job!
+		this.fileUploadManagerThread.anotherFileHasBeenSent(packet,
+				uploadFileData);
+
+	}// doChunkedUpload
+
+	/**
+	 * Execution of an upload, in standard mode. This method uploads all files
+	 * in the given packet.
+	 * 
+	 * @param packet
+	 *            The files to upload in the current request to the server
+	 * @param totalContentLength
+	 *            The total size of the upload, including any protocol-specific
+	 *            header or footer.
+	 * @param totalFileLength
+	 *            The sum of each file length.
+	 * @throws JUploadException
+	 *             When any error occurs
+	 * @throws JUploadInterrupted
+	 *             Thrown when an interruption of the thread is detected.
+	 */
+	final private void doNonChunkedUpload(UploadFilePacket packet,
+			final long totalContentLength, final long totalFileLength)
+			throws JUploadException, JUploadInterrupted {
+
+		// First step is to prepare all files.
+		startRequest(totalContentLength, false, 0, true);
+
+		// Then, upload each file.
+		for (UploadFileData uploadFileData : packet) {
+			if (this.fileUploadManagerThread.isUploadFinished()) {
+				// Upload is finished (by the user or because of an error, or
+				// instance)
+				break;
+			}
+			// We are about to start a new upload.
+			this.fileUploadManagerThread.setUploadStatus(packet,
+					uploadFileData,
+					FileUploadManagerThread.UPLOAD_STATUS_UPLOADING);
+
+			// Let's add any file-specific header.
+			beforeFile(packet, uploadFileData);
+
+			// Actual upload of the file:
+			if (!this.fileUploadManagerThread.isUploadFinished()) {
+				uploadFileData.uploadFile(getOutputStream(), uploadFileData
+						.getUploadLength());
+			}
+
+			// Let's add any file-specific header.
+			if (!this.fileUploadManagerThread.isUploadFinished()) {
+				afterFile(uploadFileData);
+
+				// Let's tell our manager that we've done the job!
+				// Ok, maybe the server will refuse it, but we won't say that
+				// now!
+				this.fileUploadManagerThread.anotherFileHasBeenSent(packet,
+						uploadFileData);
+			}
+		}
+
+		// We are finished with this one. Let's display it.
+		if (!this.fileUploadManagerThread.isUploadFinished()) {
+			this.fileUploadManagerThread
+					.setUploadStatus(
+							packet,
+							packet.get(packet.size() - 1),
+							FileUploadManagerThread.UPLOAD_STATUS_FILE_UPLOADED_WAITING_FOR_RESPONSE);
+
+			// Let's finish the request, and wait for the server Output, if
+			// any (not applicable in FTP)
+			int status = finishRequest();
+
+			// We now ask to the uploadPolicy, if it was a success.
+			// If not, the isUploadSuccessful should raise an exception.
+			this.uploadPolicy.checkUploadSuccess(status, getResponseMsg(),
+					getResponseBody());
+		}
+		cleanRequest();
+
+	}// doNonChunkedUpload
+
+	/** @see FileUploadThread#close() */
+	public void close() {
+		try {
+			cleanAll();
+		} catch (JUploadException e) {
+			this.uploadPolicy.displayErr(e);
+		}
+	}
+
+	/**
+	 * Replace single \r and \n by uniform end of line characters (CRLF). This
+	 * makes it easier, to search for string within the body.
+	 * 
+	 * @param s
+	 *            The original string
+	 * @return The string with single \r and \n modified changed to CRLF (\r\n).
+	 */
+	public final String normalizeCRLF(String s) {
+		Pattern p = Pattern.compile("\\r\\n|\\r|\\n", Pattern.MULTILINE);
+		String[] lines = p.split(s);
+		// Worst case: the s string contains only \n or \r characters: we then
+		// need to triple the string length. Let's say double is enough.
+		StringBuffer sb = new StringBuffer(s.length() * 2);
+		for (int i = 0; i < lines.length; i += 1) {
+			sb.append(lines[i]).append("\r\n");
+		}
+
+		return sb.toString();
+	}
+
+	/**
+	 * Replace \r and \n by correctly displayed end of line characters. Used to
+	 * display debug output. It also replace any single \r or \n by \r\n, to
+	 * make it easier, to search for string within the body.
+	 * 
+	 * @param s
+	 *            The original string
+	 * @return The string with \r and \n modified, to be correctly displayed.
+	 */
+	public final String quoteCRLF(String s) {
+		return s.replaceAll("\r\n", "\\\\r\\\\n\n");
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void setFileUploadThreadManager(
+			FileUploadManagerThread fileUploadManagerThread)
+			throws JUploadException {
+		if (this.fileUploadManagerThread != null) {
+			throw new JUploadException(
+					"Can not override fileUploadManagerThread (in DefaultFileUpload.setFileUploadThreadManager()");
+		}
+		this.fileUploadManagerThread = fileUploadManagerThread;
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadFTP.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadFTP.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadFTP.java	(revision 3951)
@@ -0,0 +1,520 @@
+//
+// $Id: FileUploadThreadFTP.java 136 2007-05-12 20:15:36 +0000 (sam., 12 mai
+// 2007) felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-01-01
+// Creator: etienne_sf
+// Last modified: $Date: 2010-02-26 07:45:47 -0300 (Sex, 26 Fev 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import java.io.BufferedOutputStream;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Iterator;
+import java.util.SortedSet;
+import java.util.StringTokenizer;
+import java.util.TreeSet;
+import java.util.concurrent.BlockingQueue;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.commons.net.ftp.FTP;
+import org.apache.commons.net.ftp.FTPClient;
+import org.apache.commons.net.ftp.FTPConnectionClosedException;
+import org.apache.commons.net.ftp.FTPReply;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailed;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * The FileUploadThreadFTP class is intended to extend the functionality of the
+ * JUpload applet and allow it to handle ftp:// addresses. <br>
+ * Note: this class is not a V4 of the FTP upload. It is named V4, as it
+ * inherits from the {@link FileUploadThread} class. <br>
+ * <br>
+ * In order to use it, simply change the postURL argument to the applet to
+ * contain the appropriate ftp:// link. The format is:
+ * 
+ * <pre>
+ *         ftp://username:password@myhost.com:21/directory
+ * </pre>
+ * 
+ * Where everything but the host is optional. There is another parameter that
+ * can be passed to the applet named 'binary' which will set the file transfer
+ * mode based on the value. The possible values here are 'true' or 'false'. It
+ * was intended to be somewhat intelligent by looking at the file extension and
+ * basing the transfer mode on that, however, it was never implemented. Feel
+ * free to! Also, there is a 'passive' parameter which also has a value of
+ * 'true' or 'false' which sets the connection type to either active or passive
+ * mode.
+ * 
+ * @author Evin Callahan (inheritance from DefaultUploadThread built by
+ *         etienne_sf)
+ * @author Daystar Computer Services
+ * @see FileUploadThread
+ * @see DefaultFileUploadThread
+ * @version 1.0, 01 Jan 2007 * Update march 2007, etienne_sf Adaptation to match
+ *          all JUpload functions: <DIR> <LI>Inheritance from the
+ *          {@link FileUploadThread} class, <LI>Use of the UploadFileData class,
+ *          <LI>Before upload file preparation, <LI>Upload stop by the user. <LI>
+ *          </DIR>
+ */
+public class FileUploadThreadFTP extends DefaultFileUploadThread {
+
+    // ////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// PRIVATE ATTRIBUTES
+    // ///////////////////////////////////////
+    // ////////////////////////////////////////////////////////////////////////////////////
+
+    // ////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// PRIVATE ATTRIBUTES
+    // ///////////////////////////////////////
+    // ////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * The output stream, where the current file should be written. This output
+     * stream should not be used. The buffered one is much faster.
+     */
+    private OutputStream ftpOutputStream = null;
+
+    /**
+     * The buffered stream, that the application should use for upload.
+     */
+    private BufferedOutputStream bufferedOutputStream = null;
+
+    private Matcher uriMatch;
+
+    // the client that does the actual connecting to the server
+    private FTPClient ftp = new FTPClient();
+
+    /** FTP user, taken from the postURL applet parameter */
+    private String user;
+
+    /** FTP password, taken from the postURL applet parameter */
+    private String pass;
+
+    /** FTP target host, taken from the postURL applet parameter */
+    private String host;
+
+    /** FTP target port, taken from the postURL applet parameter */
+    private String port;
+
+    /**
+     * FTP target root folder for the upload, taken from the postURL applet
+     * parameter
+     */
+    private String ftpRootFolder;
+
+    /**
+     * Indicates whether the connection to the FTP server is open or not. This
+     * allows to connect once on the FTP server, for multiple file upload.
+     */
+    private boolean bConnected = false;
+
+    /**
+     * This pattern defines the groups and pattern of the ftp syntax.
+     */
+    public final Pattern ftpPattern = Pattern
+            .compile("^ftp://(([^:]+):([^\\@]+)\\@)?([^/:]+):?([0-9]+)?(/(.*))?$");
+
+    /**
+     * Creates a new instance. Performs the connection to the server based on
+     * the matcher created in the main.
+     * 
+     * @param uploadPolicy
+     * @param packetQueue The queue from wich packets to upload are available.
+     * @param fileUploadManagerThread
+     * @throws JUploadException
+     * @throws IllegalArgumentException if any error occurs. message is error
+     */
+    public FileUploadThreadFTP(UploadPolicy uploadPolicy,
+            BlockingQueue<UploadFilePacket> packetQueue,
+            FileUploadManagerThread fileUploadManagerThread)
+            throws JUploadException {
+        super("FileUploadThreadFTP thread", packetQueue, uploadPolicy,
+                fileUploadManagerThread);
+        this.uploadPolicy.displayDebug("[FileUploadThreadFTP]  Using "
+                + this.getClass().getName(), 30);
+
+        // Some coherence checks, for parameter given to the applet.
+
+        // stringUploadSuccess: unused in FTP mode. Must be null.
+        if (uploadPolicy.getStringUploadSuccess() != null) {
+            uploadPolicy
+                    .displayWarn("FTP mode: stringUploadSuccess parameter ignored (forced to null)");
+            uploadPolicy.setProperty(UploadPolicy.PROP_STRING_UPLOAD_SUCCESS,
+                    null);
+        }
+
+        // nbFilesPerRequest: must be 1 in FTP mode.
+        if (uploadPolicy.getNbFilesPerRequest() != 1) {
+            uploadPolicy
+                    .displayWarn("FTP mode: nbFilesPerRequest parameter ignored (forced to 1)");
+            uploadPolicy.setProperty(UploadPolicy.PROP_NB_FILES_PER_REQUEST,
+                    "1");
+        }
+
+        // maxChunkSize: must be unlimited (no chunk management in FTP mode).
+        if (uploadPolicy.getMaxChunkSize() != Long.MAX_VALUE) {
+            uploadPolicy
+                    .displayWarn("FTP mode: maxChunkSize parameter ignored (forced to Long.MAX_VALUE)");
+            uploadPolicy.setProperty(UploadPolicy.PROP_MAX_CHUNK_SIZE, Long
+                    .toString(Long.MAX_VALUE));
+        }
+    }
+
+    /** @see DefaultFileUploadThread#beforeRequest(UploadFilePacket) */
+    @Override
+    void beforeRequest(UploadFilePacket packet) throws JUploadException {
+
+        // If we're connected, we need to check the connection.
+        if (this.bConnected) {
+            // Let's check the connection is still Ok.
+            try {
+                this.ftp.sendNoOp();
+            } catch (FTPConnectionClosedException eClosed) {
+                // Let's forget this connection.
+                this.bConnected = false;
+            } catch (IOException e) {
+                throw new JUploadIOException(e.getClass().getName()
+                        + " while checking FTP connection to the server", e);
+            }
+        }
+
+        // If not already connected ... we connect to the server.
+        if (!this.bConnected) {
+            // Let's connect to the FTP server.
+            String url = this.uploadPolicy.getPostURL();
+            this.uriMatch = this.ftpPattern.matcher(url);
+            if (!this.uriMatch.matches()) {
+                throw new JUploadException("invalid URI: " + url);
+            }
+            this.user = this.uriMatch.group(2) == null ? "anonymous"
+                    : this.uriMatch.group(2);
+            this.pass = this.uriMatch.group(3) == null ? "JUpload"
+                    : this.uriMatch.group(3);
+            this.host = this.uriMatch.group(4); // no default server
+            this.port = this.uriMatch.group(5) == null ? "21" : this.uriMatch
+                    .group(5);
+            this.ftpRootFolder = (this.uriMatch.group(7) == null) ? null : "/"
+                    + this.uriMatch.group(7);
+            // The last character must be a slash
+            if (this.ftpRootFolder != null && !this.ftpRootFolder.endsWith("/")) {
+                this.ftpRootFolder += "/";
+            }
+
+            // do connect.. any error will be thrown up the chain
+            try {
+                this.ftp.setDefaultPort(Integer.parseInt(this.port));
+                this.ftp.connect(this.host);
+                this.uploadPolicy.displayDebug(
+                        "[FileUploadThreadFTP] Connected to " + this.host, 10);
+                this.uploadPolicy.displayDebug(this.ftp.getReplyString(), 80);
+
+                if (!FTPReply.isPositiveCompletion(this.ftp.getReplyCode()))
+                    throw new JUploadException("FTP server refused connection.");
+
+                // given the login information, do the login
+                this.ftp.login(this.user, this.pass);
+                this.uploadPolicy.displayDebug("[FileUploadThreadFTP] "
+                        + this.ftp.getReplyString(), 80);
+
+                if (!FTPReply.isPositiveCompletion(this.ftp.getReplyCode()))
+                    throw new JUploadException(
+                            "Invalid ftp username / password");
+
+                this.bConnected = true;
+            } catch (JUploadException jue) {
+                // No special action, we keep the exception untouched
+                throw jue;
+            } catch (IOException ioe) {
+                throw new JUploadIOException(ioe.getClass().getName()
+                        + "[FTP] Could not connect to server ("
+                        + ioe.getMessage() + ")", ioe);
+            } catch (Exception e) {
+                throw new JUploadException(e.getClass().getName()
+                        + "[FTP] Could not connect to server ("
+                        + e.getMessage() + ")", e);
+            }
+
+            // now do the same for the passive/active parameter
+            if (this.uploadPolicy.getFtpTransfertPassive()) {
+                this.ftp.enterLocalPassiveMode();
+            } else {
+                this.ftp.enterLocalActiveMode();
+            }
+
+        } // if(!bConnected)
+    }
+
+    /** @see DefaultFileUploadThread#afterFile(UploadFileData) */
+    @Override
+    void afterFile(UploadFileData uploadFileData) {
+        // Nothing to do
+    }
+
+    /** @see DefaultFileUploadThread#beforeFile(UploadFilePacket, UploadFileData) */
+    @Override
+    void beforeFile(UploadFilePacket uploadFilePacket,
+            UploadFileData uploadFileData) throws JUploadException {
+        String workingDir = null;
+        try {
+            // if configured to, we go to the relative sub-folder of the current
+            // file, or on the root of the postURL.
+            if (this.uploadPolicy.getFtpCreateDirectoryStructure()) {
+                // We create the FTP directory structure
+                // TODO: call it once for all files, not once for each file.
+                createDirectoryStructure(uploadFilePacket);
+
+                workingDir = this.ftpRootFolder
+                        + uploadFileData.getRelativeDir();
+                // We want to have only slashes, as anti-slashes may generate
+                // FTP errors.
+                workingDir = workingDir.replace("\\", "/");
+
+                this.uploadPolicy
+                        .displayDebug(
+                                "[FileUploadThreadFTP] ftpCreateDirectoryStructure: Changing working directory to: "
+                                        + workingDir, 80);
+            } else {
+                workingDir = this.ftpRootFolder;
+            }
+
+            if (workingDir != null && !workingDir.equals("")
+                    && !workingDir.equals(".")) {
+                this.ftp.changeWorkingDirectory(workingDir);
+                this.uploadPolicy.displayDebug("[FileUploadThreadFTP] "
+                        + this.ftp.getReplyString(), 80);
+            }
+
+            if (!FTPReply.isPositiveCompletion(this.ftp.getReplyCode())) {
+                throw new JUploadException(
+                        "[FTP] Error while changing directory to: "
+                                + workingDir + " (" + this.ftp.getReplyString()
+                                + ")");
+            }
+
+            setTransferType(uploadFileData);
+
+            // No delete, as the user may not have the right for that. We use,
+            // later, the store command:
+            // If the file already exists, it will be replaced.
+            // ftp.deleteFile(filesToUpload[index].getFileName());
+
+            // Let's open the stream for this file.
+            this.ftpOutputStream = this.ftp.storeFileStream(uploadFileData
+                    .getFileName());
+            if (this.ftpOutputStream == null) {
+                throw new JUploadIOException(
+                        "Stream connection to the server error. Check that your path on the URL is valid. postURL used is: "
+                                + this.uploadPolicy.getPostURL());
+            }
+            // The upload is done through a BufferedOutputStream. This speed up
+            // the upload in an unbelievable way ...
+            this.bufferedOutputStream = new BufferedOutputStream(
+                    this.ftpOutputStream);
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        }
+    }
+
+    /** @see DefaultFileUploadThread#cleanAll() */
+    @Override
+    void cleanAll() {
+        try {
+            if (this.ftp.isConnected()) {
+                this.ftp.disconnect();
+                this.uploadPolicy.displayDebug(
+                        "[FileUploadThreadFTP] disconnected", 50);
+            }
+        } catch (IOException e) {
+            // then we arent connected
+            this.uploadPolicy.displayDebug(
+                    "[FileUploadThreadFTP] Not connected", 50);
+        } finally {
+            this.ftpOutputStream = null;
+            this.bufferedOutputStream = null;
+        }
+    }
+
+    /** @see DefaultFileUploadThread#cleanRequest() */
+    @Override
+    void cleanRequest() throws JUploadException {
+        if (this.bufferedOutputStream != null) {
+            try {
+                this.bufferedOutputStream.close();
+                this.ftpOutputStream.close();
+                if (!this.ftp.completePendingCommand()) {
+                    throw new JUploadExceptionUploadFailed(
+                            "ftp.completePendingCommand() returned false");
+                }
+            } catch (IOException e) {
+                throw new JUploadException(e);
+            } finally {
+                this.bufferedOutputStream = null;
+            }
+        }
+    }
+
+    /**
+     * @throws JUploadIOException
+     * @see DefaultFileUploadThread#finishRequest()
+     */
+    @Override
+    int finishRequest() throws JUploadException {
+        try {
+            getOutputStream().flush();
+            return 200;
+        } catch (IOException ioe) {
+            throw new JUploadIOException("FileUploadThreadFTP.finishRequest()",
+                    ioe);
+        } catch (Exception e) {
+            // When the user may not override an existing file, I got a
+            // NullPointerException. Let's trap all errors here.
+            throw new JUploadException(
+                    "FileUploadThreadFTP.finishRequest()  (check the user permission on the server)",
+                    e);
+        }
+    }
+
+    /** @see DefaultFileUploadThread#getAdditionnalBytesForUpload(UploadFileData) */
+    @Override
+    long getAdditionnalBytesForUpload(UploadFileData uploadFileData) {
+        // Default: no additional byte.
+        return 0;
+    }
+
+    /** @see DefaultFileUploadThread#getOutputStream() */
+    @Override
+    OutputStream getOutputStream() {
+        return this.bufferedOutputStream;
+    }
+
+    /** @see DefaultFileUploadThread#startRequest(long, boolean, int, boolean) */
+    @Override
+    void startRequest(long contentLength, boolean bChunkEnabled, int chunkPart,
+            boolean bLastChunk) {
+        // Nothing to do
+    }
+
+    /**
+     * Will set the binary/ascii value based on the parameters to the applet.
+     * This could be done by file extension too but it is not implemented.
+     * 
+     * @param uploadFileData The file that we want to upload.
+     * @throws IOException if an error occurs while setting mode data
+     */
+    private void setTransferType(UploadFileData uploadFileData)
+            throws JUploadIOException {
+        try {
+            // read the value given from the user
+            if (this.uploadPolicy.getFtpTransfertBinary()) {
+                this.ftp.setFileType(FTP.BINARY_FILE_TYPE);
+            } else {
+                this.ftp.setFileType(FTP.ASCII_FILE_TYPE);
+            }
+        } catch (IOException ioe) {
+            throw new JUploadIOException(
+                    "Cannot set transfert binary or ascii mode (binary: "
+                            + this.uploadPolicy.getFtpTransfertBinary() + ")",
+                    ioe);
+        }
+    }
+
+    /**
+     * Create all relative sub-directories, so the structure on the server
+     * reflects the structure of the uploaded files.
+     * 
+     * @throws JUploadIOException When an error occurs during folder creation
+     */
+    // A tester
+    private void createDirectoryStructure(UploadFilePacket packet)
+            throws JUploadIOException {
+        SortedSet<String> foldersToCreate = new TreeSet<String>();
+        String folderName;
+        String intermediateFolderName;
+        StringTokenizer st;
+
+        // 1) Let's find all folders and sub-folders we'll have to create.
+        for (UploadFileData uploadFileData : packet) {
+            if (isInterrupted()) {
+                break;
+            }
+            folderName = uploadFileData.getRelativeDir();
+            folderName = folderName.replaceAll("\\\\", "/");
+            // Do we already have this folder ?
+            if (!foldersToCreate.contains(folderName)) {
+                // We add this folder, and all missing intermediate ones
+                st = new StringTokenizer(folderName, "/");
+                intermediateFolderName = this.ftpRootFolder;
+                while (st.hasMoreTokens()) {
+                    intermediateFolderName += st.nextToken() + "/";
+                    if (!foldersToCreate.contains(intermediateFolderName)) {
+                        this.uploadPolicy.displayDebug(
+                                "FTP structure identification: Adding subfolder "
+                                        + intermediateFolderName, 80);
+                        foldersToCreate.add(intermediateFolderName);
+                    }
+                }
+            }
+        }
+
+        // 2) Let's create theses folders.
+        try {
+            String folder;
+            for (Iterator<String> it = foldersToCreate.iterator(); it.hasNext();) {
+                folder = it.next();
+
+                // The folder is in the list of folder to create, created from
+                // the file list.
+                // We first check if the folder already exist.
+                this.ftp.changeWorkingDirectory(folder);
+                if (FTPReply.isPositiveCompletion(this.ftp.getReplyCode())) {
+                    this.uploadPolicy.displayDebug(
+                            "[FileUploadThreadFTP] Folder " + folder
+                                    + " already exist", 80);
+                } else {
+                    // We can not guess if it's because the folder
+                    // doesn't exist, or if it's a 'real' error.
+                    // Let's try to create the folder.
+                    this.ftp.mkd(folder);
+                    this.uploadPolicy.displayDebug(
+                            "[FileUploadThreadFTP] Folder " + folder
+                                    + " created", 80);
+                    if (!FTPReply.isPositiveCompletion(this.ftp.getReplyCode())) {
+                        throw new JUploadIOException(
+                                "Error while creating folder '"
+                                        + folder
+                                        + "' ("
+                                        + this.ftp.getReplyString().replaceAll(
+                                                "\r\n", "") + ")");
+                    }
+                }
+            }
+        } catch (IOException ioe) {
+            throw new JUploadIOException(ioe.getClass().getName()
+                    + " in FileUploadThreadFTP.createDirectoryStructure()", ioe);
+        }
+    }
+
+    /** {@inheritDoc} */
+    void interruptionReceived() {
+        cleanAll();
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThread.java	(revision 3951)
@@ -0,0 +1,200 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2010 The JUpload Team
+//
+// Created: 3 févr. 2010
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import wjhk.jupload2.exception.JUploadException;
+
+/**
+ * @author etienne_sf
+ * 
+ */
+public interface FileUploadManagerThread {
+
+	/** Indicates that nothings has begun */
+	public static final int UPLOAD_STATUS_NOT_STARTED = 1;
+
+	/**
+	 * We're sending data to the server, for the file identified by
+	 * numOfFileInCurrentUpload.
+	 */
+	public static final int UPLOAD_STATUS_UPLOADING = 2;
+
+	/**
+	 * A chunk (a part) of the file identified by numOfFileInCurrentUpload has
+	 * been sent. But the server response has not been received yet.
+	 */
+	public static final int UPLOAD_STATUS_CHUNK_UPLOADED_WAITING_FOR_RESPONSE = 3;
+
+	/**
+	 * All data for the file identified by numOfFileInCurrentUpload has been
+	 * sent. But the server response has not been received yet.
+	 */
+	public static final int UPLOAD_STATUS_FILE_UPLOADED_WAITING_FOR_RESPONSE = 4;
+
+	/**
+	 * The upload for the file identified by numOfFileInCurrentUpload is
+	 * finished
+	 */
+	public static final int UPLOAD_STATUS_UPLOADED = 5;
+
+	/**
+	 * The heart of the program. This method prepare the upload, then calls
+	 * doUpload for each HTTP request.
+	 * 
+	 * @throws InterruptedException
+	 * @see java.lang.Thread#join()
+	 */
+	public void join() throws InterruptedException;
+
+	/**
+	 * The heart of the program. This method prepare the upload, then calls
+	 * doUpload for each HTTP request.
+	 * 
+	 * @see java.lang.Thread#run()
+	 */
+	public void run();
+
+	/**
+	 * The heart of the program. This method prepare the upload, then calls
+	 * doUpload for each HTTP request.
+	 * 
+	 * @see java.lang.Thread#start()
+	 */
+	public void start();
+
+	/**
+	 * Check if the thread is running...
+	 * 
+	 * @see java.lang.Thread#interrupt()
+	 */
+	public void interrupt();
+
+	/**
+	 * Check if the thread is running...
+	 * 
+	 * @return True if it's running
+	 * @see java.lang.Thread#isAlive()
+	 */
+	public boolean isAlive();
+
+	/**
+	 * Stores the last upload exception that occurs. This method won't write to
+	 * the log file.
+	 * 
+	 * @param uploadException
+	 */
+	public void setUploadException(JUploadException uploadException);
+
+	/**
+	 * Get the last upload exception that occurs.
+	 * 
+	 * @return The last upload exception, or null if no exception occurs.
+	 */
+	public JUploadException getUploadException();
+
+	/**
+	 * Indicates whether the upload is finished or not. As several conditions
+	 * can make the upload being finished (all files uploaded, an error occured,
+	 * the user stops the upload), a specific boolean is built. It's managed by
+	 * the {@link #run()} method.
+	 * 
+	 * @return true if the upload is finished. False otherwise.
+	 */
+	public boolean isUploadFinished();
+
+	/**
+	 * Indicates if the upload has been stopped by the user, or by any upload
+	 * error. This method should not be used to know if it's the end of the
+	 * upload. To do this, see {@link #isUploadFinished()}
+	 * 
+	 * @return true if the current upload has been asked to stop by the user,
+	 *         false otherwise.
+	 */
+	public boolean isUploadStopped();
+
+	/**
+	 * Used by the UploadFileData#uploadFile(java.io.OutputStream, long) for
+	 * each uploaded buffer
+	 * 
+	 * @param nbBytes
+	 *            Number of additional bytes that where uploaded.
+	 * @param uploadFileData
+	 *            The file that is currently being uploade (or null if no file
+	 *            is being uploaded)
+	 * @throws JUploadException
+	 */
+	public void nbBytesUploaded(long nbBytes, UploadFileData uploadFileData)
+			throws JUploadException;
+
+	/**
+	 * Indicate the current state of the upload, to allow a correct display of
+	 * UPLOAD_STATUS_UPLOADED status. the upload progress bar.
+	 * 
+	 * @param uploadFilePacket
+	 *            The current packet. This parameter is mandatory only for the
+	 * @param uploadFileData
+	 *            The file whose upload begins, is going on or is finished.
+	 * @param uploadStatus
+	 * @throws JUploadException
+	 */
+	public void setUploadStatus(UploadFilePacket uploadFilePacket,
+			UploadFileData uploadFileData, int uploadStatus)
+			throws JUploadException;
+
+	/**
+	 * Reaction to the user click on the 'Stop' button, or any action from the
+	 * user asking to stop the upload. The upload should go on for the current
+	 * file, and stop before starting the next upload request to the server, to
+	 * avoid strange problems on the server.
+	 */
+	public void stopUpload();
+
+	/**
+	 * This method is called each time a new file is sent to the server. It's
+	 * main aim is to allow a proper display of the progress bar. It is public,
+	 * as upload is done in another thread, whose class maybe in another
+	 * package.
+	 * 
+	 * @param uploadFilePacket
+	 * @param newlyUploadedFileData
+	 * @throws JUploadException
+	 */
+	public void anotherFileHasBeenSent(UploadFilePacket uploadFilePacket,
+			UploadFileData newlyUploadedFileData) throws JUploadException;
+
+	/**
+	 * This method is called when the server response for the upload indicates a
+	 * success. It is public, as upload is done in another thread, whose class
+	 * maybe in another package.
+	 * 
+	 * @param packet
+	 *            The packet of files that was successfully uploaded.
+	 * @throws JUploadException
+	 */
+	public void currentRequestIsFinished(UploadFilePacket packet)
+			throws JUploadException;
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThreadImpl.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThreadImpl.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadManagerThreadImpl.java	(revision 3951)
@@ -0,0 +1,493 @@
+package wjhk.jupload2.upload;
+
+import java.util.concurrent.ArrayBlockingQueue;
+import java.util.concurrent.BlockingQueue;
+
+import wjhk.jupload2.exception.JUploadEOFException;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.filepanel.FilePanel;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.helper.ProgressBarManager;
+
+/**
+ * This class is responsible for managing the upload. At the end of the upload,
+ * the {@link JUploadPanel#updateButtonState()} is called, to refresh the button
+ * state. Its job is to: <DIR> <LI>Prepare upload for the file (calls to
+ * {@link FileData#beforeUpload()} for each file in the file list. <LI>Create
+ * the thread to send a packet of files. <LI>Prepare the packets, that will be
+ * red by the upload thread. <LI>Manage the end of upload: trigger the call to
+ * {@link JUploadPanel#updateButtonState()} and the call to
+ * {@link UploadPolicy#afterUpload(Exception, String)}. <LI>Manage the 'stop'
+ * button reaction. </DIR> This class is created by {@link JUploadPanel}, when
+ * the user clicks on the upload button.
+ * 
+ * @author etienne_sf
+ */
+public class FileUploadManagerThreadImpl extends Thread implements
+        FileUploadManagerThread {
+
+    /**
+     * Maximum number of files that can be stored in the filePreparationQueue.
+     * It's useless to have a too big value here, as, if too many files are
+     * there, it means that the file preparation process is much quicker than
+     * the file upload one.
+     */
+    final static int FILE_PREPARATION_QUEUE_SIZE = 50;
+
+    // /////////////////////////////////////////////////////////////////////////////////////////
+    // //////////////////// Possible Status for file upload
+    // /////////////////////////////////////////////////////////////////////////////////////////
+
+    /** The current file list. */
+    FilePanel filePanel = null;
+
+    /**
+     * The file preparatoin thread prepares each file for upload, and manage
+     * possible errors that can occurs at preparation time.
+     */
+    FilePreparationThread filePreparationThread = null;
+
+    /**
+     * This thread receives each prepared files in a queue, constructs the
+     * packets of files to be sent together, and posts them in another queue.
+     */
+    PacketConstructionThread packetConstructionThread = null;
+
+    /**
+     * The upload thread, that will wait for the next file packet to be ready,
+     * then send it.
+     */
+    FileUploadThread fileUploadThread = null;
+
+    /**
+     * This help controls the display of the progress bar and the status bar. It
+     * updates these bar, based on a timer.
+     */
+    ProgressBarManager progressBarManager;
+
+    /**
+     * Number of files that have been successfully uploaded. already been sent.
+     * The control on the upload success may be done or not. It's used to
+     * properly display the progress bar.
+     */
+    int nbSuccessfullyUploadedFiles = 0;
+
+    /**
+     * Indicates whether the upload is finished or not. Passed to true as soon
+     * as one of these conditions becomes true: <DIR> <LI>All files are uploaded
+     * (in the {@link #currentRequestIsFinished(UploadFilePacket)} method) <LI>
+     * An exception occurs (in the {@link #setUploadException(JUploadException)}
+     * method) <LI>The user stops the upload (in the {@link #stopUpload()}
+     * method) </DIR>
+     */
+    boolean uploadFinished = false;
+
+    /**
+     * If set to 'true', the thread will stop the current upload.
+     * 
+     * @see UploadFileData#uploadFile(java.io.OutputStream, long)
+     */
+    boolean stop = false;
+
+    /** Thread Exception, if any occurred during upload. */
+    JUploadException uploadException = null;
+
+    /** A shortcut to the upload panel */
+    JUploadPanel uploadPanel = null;
+
+    /** The current upload policy. */
+    UploadPolicy uploadPolicy = null;
+
+    // ////////////////////////////////////////////////////////////////////////////
+    // To follow the upload speed.
+    // ////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Standard constructor of the class.
+     * 
+     * @param uploadPolicy
+     * @throws JUploadException
+     */
+    public FileUploadManagerThreadImpl(UploadPolicy uploadPolicy)
+            throws JUploadException {
+        super("FileUploadManagerThreadImpl thread");
+        constructor(uploadPolicy, null);
+    }
+
+    /**
+     * Internal constructor. It is used by the JUnit test, to create a
+     * FileUploadManagerThreadImpl instance, based on a non-active
+     * {@link FileUploadThread}.
+     * 
+     * @param uploadPolicy The current uploadPolicy
+     * @param fileUploadThreadParam The instance of {@link FileUploadThread}
+     *            that should be used. Allows execution of unit tests, based on
+     *            a specific FileUploadThread, that does ... nothing.
+     * @throws JUploadException
+     */
+    FileUploadManagerThreadImpl(UploadPolicy uploadPolicy,
+            FileUploadThread fileUploadThreadParam) throws JUploadException {
+        super("FileUploadManagerThreadImpl test thread");
+        constructor(uploadPolicy, fileUploadThreadParam);
+    }
+
+    /**
+     * Called by the class constructors, to initialize the current instance.
+     * 
+     * @param uploadPolicy
+     * @param fileUploadThreadParam
+     * @throws JUploadException
+     */
+    private synchronized void constructor(UploadPolicy uploadPolicy,
+            FileUploadThread fileUploadThreadParam) throws JUploadException {
+
+        // General shortcuts on the current applet.
+        this.uploadPolicy = uploadPolicy;
+        this.uploadPanel = uploadPolicy.getContext().getUploadPanel();
+        this.filePanel = this.uploadPanel.getFilePanel();
+
+        BlockingQueue<UploadFileData> preparedFileQueue = new ArrayBlockingQueue<UploadFileData>(
+                this.filePanel.getFilesLength());
+
+        // If the FileUploadThread was already created, we must take the same
+        // packetQueue.
+        BlockingQueue<UploadFilePacket> packetQueue;
+        if (fileUploadThreadParam == null) {
+            packetQueue = new ArrayBlockingQueue<UploadFilePacket>(
+                    this.filePanel.getFilesLength());
+        } else {
+            packetQueue = fileUploadThreadParam.getPacketQueue();
+        }
+        // Let's create (but not start) start the file preparation thread.
+        this.filePreparationThread = new FilePreparationThread(
+                preparedFileQueue, this, this.uploadPolicy);
+        // The packet tread groups files together, depending on the current
+        // upload policy.
+        this.packetConstructionThread = new PacketConstructionThread(
+                preparedFileQueue, packetQueue, this, this.uploadPolicy);
+        // Let's start the upload thread. It will wait until the first
+        // packet is ready.
+        createUploadThread(packetQueue, fileUploadThreadParam);
+        // We're now ready to start the bar update job.
+        this.progressBarManager = new ProgressBarManager(this.uploadPolicy,
+                this.filePreparationThread);
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#run()
+     */
+    @Override
+    final public void run() {
+        try {
+            this.uploadPolicy.displayDebug(
+                    "Start of the FileUploadManagerThreadImpl", 5);
+
+            // Let's start the working threads.
+            this.filePreparationThread.start();
+            this.packetConstructionThread.start();
+            this.fileUploadThread.start();
+
+            // Let's let the current upload policy have any preparation work
+            this.uploadPolicy.beforeUpload();
+
+            // The upload is started. Let's change the button state.
+            this.uploadPanel.updateButtonState();
+
+            // Let's prepare the progress bar, to display the current upload
+            // stage.
+            progressBarManager.uploadIsStarted();
+
+            // The thread upload may need some information about the current
+            // one, like ... knowing that upload is actually finished (no more
+            // file to send).
+            // So we wait for it to finish.
+            while (this.fileUploadThread.isAlive() && !isUploadFinished()) {
+                try {
+                    this.uploadPolicy.displayDebug(
+                            "Waiting for fileUploadThread to die", 10);
+                    this.fileUploadThread.join();
+                } catch (InterruptedException e) {
+                    // This should not occur, and should not be a problem. Let's
+                    // trace a warning info.
+                    this.uploadPolicy
+                            .displayWarn("An InterruptedException occured in FileUploadManagerThreadImpl.run()");
+                }
+            }// while
+
+            // If any error occurs, the prepared state of the file data may be
+            // true. We must free resources. So, to be sure, we do it in all
+            // cases.
+            FileData[] fileDataArray = this.uploadPanel.getFilePanel()
+                    .getFiles();
+            for (int i = 0; i < fileDataArray.length; i += 1) {
+                if (fileDataArray[i].isPreparedForUpload()) {
+                    fileDataArray[i].afterUpload();
+                }
+            }
+
+            // Let's restore the button state.
+            this.uploadPanel.updateButtonState();
+            this.uploadPolicy.getContext().showStatus("");
+            this.uploadPolicy.getContext().getUploadPanel().getStatusLabel()
+                    .setText("");
+
+            // If no error occurs, we tell to the upload policy that a
+            // successful
+            // upload has been done.
+
+            if (getUploadException() != null) {
+                this.uploadPolicy.sendDebugInformation("Error in Upload",
+                        getUploadException());
+            } else if (isUploadStopped()) {
+                this.uploadPolicy
+                        .displayInfo("Upload stopped by the user. "
+                                + this.nbSuccessfullyUploadedFiles
+                                + " file(s) uploaded in "
+                                + (int) ((System.currentTimeMillis() - this.progressBarManager
+                                        .getGlobalStartTime()) / 1000)
+                                + " seconds. Average upload speed: "
+                                + ((this.progressBarManager.getUploadDuration() > 0) ? ((int) (this.progressBarManager
+                                        .getNbUploadedBytes() / this.progressBarManager
+                                        .getUploadDuration()))
+                                        : 0) + " (kbytes/s)");
+            } else {
+                this.uploadPolicy
+                        .displayInfo("Upload finished normally. "
+                                + this.nbSuccessfullyUploadedFiles
+                                + " file(s) uploaded in "
+                                + (int) ((System.currentTimeMillis() - this.progressBarManager
+                                        .getGlobalStartTime()) / 1000)
+                                + " seconds. Average upload speed: "
+                                + ((this.progressBarManager.getUploadDuration() > 0) ? ((int) (this.progressBarManager
+                                        .getNbUploadedBytes() / this.progressBarManager
+                                        .getUploadDuration()))
+                                        : 0) + " (kbytes/s)");
+                // FIXME uploadDuration displayed is 0!
+                try {
+                    this.uploadPolicy.afterUpload(this.getUploadException(),
+                            this.fileUploadThread.getResponseMsg());
+                } catch (JUploadException e1) {
+                    this.uploadPolicy.displayErr(
+                            "error in uploadPolicy.afterUpload (JUploadPanel)",
+                            e1);
+                }
+            }
+
+            // The job is finished. Let's stop the timer, and have a last
+            // refresh of the bars.
+            this.progressBarManager.uploadIsFinished();
+
+            // We wait for 5 seconds, before clearing the progress bar.
+            try {
+                sleep(5000);
+            } catch (InterruptedException e) {
+                // Nothing to do
+            }
+            // The job is finished for long enough, let's clear the progression
+            // bars (and any associated ressource, like the time).
+            // We'll clear the progress bar, only if this thread is in control
+            // of the upload, that is: if this instance is the currently
+            // FileUploadManagerThread referenced in the JUpload panel.
+            if (this == this.uploadPanel.getFileUploadManagerThread()) {
+                this.progressBarManager.clearBarContent();
+                this.uploadPolicy.getContext().getUploadPanel()
+                        .getStatusLabel().setText("");
+            }
+
+            this.uploadPolicy.displayDebug(
+                    "End of the FileUploadManagerThreadImpl", 5);
+        } catch (Exception e) {
+            // We need a JUploadException.
+            JUploadException jue = (e instanceof JUploadException) ? (JUploadException) e
+                    : new JUploadException(e);
+            setUploadException(jue);
+
+            // And go back into a 'normal' way.
+            stopUpload();
+        } finally {
+            // We restore the button state, just to be sure.
+            this.uploadPanel.updateButtonState();
+        }
+
+        // And we die of our beautiful death ... until next upload.
+    }// run
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#setUploadException(wjhk.jupload2.exception.JUploadException)
+     */
+    public synchronized void setUploadException(
+            JUploadException uploadExceptionParam) {
+        // If the user stops the upload, the socket on which the applet reads
+        // the server response got closed. So we ignore this error.
+        if (isUploadStopped()
+                && uploadExceptionParam instanceof JUploadEOFException) {
+            // Just ignore this error: the input stream from the server was
+            // closed, but it probably occurs because the applet itself closed
+            // the communicaiton.
+        } else {
+            // We don't override an existing exception
+            if (this.uploadException != null) {
+                this.uploadPolicy
+                        .displayWarn("An exception has already been set in FileUploadManagerThreadImpl. The next one is just logged.");
+            } else {
+                this.uploadException = uploadExceptionParam;
+            }
+
+            String exceptionMsg = (uploadExceptionParam.getCause() == null) ? uploadExceptionParam
+                    .getMessage()
+                    : uploadExceptionParam.getCause().getMessage();
+            String errMsg = this.uploadPolicy
+                    .getLocalizedString("errDuringUpload")
+                    + "\n\n" + exceptionMsg;
+            this.uploadPolicy.displayErr(errMsg, uploadException);
+        }
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#getUploadException()
+     */
+    public JUploadException getUploadException() {
+        return this.uploadException;
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#isUploadFinished()
+     */
+    public boolean isUploadFinished() {
+        // Indicate whether or not the upload is finished. Several conditions:
+        // all files are uploaded, there was an error and the user stops the
+        // upload here...
+        return this.uploadFinished || this.stop || this.uploadException != null;
+    }
+
+    /**
+     * @see FileUploadManagerThread#isUploadStopped()
+     */
+    public boolean isUploadStopped() {
+        return this.stop;
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#nbBytesUploaded(long,
+     *      UploadFileData)
+     */
+    public synchronized void nbBytesUploaded(long nbBytes,
+            UploadFileData uploadFileData) throws JUploadException {
+        this.progressBarManager.nbBytesUploaded(nbBytes, uploadFileData);
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#setUploadStatus(wjhk.jupload2.upload.UploadFilePacket,
+     *      wjhk.jupload2.upload.UploadFileData, int)
+     */
+    public synchronized void setUploadStatus(UploadFilePacket uploadFilePacket,
+            UploadFileData uploadFileData, int uploadStatus)
+            throws JUploadException {
+        this.progressBarManager.setUploadStatus(uploadFilePacket,
+                uploadFileData, uploadStatus);
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#stopUpload()
+     */
+    public synchronized void stopUpload() {
+        this.stop = true;
+
+        // The upload is now finished ...
+        this.uploadFinished = true;
+
+        // We notify the various threads.
+        if (this.filePreparationThread != null
+                && this.filePreparationThread.isAlive()) {
+            this.filePreparationThread.interrupt();
+        }
+        if (this.packetConstructionThread != null
+                && this.packetConstructionThread.isAlive()) {
+            this.packetConstructionThread.interrupt();
+        }
+        if (this.fileUploadThread != null && this.fileUploadThread.isAlive()) {
+            this.fileUploadThread.interrupt();
+        }
+
+        // All 'sub-thread' is now interrupted. The upload thread can be stuck
+        // while waiting for the server response. We also interrupt the current
+        // thread.
+        this.interrupt();
+    }
+
+    // //////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////// SYNCHRONIZATION METHODS
+    // //////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#anotherFileHasBeenSent(wjhk.jupload2.upload.UploadFilePacket,
+     *      wjhk.jupload2.upload.UploadFileData)
+     */
+    public synchronized void anotherFileHasBeenSent(
+            UploadFilePacket uploadFilePacket,
+            UploadFileData newlyUploadedFileData) throws JUploadException {
+        this.progressBarManager.anotherFileHasBeenSent(uploadFilePacket,
+                newlyUploadedFileData);
+    }
+
+    /**
+     * @see wjhk.jupload2.upload.FileUploadManagerThread#currentRequestIsFinished(wjhk.jupload2.upload.UploadFilePacket)
+     */
+    public synchronized void currentRequestIsFinished(
+            UploadFilePacket uploadFilePacket) throws JUploadException {
+        // We are finished with this packet. Let's display it.
+        this.progressBarManager.setUploadStatus(uploadFilePacket,
+                uploadFilePacket.get(uploadFilePacket.size() - 1),
+                FileUploadManagerThread.UPLOAD_STATUS_UPLOADED);
+
+        // We should now remove this file from the list of files to upload,
+        // to show the user that there is less and less work to do.
+        for (FileData fileData : uploadFilePacket) {
+            this.filePanel.remove(fileData);
+            this.nbSuccessfullyUploadedFiles += 1;
+        }
+
+        // If all files have been sent, the upload is finished.
+        if (!this.uploadFinished) {
+            this.uploadFinished = (this.nbSuccessfullyUploadedFiles == this.filePreparationThread
+                    .getNbFilesToSent());
+        }
+    }
+
+    // //////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////// PRIVATE METHODS
+    // //////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Creates the upload thread, but does not start it. IThis thread will wait
+     * until the first packet is ready.
+     * 
+     * @throws JUploadException
+     */
+    private synchronized void createUploadThread(
+            BlockingQueue<UploadFilePacket> packetQueue,
+            FileUploadThread fileUploadThreadParam) throws JUploadException {
+        if (fileUploadThreadParam != null) {
+            // The FileUploadThread has already been created.
+            // We set the FileUploadThreadManager.
+            this.fileUploadThread = fileUploadThreadParam;
+            fileUploadThreadParam.setFileUploadThreadManager(this);
+        } else {
+            try {
+                if (this.uploadPolicy.getPostURL().substring(0, 4).equals(
+                        "ftp:")) {
+                    this.fileUploadThread = new FileUploadThreadFTP(
+                            this.uploadPolicy, packetQueue, this);
+                } else {
+                    this.fileUploadThread = new FileUploadThreadHTTP(
+                            this.uploadPolicy, packetQueue, this);
+                }
+            } catch (JUploadException e1) {
+                // Too bad !
+                this.uploadPolicy.displayErr(e1);
+            }
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/PacketConstructionThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/PacketConstructionThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/PacketConstructionThread.java	(revision 3951)
@@ -0,0 +1,188 @@
+package wjhk.jupload2.upload;
+
+import java.util.concurrent.BlockingQueue;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * @author etienne_sf
+ * 
+ */
+public class PacketConstructionThread extends Thread {
+
+    /** The current upload policy. */
+    UploadPolicy uploadPolicy = null;
+
+    /** The thread which globally manages the upload */
+    FileUploadManagerThread fileUploadManagerThread = null;
+
+    /**
+     * The queue where each prepared file are stored, for further processing.
+     * This class picks files here, and post them to the packetQueue.
+     */
+    BlockingQueue<UploadFileData> preparedFileQueue = null;
+
+    /**
+     * The queue where each prepared file will be stored, for further processing
+     */
+    BlockingQueue<UploadFilePacket> packetQueue = null;
+
+    /**
+     * The packet this instance is working on.
+     */
+    UploadFilePacket packetInProgress = null;
+
+    /**
+     * Indicates when the last file has been received. The last file is the
+     * poisonned
+     */
+    boolean lastFileReceived = false;
+
+    PacketConstructionThread(BlockingQueue<UploadFileData> preparedFileQueue,
+            BlockingQueue<UploadFilePacket> packetQueue,
+            FileUploadManagerThread fileUploadManagerThread,
+            UploadPolicy uploadPolicy) {
+        // A thread name is very useful, when debugging...
+        super("PacketConstructionThread");
+
+        this.preparedFileQueue = preparedFileQueue;
+        this.packetQueue = packetQueue;
+        this.fileUploadManagerThread = fileUploadManagerThread;
+        this.uploadPolicy = uploadPolicy;
+
+        // Let's construct the first packet...
+        this.packetInProgress = new UploadFilePacket(this.uploadPolicy);
+    }
+
+    /**
+     * The actual command to generate packets.
+     * 
+     * @see java.lang.Thread#run()
+     */
+    @Override
+    final public void run() {
+        this.uploadPolicy.displayDebug("Start of PacketConstructionThread", 80);
+        try { // catch (JUploadException e)
+
+            // We loop, and wait for the 'poisonned' UploadFileData to finish.
+            try {
+                while (!lastFileReceived
+                        && !this.fileUploadManagerThread.isUploadFinished()) {
+                    UploadFileData ufd = preparedFileQueue.take();
+                    receiveNewFile(ufd);
+                }
+
+                this.uploadPolicy
+                        .displayDebug(
+                                "PacketConstructionThread: end of loop, the thread is about to finish",
+                                30);
+
+                // We may have some file left to send...
+                if (this.packetInProgress.size() > 0) {
+                    this.uploadPolicy
+                            .displayDebug(
+                                    "Last file received: the current packet is not empty, we send it",
+                                    30);
+                    sendCurrentPacket();
+                }
+            } catch (InterruptedException e) {
+                this.uploadPolicy
+                        .displayWarn("packetConstructionThread received InterruptedException, exiting");
+            }
+
+            // In standard mode, we should have no more file to manage. The
+            // following test is meaningful only if the FilePreparationThread
+            // has been finished before (otherwise, other files could enter the
+            // queue after this test)
+            if (!this.preparedFileQueue.isEmpty()) {
+                if (!this.fileUploadManagerThread.isUploadFinished()) {
+                    // Hum, hum. This should not happen.
+                    this.uploadPolicy
+                            .displayWarn("The preparedFileQueue is not empty, at the end of "
+                                    + this.getClass().getName());
+                }
+                // This can happen, if we are interrupted while working. Let's
+                // empty this.
+                this.uploadPolicy
+                        .displayDebug(
+                                "The PacketConstructionThread is about to finish, but the preparedFileQueue is not empty. Let's clear it.",
+                                30);
+                while (!this.preparedFileQueue.isEmpty()) {
+                    this.preparedFileQueue.poll();
+                }
+            }
+        } catch (JUploadException e) {
+            this.fileUploadManagerThread.setUploadException(e);
+        } finally {
+            // To properly finish the job, we send a 'poisonned' packet, so that
+            // the FileUploadThread knows it's finished.
+            try {
+                this.packetQueue.put(new UploadFilePacketPoisonned(
+                        this.uploadPolicy));
+            } catch (InterruptedException e) {
+                this.uploadPolicy
+                        .displayWarn("packetConstructionThread received InterruptedException (while checking if packetQueue is empty), exiting");
+            }
+        }
+        this.uploadPolicy.displayDebug("End of PacketConstructionThread", 80);
+    }
+
+    /**
+     * Called when a new file is received
+     * 
+     * @param uploadFileData
+     * @throws JUploadException
+     * @throws InterruptedException
+     */
+    private void receiveNewFile(UploadFileData uploadFileData)
+            throws JUploadException, InterruptedException {
+        // Are we finished ?
+        if (uploadFileData.isPoisonned()) {
+            lastFileReceived = true;
+            this.uploadPolicy
+                    .displayDebug(
+                            "Poisonned UploadFileData received, PacketContructionThread will exit normally",
+                            50);
+        } else {
+            // We try to add the file to the current packet. If it doesn't work,
+            // this packet is probably full. We sent it, and add the packet to
+            // the new one.
+            if (!this.packetInProgress.add(uploadFileData)) {
+                // The packet was refused. We send the current one, and retry.
+                this.uploadPolicy
+                        .displayDebug(
+                                "The file can't be added to the current packet. Let's send this packet first.",
+                                80);
+                sendCurrentPacket();
+                if (!this.packetInProgress.add(uploadFileData)) {
+                    throw new JUploadException(
+                            "Could not add file to packet! (filename: "
+                                    + uploadFileData.getFileName() + ")");
+                }
+            }
+
+            // If the current packet is finished, we send it immediatly.
+            if (this.packetInProgress.isFull()) {
+                sendCurrentPacket();
+            }
+        }
+    }
+
+    private void sendCurrentPacket() throws InterruptedException {
+        if (this.packetInProgress == null) {
+            throw new java.lang.AssertionError(
+                    this.getClass().getName()
+                            + ".sendCurrentPacket(): this.packetInProgress may not be null");
+        } else if (this.packetInProgress.size() == 0) {
+            throw new java.lang.AssertionError(
+                    this.getClass().getName()
+                            + ".sendCurrentPacket(): this.packetInProgress.size() may not be 0");
+        }
+        // If a packet is ready, we post it into the relevant queue.
+        this.packetQueue.put(packetInProgress);
+
+        // And we start a new one.
+        this.packetInProgress = new UploadFilePacket(this.uploadPolicy);
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacketPoisonned.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacketPoisonned.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacketPoisonned.java	(revision 3951)
@@ -0,0 +1,54 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2010 The JUpload Team
+//
+// Created: 27 janv. 2010
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * @author etienne_sf
+ * 
+ */
+@SuppressWarnings("serial")
+public class UploadFilePacketPoisonned extends UploadFilePacket {
+    /**
+     * The standard constructor.
+     * 
+     * @param uploadPolicy
+     */
+    public UploadFilePacketPoisonned(UploadPolicy uploadPolicy) {
+        super(uploadPolicy);
+    }
+
+    /**
+     * @return the poisonned status. Returns always true, as this class is only
+     *         used to indicate the 'End Of Queue' marker in the
+     *         preparedFileQueue.
+     * @see UploadFileData
+     */
+    final public boolean isPoisonned() {
+        return true;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FilePreparationThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FilePreparationThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FilePreparationThread.java	(revision 3951)
@@ -0,0 +1,285 @@
+package wjhk.jupload2.upload;
+
+import java.util.concurrent.BlockingQueue;
+
+import javax.swing.JProgressBar;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.filepanel.FilePanel;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This thread is responsible for preparing all files for upload. It stores each
+ * prepared file in the preparedFileQueue, for further processing.
+ * 
+ * @author etienne_sf
+ */
+public class FilePreparationThread extends Thread {
+
+    /**
+     * The array of files to send, from the {@link FilePanel}
+     */
+    FileData[] fileDataArray = null;
+
+    /**
+     * Number of files that are prepared for upload. A file is prepared for
+     * upload, if the {@link FileData#beforeUpload()} has been called.
+     */
+    int nbPreparedFiles = 0;
+
+    /**
+     * The total of files that must be sent. It is initialized by the total
+     * number of files in the list, and is decremented each time an error occurs
+     * during a file preparation, and the user wants to go on.
+     */
+    int nbFilesToSent = -1;
+
+    /**
+     * Sum of the length for all prepared files. This allow the calculation of
+     * the estimatedTotalLength.
+     * 
+     * @see #anotherFileIsPrepared(UploadFileData)
+     */
+    long nbTotalNumberOfPreparedBytes = 0;
+
+    /**
+     * The {@link JUploadPanel} progress bar, to follow the file preparation
+     * progress.
+     */
+    JProgressBar preparationProgressBar = null;
+
+    /** A shortcut to the upload panel */
+    JUploadPanel uploadPanel = null;
+
+    /** The current upload policy. */
+    UploadPolicy uploadPolicy = null;
+
+    /** The thread which globally manages the upload */
+    FileUploadManagerThread fileUploadManagerThread = null;
+
+    /** The current file list. */
+    FilePanel filePanel = null;
+
+    /**
+     * The queue where each prepared file will be stored, for further processing
+     */
+    BlockingQueue<UploadFileData> preparedFileQueue = null;
+
+    /**
+     * @param preparedFileQueue
+     * @param fileUploadManagerThread
+     * @param uploadPolicy
+     */
+    public FilePreparationThread(
+            BlockingQueue<UploadFileData> preparedFileQueue,
+            FileUploadManagerThread fileUploadManagerThread,
+            UploadPolicy uploadPolicy) {
+        // A thread name is very useful, when debugging...
+        super("FilePreparationThread");
+
+        this.preparedFileQueue = preparedFileQueue;
+        this.fileUploadManagerThread = fileUploadManagerThread;
+        this.uploadPolicy = uploadPolicy;
+        this.uploadPanel = uploadPolicy.getContext().getUploadPanel();
+        this.filePanel = this.uploadPanel.getFilePanel();
+        this.preparationProgressBar = this.uploadPanel
+                .getPreparationProgressBar();
+
+        // Prepare the list of files to upload. We do this here, to minimize the
+        // risk of concurrency, if the user drops or pastes files on the applet
+        // while uploading.
+        this.fileDataArray = this.uploadPanel.getFilePanel().getFiles();
+
+        // We know now the total of files we should upload:
+        this.nbFilesToSent = fileDataArray.length;
+
+        this.preparationProgressBar.setMaximum(100 * fileDataArray.length);
+    }
+
+    /**
+     * The actual command to prepare files.
+     * 
+     * @see java.lang.Thread#run()
+     * @see FileData#beforeUpload()
+     */
+    @Override
+    final public void run() {
+        // We loop through all files, and check before each if we should
+        // stop (for instance if an error occurs)
+
+        // numFileInCurrentUpload is the index of the file in the current index.
+        // It should be the array index. But, if a file preparation fails in
+        // error, numFileInCurrentUpload will be the array index minus 1, if 2
+        // files, it will be the array index minus 2...
+        int numFileInCurrentUpload = 0;
+
+        for (int i = 0; i < fileDataArray.length
+                && !this.fileUploadManagerThread.isUploadFinished(); i += 1) {
+            try {
+                UploadFileData uploadFileData = new UploadFileData(
+                        fileDataArray[i], numFileInCurrentUpload,
+                        this.fileUploadManagerThread, this.uploadPolicy);
+                this.uploadPolicy.displayDebug(
+                        "============== Start of file preparation ("
+                                + uploadFileData.getFileName() + ")", 30);
+
+                // Let's indicate to the user what's running on.
+                this.preparationProgressBar.setString(this.uploadPolicy
+                        .getLocalizedString("preparingFile", Integer
+                                .valueOf(i + 1), Integer
+                                .valueOf(fileDataArray.length)));
+                // We want an immediate repaint, to be sure that the new text is
+                // displayed to the user.
+                this.preparationProgressBar.repaint(0);
+
+                // Then, we work
+
+                // Let's check that everything is Ok
+                // More debug output, to understand where the applet freezes.
+                this.uploadPolicy
+                        .displayDebug(
+                                this.getClass().getName()
+                                        + ".prepareFiles(): before call to beforeUpload()",
+                                100);
+
+                try {
+                    // Let's try to prepare the upload.
+                    uploadFileData.beforeUpload();
+
+                    // If we arrive, here, it means that beforeUpload() did not
+                    // throw an exception, that is: the file is now prepared.
+                    // Next file will be ... next in the current upload.
+                    numFileInCurrentUpload += 1;
+
+                    // TODO Whe error during file preparation ask the user.
+
+                    this.uploadPolicy.displayDebug(
+                            "============== End of file preparation ("
+                                    + uploadFileData.getFileName() + ")", 30);
+                    try {
+                        anotherFileIsPrepared(uploadFileData);
+                    } catch (InterruptedException e) {
+                        // There was a problem putting the item. Let's try again
+                        // in
+                        // the next loop.
+                        i -= 1;
+                    }
+                } catch (JUploadException e) {
+                    // An error occurs during file preparation. We'll send one
+                    // file less than expected.
+                    this.nbFilesToSent -= 1;
+                    throw e;
+                }
+
+                // The file preparation is finished. Let's update the progress
+                // bar.
+                this.preparationProgressBar
+                        .setValue(this.nbPreparedFiles * 100);
+                this.preparationProgressBar.repaint();
+            } catch (JUploadException e) {
+                this.fileUploadManagerThread.setUploadException(e);
+            }
+        }// while
+
+        // All prepared files are posted on the preparedQueue. Let's send the
+        // 'End of Queue' marker.
+        try {
+            this.preparedFileQueue.put(new UploadFileDataPoisonned());
+        } catch (InterruptedException e) {
+            // We should not be interrupted here. If it happens, it should be
+            // because the upload was stopped. But, then, we may have the
+            // PacketConstructionThread blocked, waiting for this packet. So,
+            // let's log a warning.
+            this.uploadPolicy
+                    .displayWarn("Got interrupted, while posting the poisoned UploadFileData on the preparedQueue!");
+        }
+
+        // Let's clear the bar, which is no more accurate. We let the value to
+        // 100%
+        this.preparationProgressBar.setString("");
+    }
+
+    /**
+     * This method is called each time a new file is ready to upload. It
+     * calculates if a new packet of files is ready to upload. It is private, as
+     * it may be called only from this class.
+     * 
+     * @throws JUploadException
+     */
+    private void anotherFileIsPrepared(UploadFileData newlyPreparedFileData)
+            throws JUploadException, InterruptedException {
+        this.nbPreparedFiles += 1;
+        this.uploadPolicy
+                .displayDebug(
+                        this.getClass().getName()
+                                + ".anotherFileIsReady(): before call(1) to newlyPreparedFileData.getUploadLength()",
+                        100);
+        this.uploadPolicy
+                .displayDebug(
+                        this.getClass().getName()
+                                + ".checkIfNextPacketIsReady(): before call(2) to currentFileData.getUploadLength()",
+                        100);
+        this.nbTotalNumberOfPreparedBytes += newlyPreparedFileData
+                .getUploadLength();
+
+        this.preparedFileQueue.put(newlyPreparedFileData);
+    }
+
+    /**
+     * Returns the total number of bytes to upload. This takes into account only
+     * the prepared file content. It ignores the possible head and tails of the
+     * request (for instance: http headers...). This gives a good idea of the
+     * total amount to send, and allows is suffisiant to properly manage the
+     * upload progress bar.<BR>
+     * The total number of bytes can only be calculated when all files are
+     * prepared. When this method is called before this, an estimation is done
+     * for non prepared files, based on the average size of the already prepared
+     * files.
+     * 
+     * @return The real or estimated total number of bytes to send
+     */
+    public double getTotalFileBytesToSend() {
+        double totalFileBytesToSend;
+
+        // Let's estimate the total, or calculate it, of all files are
+        // prepared
+        if (this.nbPreparedFiles == this.fileDataArray.length) {
+            // All files are prepared: it's no more an estimation !
+            totalFileBytesToSend = this.nbTotalNumberOfPreparedBytes;
+        } else {
+            // We sum the total number of prepared bytes, and we estimate
+            // the size of the files that are not prepared yet
+            totalFileBytesToSend = this.nbTotalNumberOfPreparedBytes
+                    +
+                    // And we sum it with the average amount per file
+                    // prepared for the others
+                    (this.fileDataArray.length - this.nbPreparedFiles)
+                    * this.nbTotalNumberOfPreparedBytes / this.nbPreparedFiles;
+        }
+
+        return totalFileBytesToSend;
+    }
+
+    /**
+     * @return the nbPreparedFiles
+     */
+    public int getNbPreparedFiles() {
+        return nbPreparedFiles;
+    }
+
+    /**
+     * @return the nbFilesToSent
+     */
+    public int getNbFilesToSent() {
+        return nbFilesToSent;
+    }
+
+    /**
+     * @return the nbTotalNumberOfPreparedBytes
+     */
+    public long getNbTotalNumberOfPreparedBytes() {
+        return nbTotalNumberOfPreparedBytes;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThread.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThread.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThread.java	(revision 3951)
@@ -0,0 +1,124 @@
+//
+// $Id: FileUploadThread.java 1026 2010-02-24 10:12:19Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-02-24 07:12:19 -0300 (Qua, 24 Fev 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import java.util.concurrent.BlockingQueue;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This interface defines the methods of the various FileUploadThread classes.
+ * The default implementation is in the {@link DefaultFileUploadThread}. It
+ * allows retries, for network errors. See
+ * {@link UploadPolicy#PROP_RETRY_MAX_NUMBER_OF} and
+ * {@link UploadPolicy#PROP_RETRY_NB_SECONDS_BETWEEN} for details.
+ */
+public interface FileUploadThread {
+    /**
+     * @return the packetQueue
+     */
+    public BlockingQueue<UploadFilePacket> getPacketQueue();
+
+    /**
+     * Get the server response message. In HTTP mode, it's the body part,
+     * without the HTTP headers.<BR>
+     * Note: was getResponseMsg until release 3.4.1.
+     * 
+     * @return The String that contains the HTTP response message (e.g.
+     *         "SUCCESS")
+     */
+    public String getResponseMsg();
+
+    /**
+     * Closes the connection to the server and releases resources.
+     */
+    public void close();
+
+    /**
+     * @return The Thread state
+     * @see Thread#getState()
+     */
+    public Thread.State getState();
+
+    /**
+     * This method is created in this interface, and is implemented by
+     * {@link DefaultFileUploadThread}, as this class is a subclass of
+     * {@link Thread}.
+     * 
+     * @return true if the thread is currently working.
+     * @see java.lang.Thread#isAlive()
+     */
+    public boolean isAlive();
+
+    /**
+     * This method is created in this interface, and is implemented by
+     * {@link DefaultFileUploadThread}, as this class is a subclass of
+     * {@link Thread}.
+     * 
+     * @throws InterruptedException
+     * @see java.lang.Thread#join()
+     */
+    public void join() throws InterruptedException;
+
+    /**
+     * This method is created in this interface, and is implemented by
+     * {@link DefaultFileUploadThread}, as this class is a subclass of
+     * {@link Thread}.
+     * 
+     * @param millisec
+     * @throws InterruptedException
+     * @see java.lang.Thread#join(long)
+     */
+    public void join(long millisec) throws InterruptedException;
+
+    /**
+     * This method is created in this interface, and is implemented by
+     * {@link DefaultFileUploadThread}, as this class is a subclass of
+     * {@link Thread}.
+     * 
+     * @see java.lang.Thread#start()
+     */
+    public void start();
+
+    /**
+     * This method is created in this interface, and is implemented by
+     * {@link DefaultFileUploadThread}, as this class is a subclass of
+     * {@link Thread}.
+     * 
+     * @see java.lang.Thread#interrupt()
+     */
+    public void interrupt();
+
+    /**
+     * Changes the FileUploadManagerThread. The standard way is to give the
+     * FileUploadManagerThread to the constructor. This method is used by JUnit
+     * tests, to be able to control which FileUploadThread is created.
+     * 
+     * @param fileUploadManagerThread
+     * @throws JUploadException
+     * @see FileUploadManagerThread
+     */
+    void setFileUploadThreadManager(
+            FileUploadManagerThread fileUploadManagerThread)
+            throws JUploadException;
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadHTTP.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadHTTP.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/FileUploadThreadHTTP.java	(revision 3951)
@@ -0,0 +1,487 @@
+//
+// $Id: FileUploadThreadHTTP.java 1469 2010-12-14 12:27:42Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-03-07
+// Creator: etienne_sf
+// Last modified: $Date: 2010-12-14 10:27:42 -0200 (Ter, 14 Dez 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+package wjhk.jupload2.upload;
+
+import java.io.IOException;
+import java.io.OutputStream;
+import java.io.UnsupportedEncodingException;
+import java.net.URL;
+import java.net.URLDecoder;
+import java.net.URLEncoder;
+import java.util.HashMap;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.BlockingQueue;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+import wjhk.jupload2.upload.helper.ByteArrayEncoderHTTP;
+import wjhk.jupload2.upload.helper.HTTPConnectionHelper;
+
+/**
+ * This class implements the file upload via HTTP POST request.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1469 $
+ */
+public class FileUploadThreadHTTP extends DefaultFileUploadThread {
+
+    /**
+     * The current connection helper. No initialization now: we need to wait for
+     * the startRequest method, to have all needed information.
+     */
+    private HTTPConnectionHelper connectionHelper = null;
+
+    /**
+     * local head within the multipart post, for each file. This is
+     * precalculated for all files, in case the upload is not chunked. The heads
+     * length are counted in the total upload size, to check that it is less
+     * than the maxChunkSize. tails are calculated once, as they depend not of
+     * the file position in the upload.
+     */
+    private HashMap<UploadFileData, ByteArrayEncoder> heads = null;
+
+    /**
+     * same as heads, for the ... tail in the multipart post, for each file. But
+     * tails depend on the file position (the boundary is added to the last
+     * tail). So it's to be calculated for each upload.
+     */
+    private HashMap<UploadFileData, ByteArrayEncoder> tails = null;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param uploadPolicy The policy to be applied.
+     * @param packetQueue The queue from wich packets to upload are available.
+     * @param fileUploadManagerThread
+     */
+    public FileUploadThreadHTTP(UploadPolicy uploadPolicy,
+            BlockingQueue<UploadFilePacket> packetQueue,
+            FileUploadManagerThread fileUploadManagerThread) {
+        super("FileUploadThreadHTTP thread", packetQueue, uploadPolicy,
+                fileUploadManagerThread);
+        this.uploadPolicy.displayDebug("  Using " + this.getClass().getName(),
+                30);
+
+        uploadPolicy.displayDebug("Upload done by using the "
+                + getClass().getName() + " class", 30);
+        // Name the thread (useful for debugging)
+        setName("FileUploadThreadHTTP");
+        // FIXME There are two such initializations in this class. Necessary ??
+        this.connectionHelper = new HTTPConnectionHelper(uploadPolicy);
+    }
+
+    /** @see DefaultFileUploadThread#beforeRequest(UploadFilePacket) */
+    @Override
+    void beforeRequest(UploadFilePacket packet) throws JUploadException {
+        if (this.connectionHelper != null) {
+            // It must be retring an upload. We clear any previous work.
+            this.connectionHelper.dispose();
+        }
+        this.connectionHelper = new HTTPConnectionHelper(uploadPolicy);
+        setAllHead(packet, this.connectionHelper.getBoundary());
+        setAllTail(packet, this.connectionHelper.getBoundary());
+    }
+
+    /** @see DefaultFileUploadThread#getAdditionnalBytesForUpload(UploadFileData) */
+    @Override
+    long getAdditionnalBytesForUpload(UploadFileData uploadFileData)
+            throws JUploadIOException {
+        return this.heads.get(uploadFileData).getEncodedLength()
+                + this.tails.get(uploadFileData).getEncodedLength();
+    }
+
+    /** @see DefaultFileUploadThread#afterFile(UploadFileData) */
+    @Override
+    void afterFile(UploadFileData uploadFileData) throws JUploadIOException {
+        this.connectionHelper.append(this.tails.get(uploadFileData));
+        this.uploadPolicy.displayDebug("--- filetail start (len="
+                + this.tails.get(uploadFileData).getEncodedLength() + "):", 70);
+        this.uploadPolicy.displayDebug(quoteCRLF(this.tails.get(uploadFileData)
+                .getString()), 70);
+        this.uploadPolicy.displayDebug("--- filetail end", 70);
+    }
+
+    /** @see DefaultFileUploadThread#beforeFile(UploadFilePacket, UploadFileData) */
+    @Override
+    void beforeFile(UploadFilePacket uploadFilePacket,
+            UploadFileData uploadFileData) throws JUploadException {
+        // heads[i] contains the header specific for the file, in the multipart
+        // content.
+        // It is initialized at the beginning of the run() method. It can be
+        // override at the beginning of this loop, if in chunk mode.
+        try {
+            this.connectionHelper.append(this.heads.get(uploadFileData)
+                    .getEncodedByteArray());
+
+            // Debug output: always called, so that the debug file is correctly
+            // filled.
+            this.uploadPolicy.displayDebug("--- fileheader start (len="
+                    + this.heads.get(uploadFileData).getEncodedLength() + "):",
+                    70);
+            this.uploadPolicy.displayDebug(quoteCRLF(this.heads.get(
+                    uploadFileData).getString()), 70);
+            this.uploadPolicy.displayDebug("--- fileheader end", 70);
+        } catch (Exception e) {
+            throw new JUploadException(e);
+        }
+    }
+
+    /** @see DefaultFileUploadThread#cleanAll() */
+    @Override
+    void cleanAll() throws JUploadException {
+        // Nothing to do in HTTP mode.
+    }
+
+    /** @see DefaultFileUploadThread#cleanRequest() */
+    @Override
+    void cleanRequest() throws JUploadException {
+        try {
+            this.connectionHelper.dispose();
+        } catch (JUploadIOException e) {
+            this.uploadPolicy.displayErr(this.uploadPolicy
+                    .getLocalizedString("errDuringUpload"), e);
+            throw e;
+        }
+    }
+
+    @Override
+    int finishRequest() throws JUploadException {
+        if (this.uploadPolicy.getDebugLevel() > 100) {
+            // Let's have a little time to check the upload messages written on
+            // the progress bar.
+            try {
+                Thread.sleep(400);
+            } catch (InterruptedException e) {
+            }
+        }
+        int status = this.connectionHelper.readHttpResponse();
+        setResponseMsg(this.connectionHelper.getResponseMsg());
+        setResponseBody(this.connectionHelper.getResponseBody());
+        return status;
+    }
+
+    /**
+     * When interrupted, we close all network connection.
+     */
+    @Override
+    void interruptionReceived() {
+        // FIXME: this should manage chunked upload (to free temporary files on
+        // the server)
+        try {
+            if (this.connectionHelper != null) {
+                this.connectionHelper.dispose();
+                this.connectionHelper = null;
+            }
+
+            if (this.heads != null) {
+                for (UploadFileData uploadFileData : this.heads.keySet()) {
+                    ByteArrayEncoder bae = this.heads.get(uploadFileData);
+                    if (bae != null) {
+                        bae.close();
+                    }
+                }
+                this.heads = null;
+            }
+            if (this.tails != null) {
+                for (UploadFileData uploadFileData : this.tails.keySet()) {
+                    ByteArrayEncoder bae = this.tails.get(uploadFileData);
+                    if (bae != null) {
+                        bae.close();
+                    }
+                }
+                this.tails = null;
+            }
+        } catch (Exception e) {
+            this.uploadPolicy.displayWarn("Exception in "
+                    + getClass().getName() + ".interruptionReceived() ("
+                    + e.getClass().getName() + "): " + e.getMessage());
+        }
+    }
+
+    /**
+     * @see DefaultFileUploadThread#getResponseBody()
+     * @Override String getResponseBody() { return
+     *           this.sbHttpResponseBody.toString(); }
+     */
+    /** @see DefaultFileUploadThread#getOutputStream() */
+    @Override
+    OutputStream getOutputStream() throws JUploadException {
+        return this.connectionHelper.getOutputStream();
+    }
+
+    /** @see DefaultFileUploadThread#startRequest(long, boolean, int, boolean) */
+    @Override
+    void startRequest(long contentLength, boolean bChunkEnabled, int chunkPart,
+            boolean bLastChunk) throws JUploadException {
+
+        try {
+            String chunkHttpParam = "jupart=" + chunkPart + "&jufinal="
+                    + (bLastChunk ? "1" : "0");
+            this.uploadPolicy.displayDebug("chunkHttpParam: " + chunkHttpParam,
+                    30);
+
+            URL url = new URL(this.uploadPolicy.getPostURL());
+
+            // Add the chunking query params to the URL if there are any
+            if (bChunkEnabled) {
+                if (null != url.getQuery() && !"".equals(url.getQuery())) {
+                    url = new URL(url.toExternalForm() + "&" + chunkHttpParam);
+                } else {
+                    url = new URL(url.toExternalForm() + "?" + chunkHttpParam);
+                }
+            }
+
+            this.connectionHelper.initRequest(url, "POST", bChunkEnabled,
+                    bLastChunk);
+
+            // Get the GET parameters from the URL and convert them to
+            // post form params
+            ByteArrayEncoder formParams = getFormParamsForPostRequest(url);
+            contentLength += formParams.getEncodedLength();
+
+            this.connectionHelper.append(
+                    "Content-Type: multipart/form-data; boundary=").append(
+                    this.connectionHelper.getBoundary().substring(2)).append(
+                    "\r\n");
+            this.connectionHelper.append("Content-Length: ").append(
+                    String.valueOf(contentLength)).append("\r\n");
+
+            // Blank line (end of header)
+            this.connectionHelper.append("\r\n");
+
+            // formParams are not really part of the main header, but we add
+            // them here anyway. We write directly into the
+            // ByteArrayOutputStream, as we already encoded them, to get the
+            // encoded length. We need to flush the writer first, before
+            // directly writing to the ByteArrayOutputStream.
+            this.connectionHelper.append(formParams);
+
+            // Let's call the server
+            this.connectionHelper.sendRequest();
+
+            // Debug output: always called, so that the debug file is correctly
+            // filled.
+            this.uploadPolicy.displayDebug("=== main header (len="
+                    + this.connectionHelper.getByteArrayEncoder()
+                            .getEncodedLength()
+                    + "):\n"
+                    + quoteCRLF(this.connectionHelper.getByteArrayEncoder()
+                            .getString()), 70);
+            this.uploadPolicy.displayDebug("=== main header end", 70);
+        } catch (IOException e) {
+            throw new JUploadIOException(e);
+        } catch (IllegalArgumentException e) {
+            throw new JUploadException(e);
+        }
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// PRIVATE METHODS
+    // ////////////////////////////////////////////////////////////////////////////////////
+    /**
+     * Returns the header for this file, within the http multipart body.
+     * 
+     * @param numInCurrentUpload Index of the file in the array that contains
+     *            all files to upload.
+     * @param bound The boundary that separate files in the http multipart post
+     *            body.
+     * @param chunkPart The numero of the current chunk (from 1 to n)
+     * @return The encoded header for this file. The {@link ByteArrayEncoder} is
+     *         closed within this method.
+     * @throws JUploadException
+     */
+    private final ByteArrayEncoder getFileHeader(UploadFileData uploadFileData,
+            int numInCurrentUpload, String bound, int chunkPart)
+            throws JUploadException {
+        String filenameEncoding = this.uploadPolicy.getFilenameEncoding();
+        String mimetype = uploadFileData.getMimeType();
+        String uploadFilename = uploadFileData
+                .getUploadFilename(numInCurrentUpload);
+        ByteArrayEncoder bae = new ByteArrayEncoderHTTP(this.uploadPolicy,
+                bound);
+
+        if (numInCurrentUpload == 0) {
+            // Only once when uploading multiple files in same request.
+            // We'll encode the output stream into UTF-8.
+            String form = this.uploadPolicy.getFormdata();
+            if (null != form) {
+                bae.appendFormVariables(form);
+            }
+        }
+        // We ask the current FileData to add itself its properties.
+        uploadFileData.appendFileProperties(bae, numInCurrentUpload);
+
+        // boundary.
+        bae.append(bound).append("\r\n");
+
+        // Content-Disposition.
+        bae.append("Content-Disposition: form-data; name=\"");
+        bae.append(uploadFileData.getUploadName(numInCurrentUpload)).append(
+                "\"; filename=\"");
+        if (filenameEncoding == null) {
+            bae.append(uploadFilename);
+        } else {
+            try {
+                this.uploadPolicy.displayDebug("Encoded filename: "
+                        + URLEncoder.encode(uploadFilename, filenameEncoding),
+                        70);
+                bae.append(URLEncoder.encode(uploadFilename, filenameEncoding));
+            } catch (UnsupportedEncodingException e) {
+                this.uploadPolicy
+                        .displayWarn(e.getClass().getName() + ": "
+                                + e.getMessage()
+                                + " (in UploadFileData.getFileHeader)");
+                bae.append(uploadFilename);
+            }
+        }
+        bae.append("\"\r\n");
+
+        // Line 3: Content-Type.
+        bae.append("Content-Type: ").append(mimetype).append("\r\n");
+
+        // An empty line to finish the header.
+        bae.append("\r\n");
+
+        // The ByteArrayEncoder is now filled.
+        bae.close();
+        return bae;
+    }// getFileHeader
+
+    /**
+     * Construction of the head for each file.
+     * 
+     * @param bound The String boundary between the post data in the HTTP
+     *            request.
+     * @throws JUploadException
+     */
+    private final void setAllHead(UploadFilePacket packet, String bound)
+            throws JUploadException {
+        this.heads = new HashMap<UploadFileData, ByteArrayEncoder>(packet
+                .size());
+        int numInCurrentUpload = 0;
+        for (UploadFileData uploadFileData : packet) {
+            this.heads.put(uploadFileData, getFileHeader(uploadFileData,
+                    numInCurrentUpload++, bound, -1));
+        }
+    }
+
+    /**
+     * Construction of the tail for each file.
+     * 
+     * @param bound Current boundary, to apply for these tails.
+     */
+    private final void setAllTail(UploadFilePacket packet, String bound)
+            throws JUploadException {
+        this.tails = new HashMap<UploadFileData, ByteArrayEncoder>(packet
+                .size());
+        for (int i = 0; i < packet.size(); i++) {
+            // We'll encode the output stream into UTF-8.
+            ByteArrayEncoder bae = new ByteArrayEncoderHTTP(this.uploadPolicy,
+                    bound);
+
+            bae.append("\r\n");
+
+            if (this.uploadPolicy.getSendMD5Sum()) {
+                bae.appendTextProperty("md5sum", packet.get(i).getMD5(), i);
+            }
+
+            // The last tail gets an additional "--" in order to tell the
+            // server we have finished.
+            if (i == packet.size() - 1) {
+                bae.append(bound).append("--\r\n");
+            }
+
+            // Let's store this tail.
+            bae.close();
+
+            this.tails.put(packet.get(i), bae);
+        }
+
+    }
+
+    /**
+     * Converts the parameters in GET form to post form
+     * 
+     * @param url the <code>URL</code> containing the query parameters
+     * @return the parameters in a string in the correct form for a POST request
+     * @throws JUploadIOException
+     */
+    private final ByteArrayEncoder getFormParamsForPostRequest(final URL url)
+            throws JUploadIOException {
+
+        // Use a string buffer
+        // We'll encode the output stream into UTF-8.
+        ByteArrayEncoder bae = new ByteArrayEncoderHTTP(this.uploadPolicy,
+                this.connectionHelper.getBoundary());
+
+        // Get the query string
+        String query = url.getQuery();
+
+        if (null != query) {
+            // Split this into parameters
+            HashMap<String, String> requestParameters = new HashMap<String, String>();
+            String[] paramPairs = query.split("&");
+            String[] oneParamArray;
+
+            // TODO This could be much more simple !
+
+            // Put the parameters correctly to the Hashmap
+            for (String param : paramPairs) {
+                if (param.contains("=")) {
+                    oneParamArray = param.split("=");
+                    if (oneParamArray.length > 1) {
+                        // There is a value for this parameter
+                        try {
+                            // Correction of URL double encoding bug
+                            requestParameters.put(oneParamArray[0], URLDecoder
+                                    .decode(oneParamArray[1], "UTF-8"));
+                        } catch (UnsupportedEncodingException e) {
+                            throw new JUploadIOException(e.getClass().getName()
+                                    + ": " + e.getMessage()
+                                    + " (when trying to decode "
+                                    + oneParamArray[1] + ")");
+                        }
+                    } else {
+                        // There is no value for this parameter
+                        requestParameters.put(oneParamArray[0], "");
+                    }
+                }
+            }
+
+            // Now add one multipart segment for each
+            Set<Map.Entry<String, String>> entrySet = requestParameters
+                    .entrySet();
+            Map.Entry<String, String> entry;
+            Iterator<Map.Entry<String, String>> i = entrySet.iterator();
+            while (i.hasNext()) {
+                entry = i.next();
+                bae.appendTextProperty(entry.getKey(), entry.getValue(), -1);
+            }
+        }
+        // Return the body content
+        bae.close();
+
+        return bae;
+    }// getFormParamsForPostRequest
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacket.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacket.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFilePacket.java	(revision 3951)
@@ -0,0 +1,171 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2010 The JUpload Team
+//
+// Created: 27 janv. 2010
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import java.util.ArrayList;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This file contains a packet of files, which will be sent in one request to
+ * the server.
+ * 
+ * @author etienne_sf
+ */
+@SuppressWarnings("serial")
+public class UploadFilePacket extends ArrayList<UploadFileData> {
+
+    /**
+     * The uploadPolicy, useful to get the max number of files and max packet
+     * size ... and perhaps other parameters in the future.
+     */
+    UploadPolicy uploadPolicy = null;
+
+    /**
+     * The sum of the size of all files in the packet.
+     */
+    long nbBytes = 0;
+
+    /** The maximum number of bytes in one packet to the server */
+    long maxNbBytes = -1;
+
+    /** The maximum number of files in one packet to the server */
+    long maxNbFiles = -1;
+
+    /**
+     * The standard constructor.
+     * 
+     * @param uploadPolicy
+     */
+    UploadFilePacket(UploadPolicy uploadPolicy) {
+        // nbFilesPerRequest may be very very big. Let's have a more realistic
+        // value, in this case (to avoid outOfMemoryError)
+        super(Math.min(uploadPolicy.getNbFilesPerRequest(), uploadPolicy
+                .getContext().getUploadPanel().getFilePanel().getFilesLength()));
+        this.uploadPolicy = uploadPolicy;
+        this.maxNbBytes = this.uploadPolicy.getMaxChunkSize();
+        this.maxNbFiles = Math.min(uploadPolicy.getNbFilesPerRequest(),
+                uploadPolicy.getContext().getUploadPanel().getFilePanel()
+                        .getFilesLength());
+    }
+
+    /**
+     * Checks if this packet can accept this file, according to the current
+     * {@link UploadPolicy}.
+     * 
+     * @param uploadFileData
+     * @return True if the file can be added, false otherwise.
+     */
+    public synchronized boolean canAdd(UploadFileData uploadFileData) {
+        // Here is the list of conditions. This code could be smalled. But I
+        // want it to be clear.
+        if (size() == 0) {
+            return true;
+        } else if (size() == this.maxNbFiles) {
+            // The packet is already full of files
+            return false;
+        } else if (this.nbBytes + uploadFileData.getUploadLength() > maxNbBytes) {
+            // The packet would be too big
+            return false;
+        } else {
+            // No reason to refuse this packet ...
+            return true;
+        }
+    }
+
+    /**
+     * Indicates whether it is possible to add a file or not, to this packet,
+     * according to the current upload policy.
+     * 
+     * @return true if the packet is full, that is: no file can be added to this
+     *         packet.
+     */
+    public synchronized boolean isFull() {
+        return (size() == this.maxNbFiles) || (this.nbBytes >= maxNbBytes);
+    }
+
+    /**
+     * @param uploadFileData The file to add to the packet
+     * @return true if the collection changed, that is: if the file was actually
+     *         added. false if the Collection didn't change, that is: the packet
+     *         is full, or th file is already there.
+     */
+    public synchronized boolean add(UploadFileData uploadFileData) {
+        if (!canAdd(uploadFileData)) {
+            return false;
+        } else if (!super.add(uploadFileData)) {
+            return false;
+        } else {
+            // The file was correctly added.
+            nbBytes += uploadFileData.getUploadLength();
+            ;
+            return true;
+        }
+    }
+
+    /**
+     * @return the poisonned status. Returns always false, as this instance is a
+     *         true one. false indicates the 'End Of Queue' marker in the
+     *         preparedFileQueue, which is not the case here
+     * @see UploadFileDataPoisonned
+     */
+    public boolean isPoisonned() {
+        return false;
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////
+    // Some ArrayList methods are prohibited here
+    // ////////////////////////////////////////////////////////////////////////////
+    /**
+     * Prohibited !
+     * 
+     * @see ArrayList#remove(int)
+     */
+    public UploadFileData remove(int index) {
+        throw new java.lang.UnsupportedOperationException(
+                "Removing a file from an UploadFilePacket is prohibited");
+    }
+
+    /**
+     * Prohibited !
+     * 
+     * @see ArrayList#remove(Object)
+     */
+    public boolean remove(Object o) {
+        throw new java.lang.UnsupportedOperationException(
+                "Removing a file from an UploadFilePacket is prohibited");
+    }
+
+    /**
+     * Prohibited !
+     * 
+     * @see ArrayList#removeRange(int, int)
+     */
+    protected void removeRange(int fromIndex, int toIndex) {
+        throw new java.lang.UnsupportedOperationException(
+                "Removing a file from an UploadFilePacket is prohibited");
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileDataPoisonned.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileDataPoisonned.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileDataPoisonned.java	(revision 3951)
@@ -0,0 +1,28 @@
+package wjhk.jupload2.upload;
+
+/**
+ * 
+ * This class is a kind of 'End of Queue' object. It is posted by the
+ * {@link FilePreparationThread} on the preparedFileQueue, to indicate to the
+ * {@link PacketConstructionThread} that the last file was sent.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class UploadFileDataPoisonned extends UploadFileData {
+
+    UploadFileDataPoisonned() {
+        super(null, -1, null, null);
+    }
+
+    /**
+     * @return the poisonned status. Returns always true, as this class is only
+     *         used to indicate the 'End Of Queue' marker in the
+     *         preparedFileQueue.
+     * @see UploadFileData
+     */
+    final public boolean isPoisonned() {
+        return true;
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileData.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileData.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/UploadFileData.java	(revision 3951)
@@ -0,0 +1,375 @@
+//
+// $Id: UploadFileData.java 1360 2010-06-28 11:35:55Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-11-20
+// Creator: etienne_sf
+// Last modified: $Date: 2010-06-28 08:35:55 -0300 (Seg, 28 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.upload;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.OutputStream;
+import java.util.Date;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.exception.JUploadInterrupted;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+
+/**
+ * This class implements the FileData interface, and is responsible to do the
+ * actual upload of the files.
+ * 
+ * @author etienne_sf
+ */
+public class UploadFileData implements FileData {
+
+	/**
+	 * The {@link FileData} instance that contains all information about the
+	 * file to upload.
+	 */
+	private FileData fileData = null;
+
+	/**
+	 * The value of the fileData InputStream. It's main use is to allow chunk
+	 * upload, to reuse the previous InputStream, that is: each chunk will start
+	 * reading the stream where the previous one stopped.
+	 */
+	InputStream uploadInputStream = null;
+
+	/**
+	 * Indicates the position of the file in the current upload (from 0 to
+	 * max-1). It is mainly used by the
+	 * ProgressBarManager.updateUploadProgressBarText() method, to display the
+	 * upload status to the user.
+	 */
+	int numOfFileInCurrentUpload = -1;
+
+	// FIXME numOfFileInCurrentUpload should be from 1 to max
+
+	/**
+	 * Instance of the fileUploadManagerThread. This allow this class to send
+	 * feedback to the thread.
+	 * 
+	 * @see FileUploadManagerThread#nbBytesUploaded(long)
+	 */
+	private FileUploadManagerThread fileUploadManagerThread = null;
+
+	/**
+	 * The number of bytes to upload, for this file (without the head and tail
+	 * defined for the HTTP multipart body).
+	 */
+	private long uploadRemainingLength = -1;
+
+	/**
+	 * The current {@link UploadPolicy}
+	 */
+	private UploadPolicy uploadPolicy = null;
+
+	private final static int BUFLEN = 4096;
+
+	/**
+	 * This field is no more static, as we could decide to upload two files
+	 * simultaneously.
+	 */
+	private final byte readBuffer[] = new byte[BUFLEN];
+
+	// /////////////////////////////////////////////////////////////////////////////////////////////////////
+	// //////////////////////////////////// CONSTRUCTOR
+	// ///////////////////////////////////////////
+	// /////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Standard constructor for the UploadFileData class.
+	 * 
+	 * @param fileDataParam
+	 *            The file data the this instance must transmist.
+	 * @param numOfFileInCurrentUpload
+	 * @param fileUploadManagerThreadParam
+	 *            The current instance of {@link FileUploadThread}
+	 * @param uploadPolicyParam
+	 *            The current upload policy, instance of {@link UploadPolicy}
+	 */
+	public UploadFileData(FileData fileDataParam, int numOfFileInCurrentUpload,
+			FileUploadManagerThread fileUploadManagerThreadParam,
+			UploadPolicy uploadPolicyParam) {
+		if (fileDataParam == null && !(this instanceof UploadFileDataPoisonned)) {
+			throw new NullPointerException(
+					"fileData is null in UploadFileData(FileData, FileUploadManagerThread, UploadPolicy) constructor");
+		}
+		this.fileData = fileDataParam;
+		this.numOfFileInCurrentUpload = numOfFileInCurrentUpload;
+		this.fileUploadManagerThread = fileUploadManagerThreadParam;
+		this.uploadPolicy = uploadPolicyParam;
+	}
+
+	/**
+	 * This particular constructor is posted by the
+	 * {@link FilePreparationThread} in the preparedFileQueue to indicate that
+	 * the last file has been prepared.
+	 * 
+	 * @param poisonned
+	 *            This parameter is here to avoid this constructor to be the
+	 *            default constructor. Its value must be 'true'.
+	 */
+	public UploadFileData(boolean poisonned) {
+		if (!poisonned) {
+			throw new IllegalArgumentException(
+					"poisonned must be true in UploadFileData(boolean) constructor");
+		}
+	}
+
+	/**
+	 * Get the number of files that are still to upload. It is initialized at
+	 * the creation of the file, by a call to the
+	 * {@link FileData#getUploadLength()}. <BR>
+	 * <B>Note:</B> When the upload for this file is finish and you want to send
+	 * it again (for instance the upload failed, and you want to do a retry),
+	 * you should not reuse this instance, but, instead, create a new
+	 * UploadFileData instance.
+	 * 
+	 * @return Number of bytes still to upload.
+	 * @see #getInputStream()
+	 */
+	long getRemainingLength() {
+		return this.uploadRemainingLength;
+	}
+
+	/**
+	 * This methods writes the file data (see {@link FileData#getInputStream()}
+	 * to the given outputStream (the output toward the HTTP server).
+	 * 
+	 * @param outputStream
+	 *            The stream on which the data is to be written.
+	 * @param amount
+	 *            The number of bytes to write.
+	 * @throws JUploadException
+	 *             if an I/O error occurs.
+	 * @throws JUploadInterrupted
+	 *             Thrown when an interruption of the thread is detected.
+	 */
+	void uploadFile(OutputStream outputStream, long amount)
+			throws JUploadException, JUploadInterrupted {
+		this.uploadPolicy.displayDebug("in UploadFileData.uploadFile (amount:"
+				+ amount + ", getUploadLength(): " + getUploadLength() + ")",
+				30);
+
+		// getInputStream will put a new fileInput in the inputStream attribute,
+		// or leave it unchanged if it is not null.
+		InputStream inputStream = getInputStream();
+
+		while (amount > 0 && !this.fileUploadManagerThread.isUploadFinished()) {
+			// Are we interrupted ?
+			if (Thread.interrupted()) {
+				throw new JUploadInterrupted(getClass().getName()
+						+ ".uploadFile [" + this.getFileName() + "]",
+						this.uploadPolicy);
+			}
+
+			int toread = (amount > BUFLEN) ? BUFLEN : (int) amount;
+			int towrite = 0;
+
+			try {
+				towrite = inputStream.read(this.readBuffer, 0, toread);
+			} catch (IOException e) {
+				throw new JUploadIOException(e);
+			}
+			if (towrite > 0) {
+				try {
+					outputStream.write(this.readBuffer, 0, towrite);
+					this.fileUploadManagerThread.nbBytesUploaded(towrite, this);
+					amount -= towrite;
+					this.uploadRemainingLength -= towrite;
+
+					// For debug reason, I may need to simulate upload, that are
+					// on a real network. We then slow down the upload. This can
+					// occurs only when given a 'high' debugLevel (higher than
+					// what can be set with the applet GUI.
+					if (this.uploadPolicy.getDebugLevel() > 100) {
+						try {
+							Thread.sleep(20);
+						} catch (InterruptedException e) {
+							// Nothing to do. We'll just take a look at the loop
+							// condition.
+						}
+					}
+				} catch (IOException ioe) {
+					throw new JUploadIOException(this.getClass().getName()
+							+ ".uploadFile()", ioe);
+				} catch (Exception e) {
+					// When the user may not override an existing file, I got a
+					// NullPointerException. Let's trap all errors here.
+					throw new JUploadException(
+							this.getClass().getName()
+									+ ".uploadFile()  (check the user permission on the server)",
+							e);
+				}
+			}
+		}// while
+	}
+
+	/**
+	 * Just transmit to {@link FileData#afterUpload()}.
+	 * 
+	 * @see FileData#afterUpload()
+	 */
+	public void afterUpload() {
+		// Transmission to the 'real' FileData
+		this.fileData.afterUpload();
+	}
+
+	/** {@inheritDoc} */
+	public void appendFileProperties(ByteArrayEncoder bae, int index)
+			throws JUploadIOException {
+		this.fileData.appendFileProperties(bae, index);
+	}
+
+	/** {@inheritDoc} */
+	public void beforeUpload() throws JUploadException {
+		this.fileData.beforeUpload();
+
+		// Calculation of some internal variables.
+		this.uploadRemainingLength = this.fileData.getUploadLength();
+	}
+
+	/** {@inheritDoc} */
+	public boolean canRead() {
+		return this.fileData.canRead();
+	}
+
+	/** {@inheritDoc} */
+	public String getDirectory() {
+		return this.fileData.getDirectory();
+	}
+
+	/** {@inheritDoc} */
+	public File getFile() {
+		return this.fileData.getFile();
+	}
+
+	/** {@inheritDoc} */
+	public String getFileExtension() {
+		return this.fileData.getFileExtension();
+	}
+
+	/** {@inheritDoc} */
+	public long getFileLength() {
+		return this.fileData.getFileLength();
+	}
+
+	/** {@inheritDoc} */
+	public String getFileName() {
+		return this.fileData.getFileName();
+	}
+
+	/** {@inheritDoc} */
+	public InputStream getInputStream() throws JUploadException {
+		if (this.uploadInputStream == null) {
+			this.uploadInputStream = this.fileData.getInputStream();
+		}
+		return this.uploadInputStream;
+	}
+
+	/** {@inheritDoc} */
+	public Date getLastModified() {
+		return this.fileData.getLastModified();
+	}
+
+	/** {@inheritDoc} */
+	public String getMD5() throws JUploadException {
+		return this.fileData.getMD5();
+	}
+
+	/** {@inheritDoc} */
+	public String getMimeType() {
+		return this.fileData.getMimeType();
+	}
+
+	/** {@inheritDoc} */
+	public String getRelativeDir() {
+		return this.fileData.getRelativeDir();
+	}
+
+	/**
+	 * Retrieves the file name, that should be used in the server application.
+	 * Default is to send the original filename.
+	 * 
+	 * @param index
+	 *            The index of this file in the current request to the server.
+	 * @return The real file name. Not used in FTP upload.
+	 * @throws JUploadException
+	 *             Thrown when an error occurs.
+	 * @see UploadPolicy#getUploadFilename(FileData, int)
+	 */
+	public String getUploadFilename(int index) throws JUploadException {
+		return this.uploadPolicy.getUploadFilename(this.fileData, index);
+	}
+
+	/**
+	 * Retrieves the upload file name, that should be sent to the server. It's
+	 * the technical name used to retrieve the file content. Default is File0,
+	 * File1... This method just calls the
+	 * {@link UploadPolicy#getUploadFilename(FileData, int)} method.
+	 * 
+	 * @param index
+	 *            The index of this file in the current request to the server.
+	 * @return The technical upload file name. Not used in FTP upload.
+	 * @throws JUploadException
+	 * @see UploadPolicy#getUploadName(FileData, int)
+	 */
+	public String getUploadName(int index) throws JUploadException {
+		return this.uploadPolicy.getUploadName(this.fileData, index);
+	}
+
+	/**
+	 * This methods stores locally the upload length. So, on the contrary of the
+	 * {@link FileData} interface, this method may be called after
+	 * {@link #afterUpload()}, at one condition: that it has been called once
+	 * before {@link #afterUpload()} is called.
+	 * 
+	 * @see FileData#getUploadLength()
+	 */
+	public long getUploadLength() {
+		return this.fileData.getUploadLength();
+	}
+
+	/** {@inheritDoc} */
+	public boolean isPreparedForUpload() {
+		return this.fileData.isPreparedForUpload();
+	}
+
+	/**
+	 * @return the poisonned status. Returns always false, as this instance is a
+	 *         true one. false indicates the 'End Of Queue' marker in the
+	 *         preparedFileQueue, which is not the case here
+	 * @see UploadFileDataPoisonned
+	 */
+	public boolean isPoisonned() {
+		return false;
+	}
+
+	/**
+	 * @return the numOfFileInCurrentUpload
+	 */
+	public int getNumOfFileInCurrentUpload() {
+		return numOfFileInCurrentUpload;
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/upload/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/upload/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/upload/package.html	(revision 3951)
@@ -0,0 +1,127 @@
+
+<HTML>
+
+<BODY>
+
+This package contains the code that actually executes the upload (see below for a full description of the way the upload
+is executed in the JUpload code). 
+It is structured around these main items:
+<DIR>
+<LI><A HREF="FileUploadManagerThread.html">FileUploadManagerThread</A>: The main class. It controls the execution of 
+the upload, manages the file preparation, the progress bar, the possible exceptions...
+<LI><A HREF="FileUploadThread.html">FileUploadThread</A>: The interface of the class the execute the successives requests
+to the server. The following class implements this interface:
+	<DIR>
+	<LI><A HREF="DefaultFileUploadThread.html">DefaultFileUploadThread</A> is an abstract class, the provides the global
+	upload mechanism to send one packet of files to the server. The packet is created by FileUploadManagerThread, 
+	according to the current upload policy, with parameters like: <I>maxChunkSize</I> and <I>nbFilesPerRequest</I>. All protocol 
+	specific methods are implemented in the following implementation, depending on the applet parameter <I>postURL</I>:
+	<LI><A HREF="FileUploadThreadHTTP.html">FileUploadThreadHTTP</A> executes uploads to an HTTP server (http, https, 
+	proxy or not...), by using POST requests. It implements the abstract methods of DefaultFileUploadThread.
+	<LI><A HREF="FileUploadThreadFTP.html">FileUploadThreadFTP</A> is the implementation for FTP servers
+	</DIR>
+<LI><A HREF="UploadFileData.html">UploadFileData</A> is an implementation of the 
+	<A HREF="../filedata/FileData.html">wjhk.jupload2.filedata.FileData</A> interface, to add the 
+	<A HREF="UploadFileData.html#uploadFile(java.io.OutputStream,%20long)">uploadFile(OutputStream, long)</A> method,
+	which sends the file bytes to the server.
+<LI>The <A HREF="helper/package-summary.html">wjhk.jupload2.upload.helper</A> package offers various utilities to manage the upload.
+</DIR>
+
+<H3>How works the upload</H3>
+
+<P>Here is a description of what occurs, when the user clicks on the 'upload' button, on the applet, or when the
+applet startUpload() method is called by javascript:</P>
+<DIR>
+<LI>The JUploadPanel.doStartUpload() starts the job
+<LI>It calls the <A HREF="../policies/UploadPolicy.html#beforeUpload()">UploadPolicy.beforeUpload()</A> method. If this method 
+returns false, the process stops here.
+<LI>It then creates and starts the FileUploadManagerThread thread. This thread is responsible to throw all necessary 
+actions to execute the upload
+<LI>The fileUploadManagerThread creates the necessary queues and threads (see below)
+<LI>It then waits for the upload to finish, by comparing the total number of files to upload to the number of uploaded
+files, after each successful upload.
+</DIR>
+
+<P>The upload is done by these threads:</P>
+<DIR>
+<LI><A HREF="FileUploadManagerThread.html">FileUploadManagerThread</A>: The main thread of the upload, does these actions:
+	<DIR>
+	<LI>creation and start the queues described below.
+	<LI>creation and start the threads described below.
+	<LI>waiting for the upload to be finished
+	<LI>updating the upload progress bar
+	<LI>maintain the end of upload flag (with the isUploadFinished() method)
+	</DIR>
+<LI><A HREF="FilePreparationThread.html">FilePreparationThread</A>: This thread:
+	<DIR>
+	<LI>reads the list of files, from the FilePanel,
+	<LI>prepares each file for upload, by calling the <A HREF="../filedata/FileData.html#beforeUpload()">FileData.beforeUpload()</A> method.
+	<LI>manages exceptions that could occurs here. If one occurs, the user is asked if he want to go on with upload.
+	<LI>put the prepared file on the <B>preparedFileQueue</B>, if everything is ok.
+	<LI>put a <A HREF="UploadFileDataPoisonned.html">UploadFileDataPoisonned</A>, to tell the PacketPreparationThread 
+	that the last file was sent.
+	<LI>contains the reference of the number of files to upload (as some files may be in error, while the upload goes on).
+	</DIR>
+<LI><A href="PacketConstructionThread.html">PacketConstructionThread</A>: This thread is responsible for grouping the 
+files in packet of files, that will be sent in one request to the server. It:  
+	<DIR>
+	<LI>reads the files in the <B>preparedFileQueue</B>
+	<LI>checks if it can be added to the current packet.
+	<LI>put the packet in the <B>packetQueue</B> as soon as a packet is ready (or when the upload is finished)
+	<LI>put a <A HREF="UploadFilePacketPoisonned.html">UploadFilePacketPoisonned</A>, to tell the FileUploadThread 
+	that the last packet was sent.
+	<LI>adds the file to the current packet.
+	</DIR>
+<LI><A HREF="FileUploadThread.html">FileUploadThread</A>: This interface is implemented by these classes: 
+<A HREF="DefaultFileUploadThread.html">DefaultFileUploadThread</A> is an abstract
+class that contains all non protocol-specific code. The <A HREF="FileUploadThreadFTP.html">FileUploadThreadFTP</A> and 
+<A HREF="FileUploadThreadHTTP.html">FileUploadThreadHTTP</A> class implements the protocol-specific treatements, mainly: 
+build the request and read the server response. These classes do these actions:
+	<DIR>
+	<LI>Reads the next packet in the <B>packetQueue</B>
+	<LI>Checks if the upload is in chunked mode or not. Chunk mode is activated when the packet size is bigger than the
+	maxChunkSize applet. There must be only one file in the packet.
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeRequest(wjhk.jupload2.upload.UploadFilePacket)">DefaultFileUploadThread.beforeRequest(UploadFilePacket)</A> 
+	method, for any request preparation (server connection...) 
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#startRequest(long,%20boolean,%20int,%20boolean)">DefaultFileUploadThread.startRequest(long, boolean, int, boolean)</A>
+	method, for headers that need to be sent before the first file. 
+	<LI>[Non chunked mode] Loops throught the files in the packet:
+		<DIR>
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeFile(wjhk.jupload2.upload.UploadFilePacket, wjhk.jupload2.upload.UploadFileData)">beforeFile(UploadFilePacket, UploadFileData)</A>
+		<LI>Calls the <A HREF="UploadFileData.html#uploadFile(java.io.OutputStream, long)">UploadFileData.uploadFile(OutputStream, long)</A> to send the bytes for the already prepared files to the server.
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#afterFile(wjhk.jupload2.upload.UploadFileData)">afterFile(UploadFileData)</A>
+		</DIR>
+	<LI>[Chunked mode] Loops throught the chunks for the unique file in the packet:
+		<DIR>
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#beforeFile(wjhk.jupload2.upload.UploadFilePacket, wjhk.jupload2.upload.UploadFileData)">beforeFile(UploadFilePacket, UploadFileData)</A>
+		<LI>Calls the <A HREF="UploadFileData.html#uploadFile(java.io.OutputStream, long)">UploadFileData.uploadFile(OutputStream, long)</A> to send the bytes for the current chunk of the already prepared
+		files to the server.
+		<LI>Calls the <A HREF="DefaultFileUploadThread.html#afterFile(wjhk.jupload2.upload.UploadFileData)">afterFile(UploadFileData)</A>
+		</DIR>
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#finishRequest()">finishRequest()</A> method, to clean any 
+	resources about this request.
+	<LI>The <A HREF="../policies/UploadPolicy.html#checkUploadSuccess(int, java.lang.String, java.lang.String)">UploadPolicy.checkUploadSuccess(int, String, String)</A>
+	is called after each request to the server, to check that the server response contains the relevant success string.
+	It also checks if an error occurs (and then displays the message to the user). In this case, the 
+	<A HREF="FileUploadManagerThread.html#setUploadException(wjhk.jupload2.exception.JUploadException)">FileUploadManagerThread.setUploadException(JUploadException)</A>
+	is called. This stops the upload. All threads will quit. 
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#cleanRequest()">cleanRequest()</A> method, to clean any resources
+	used by this request.
+	<LI>Calls the <A HREF="DefaultFileUploadThread.html#cleanAll()">cleanAll()</A> method when the upload is finished, 
+	to clean any global resource for the upload.
+	</DIR>
+</DIR>
+
+<H3>The resume facility</H3>
+<P>When a network error occurs during upload, the applet can have some retries to the server. These retries can be automatic 
+or manually controlled. When an retries occurs, the whole packet is resent. That is: the apply re-execute the request that failed.</P>
+
+
+Impacts:
+- The FileData.afterUpload() can only be called once the whole request is a success or a failure without retry. That is: the afterUpload
+is called after catching the exception, that may be resumed.
+--> The call to FileData.afterUpload() should be moved from doNonChunkedUpload() and doChunkedUpload() to doUpload, in a
+new finally block, in a finally block.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FileByFileUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FileByFileUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FileByFileUploadPolicy.java	(revision 3951)
@@ -0,0 +1,63 @@
+//
+// $Id: FileByFileUploadPolicy.java 822 2009-07-02 14:49:12Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-06
+// Creator: etienne_sf
+// Last modified: $Date: 2009-07-02 11:49:12 -0300 (Qui, 02 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+
+/**
+ * Specialization of
+ * {@link wjhk.jupload2.policies.CustomizedNbFilesPerRequestUploadPolicy}, where
+ * each upload HTTP request contains only one file. <BR>
+ * <BR>
+ * This policy :
+ * <UL>
+ * <LI>Upload files without transformation
+ * <LI>File by file (uploading 5 files needs 5 HTTP request toward the server)
+ * <UL>
+ * <BR>
+ * <BR>
+ * The same behavior can be obtained by specifying no UploadPolicy (or
+ * {@link FileByFileUploadPolicy}), and give the nbFilesPerRequest (with a value
+ * set to 1) parameter.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 822 $
+ * @deprecated You can use the applet, without the uploadPolicy applet
+ *             parameter, and put the nbFilesPerRequest to 1. It does the
+ *             same...
+ * 
+ */
+@Deprecated
+public class FileByFileUploadPolicy extends DefaultUploadPolicy {
+
+    /**
+     * @param juploadContext The applet on which the UploadPolicy should apply.
+     * @throws JUploadException
+     */
+    public FileByFileUploadPolicy(JUploadContext juploadContext)
+            throws JUploadException {
+        super(juploadContext);
+
+        setNbFilesPerRequest(1);
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/PictureUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/PictureUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/PictureUploadPolicy.java	(revision 3951)
@@ -0,0 +1,819 @@
+//
+// $Id: PictureUploadPolicy.java 295 2007-06-27 08:43:25 +0000 (mer., 27 juin
+// 2007) etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-06
+// Creator: etienne_sf
+// Last modified: $Date: 2010-03-23 05:01:21 -0300 (Ter, 23 Mar 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.awt.Cursor;
+import java.awt.GridLayout;
+import java.awt.Image;
+import java.awt.SystemColor;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.image.ImageObserver;
+import java.io.File;
+
+import javax.swing.BorderFactory;
+import javax.swing.Icon;
+import javax.swing.ImageIcon;
+import javax.swing.JButton;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.filedata.helper.ImageFileConversionInfo;
+import wjhk.jupload2.gui.JUploadFileChooser;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.image.JUploadImagePreview;
+import wjhk.jupload2.gui.image.PictureDialog;
+import wjhk.jupload2.gui.image.PicturePanel;
+
+/**
+ * This class add handling of pictures to upload. <BR>
+ * <BR>
+ * <H4>Functionalities:</H4>
+ * <UL>
+ * <LI>The top panel (upper part of the applet display) is modified, by using
+ * UploadPolicy.
+ * {@link wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
+ * . It contains a <B>preview</B> picture panel, and two additional buttons to
+ * rotate the selected picture in one direction or the other.
+ * <LI>Ability to set maximum width or height to a picture (with maxPicWidth and
+ * maxPicHeight applet parameters, see the global explanation on the <a
+ * href="UploadPolicy.html#parameters">parameters</a> section) of the
+ * UploadPolicy API page.
+ * <LI>Rotation of pictures, by quarter of turn.
+ * <LI><I>(To be implemented)</I> A target picture format can be used, to force
+ * all uploaded pictures to be in one picture format, jpeg for instance. All
+ * details are in the UploadPolicy <a
+ * href="UploadPolicy.html#parameters">parameters</a> section.
+ * </UL>
+ * <BR>
+ * <BR>
+ * See an example of HTML that calls this applet, just below. <H4>Parameters</H4>
+ * The description for all parameters of all polices has been grouped in the
+ * UploadPolicy <a href="UploadPolicy.html#parameters">parameters</a> section. <BR>
+ * The parameters implemented in this class are:
+ * <UL>
+ * <LI>maxPicWidth: Maximum width for the uploaded picture.
+ * <LI>maxPicHeight: Maximum height for the uploaded picture.
+ * <LI>targetPictureFormat : Define picture format conversions.
+ * <LI>keepOriginalFileExtensionForConvertedImages : handling of file extensions
+ * for image conversions.
+ * </UL>
+ * <A NAME="example"> <H4>HTML call example</H4> </A> You'll find below an
+ * example of how to put the applet into a PHP page: <BR>
+ * <XMP> <APPLET NAME="JUpload" CODE="wjhk.jupload2.JUploadApplet"
+ * ARCHIVE="plugins/jupload/wjhk.jupload.jar" <!-- Applet display size, on the
+ * navigator page --> WIDTH="500" HEIGHT="700" <!-- The applet call some
+ * javascript function, so we must allow it : --> MAYSCRIPT > <!-- First,
+ * mandatory parameters --> <PARAM NAME="postURL"
+ * VALUE="http://some.host.com/youruploadpage.php"> <PARAM NAME="uploadPolicy"
+ * VALUE="PictureUploadPolicy"> <!-- Then, optional parameters --> <PARAM
+ * NAME="lang" VALUE="fr"> <PARAM NAME="maxPicHeight" VALUE="768"> <PARAM
+ * NAME="maxPicWidth" VALUE="1024"> <PARAM NAME="debugLevel" VALUE="0"> Java 1.4
+ * or higher plugin required. </APPLET> </XMP>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1057 $
+ */
+
+public class PictureUploadPolicy extends DefaultUploadPolicy implements
+        ActionListener, ImageObserver {
+
+    /**
+     * Indicates that a BufferedImage is to be created when the user selects the
+     * file. <BR>
+     * If true : the Image is loaded once from the hard drive. This consumes
+     * memory, but is interesting for big pictures, when they are resized (see
+     * {@link #maxWidth} and {@link #maxHeight}). <BR>
+     * If false : it is loaded for each display on the applet, then once for the
+     * upload. <BR>
+     * <BR>
+     * Default : false, because the applet, while in the navigator, runs too
+     * quickly out of memory.
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#DEFAULT_STORE_BUFFERED_IMAGE
+     */
+    private boolean storeBufferedImage;
+
+    /**
+     * This parameter can contain a list to convert image formats. <br />
+     * see class description of {@link UploadPolicy} for details
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#DEFAULT_TARGET_PICTURE_FORMAT
+     */
+    private String targetPictureFormat;
+
+    /**
+     * see class description of {@link UploadPolicy} for details
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#DEFAULT_KEEP_ORIG_EXTENSION
+     */
+    private boolean keepOrigExtension;
+
+    /**
+     * the parsed {@link #targetPictureFormat} list
+     */
+    private ImageFileConversionInfo imageFileConversionInfo = new ImageFileConversionInfo(
+            "");
+
+    /**
+     * Stored value for the fileChooserIconFromFileContent applet property.
+     * 
+     * @see UploadPolicy#PROP_FILE_CHOOSER_IMAGE_PREVIEW
+     */
+    private boolean fileChooserImagePreview = UploadPolicy.DEFAULT_FILE_CHOOSER_IMAGE_PREVIEW;
+
+    /**
+     * Indicates wether or not the preview pictures must be calculated by the
+     * BufferedImage.getScaledInstance() method.
+     */
+    private boolean highQualityPreview;
+
+    /**
+     * Maximal width for the uploaded picture. If the actual width for the
+     * picture is more than maxWidth, the picture is resized. The proportion
+     * between widht and height are maintained. Negative if no maximum width (no
+     * resizing). <BR>
+     * Default: -1.
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#DEFAULT_MAX_WIDTH
+     */
+    private int maxWidth = -1;
+
+    /**
+     * Maximal height for the uploaded picture. If the actual height for the
+     * picture is more than maxHeight, the picture is resized. The proportion
+     * between width and height are maintained. Negative if no maximum height
+     * (no resizing). <BR>
+     * Default: -1.
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#DEFAULT_MAX_HEIGHT
+     */
+    private int maxHeight = -1;
+
+    /**
+     * Used to control the compression of a jpeg written file, after
+     * transforming a picture.
+     * 
+     * @see UploadPolicy#PROP_PICTURE_COMPRESSION_QUALITY
+     */
+    private float pictureCompressionQuality = UploadPolicy.DEFAULT_PICTURE_COMPRESSION_QUALITY;
+
+    /**
+     * Used to control whether PictureFileData should add metadata to
+     * transformed picture files, before upload (or remove metadata from
+     * normally untransformed picture files).
+     */
+    private boolean pictureTransmitMetadata;
+
+    /**
+     * @see UploadPolicy
+     */
+    private int realMaxWidth = -1;
+
+    /**
+     * @see UploadPolicy
+     */
+    private int realMaxHeight = -1;
+
+    /**
+     * Button to allow the user to rotate the picture one quarter
+     * counter-clockwise.
+     */
+    private JButton rotateLeftButton;
+
+    /**
+     * Button to allow the user to rotate the picture one quarter clockwise.
+     */
+    private JButton rotateRightButton;
+
+    /**
+     * The picture panel, where the selected picture is displayed.
+     */
+    private PicturePanel picturePanel;
+
+    /**
+     * The standard constructor, which transmit most informations to the
+     * super.Constructor().
+     * 
+     * @param juploadContext Reference to the current applet. Allows access to
+     *            javascript functions.
+     * @throws JUploadException
+     */
+    public PictureUploadPolicy(JUploadContext juploadContext)
+            throws JUploadException {
+        super(juploadContext);
+
+        // Creation of the PictureFileDataPolicy, from parameters given to the
+        // applet, or from default values.
+        setFileChooserImagePreview(juploadContext.getParameter(
+                PROP_FILE_CHOOSER_IMAGE_PREVIEW,
+                DEFAULT_FILE_CHOOSER_IMAGE_PREVIEW));
+        setHighQualityPreview(juploadContext.getParameter(
+                PROP_HIGH_QUALITY_PREVIEW, DEFAULT_HIGH_QUALITY_PREVIEW));
+        setMaxHeight(juploadContext.getParameter(PROP_MAX_HEIGHT,
+                DEFAULT_MAX_HEIGHT));
+        setMaxWidth(juploadContext.getParameter(PROP_MAX_WIDTH,
+                DEFAULT_MAX_WIDTH));
+        setPictureCompressionQuality(juploadContext.getParameter(
+                PROP_PICTURE_COMPRESSION_QUALITY,
+                DEFAULT_PICTURE_COMPRESSION_QUALITY));
+        setPictureTransmitMetadata(juploadContext.getParameter(
+                PROP_PICTURE_TRANSMIT_METADATA,
+                DEFAULT_PICTURE_TRANSMIT_METADATA));
+        setRealMaxHeight(juploadContext.getParameter(PROP_REAL_MAX_HEIGHT,
+                DEFAULT_REAL_MAX_HEIGHT));
+        setRealMaxWidth(juploadContext.getParameter(PROP_REAL_MAX_WIDTH,
+                DEFAULT_REAL_MAX_WIDTH));
+        setTargetPictureFormat(juploadContext.getParameter(
+                PROP_TARGET_PICTURE_FORMAT, DEFAULT_TARGET_PICTURE_FORMAT));
+
+        setKeepOrigExtension(juploadContext.getParameter(
+                PROP_KEEP_ORIG_EXTENSION, DEFAULT_KEEP_ORIG_EXTENSION));
+
+        displayDebug("[PictureUploadPolicy] end of constructor", 30);
+    }
+
+    /**
+     * This methods actually returns a {@link PictureFileData} instance. It
+     * allows only pictures: if the file is not a picture, this method returns
+     * null, thus preventing the file to be added to the list of files to be
+     * uploaded.
+     * 
+     * @param file The file selected by the user (called once for each added
+     *            file).
+     * @return An instance of {@link PictureFileData} or null if file is not a
+     *         picture.
+     * @see wjhk.jupload2.policies.UploadPolicy#createFileData(File,File)
+     */
+    @Override
+    public FileData createFileData(File file, File root)
+            throws JUploadExceptionStopAddingFiles {
+        // Do standard rules accept this file ?
+        FileData defaultFileData = super.createFileData(file, root);
+
+        if (defaultFileData == null) {
+            // The file is not allowed.
+            return null;
+        } else {
+            // Ok, the file is to be accepted. Is it a picture?
+            PictureFileData pfd = null;
+            try {
+                pfd = new PictureFileData(file, root, this);
+            } catch (JUploadIOException e) {
+                displayErr(e);
+            }
+
+            // If we get a pfd, let' check that it's a picture.
+            if (pfd != null && pfd.isPicture()) {
+                return pfd;
+            } else if (getAllowedFileExtensions() != null) {
+                // A list of allowed extensions has been given, and, as we got
+                // here, defaultFileData is not null, that is: this files match
+                // the allowedFileEXtensions parameter. We return it.
+                return defaultFileData;
+            } else {
+                // We now use the JUploadExceptionStopAddingFiles exception, to
+                // allow the user to stop adding files.
+                String msg = getLocalizedString("notAPicture", file.getName());
+
+                // Alert only once, when several files are not pictures... hum,
+                displayWarn(msg);
+                if (JOptionPane.showConfirmDialog(null, msg, "alert",
+                        JOptionPane.OK_CANCEL_OPTION,
+                        JOptionPane.WARNING_MESSAGE) == JOptionPane.CANCEL_OPTION) {
+                    // The user want to stop to add files to the list. For
+                    // instance, when he/she added a whole directory, and it
+                    // contains a lot of files that don't match the allowed file
+                    // extension.
+                    throw new JUploadExceptionStopAddingFiles(
+                            "Stopped by the user");
+                }
+                return null;
+            }
+        }
+    }
+
+    /**
+     * This method override the default topPanel, and adds:<BR>
+     * <UL>
+     * <LI>Two rotation buttons, to rotate the currently selected picture.
+     * <LI>A Preview area, to view the selected picture
+     * </UL>
+     * 
+     * @see wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton,
+     *      JButton, JUploadPanel)
+     */
+    @Override
+    public JPanel createTopPanel(JButton browse, JButton remove,
+            JButton removeAll, JUploadPanel jUploadPanel) {
+        // The top panel is verticaly divided in :
+        // - On the left, the button bar (buttons one above another)
+        // - On the right, the preview PicturePanel.
+
+        // Creation of specific buttons
+        this.rotateLeftButton = new JButton(
+                getLocalizedString("buttonRotateLeft"));
+        this.rotateLeftButton.setIcon(new ImageIcon(getClass().getResource(
+                "/images/rotateLeft.gif")));
+        this.rotateLeftButton.addActionListener(this);
+        this.rotateLeftButton.addMouseListener(jUploadPanel.getMouseListener());
+        this.rotateLeftButton.setEnabled(false);
+
+        this.rotateRightButton = new JButton(
+                getLocalizedString("buttonRotateRight"));
+        this.rotateRightButton.setIcon(new ImageIcon(getClass().getResource(
+                "/images/rotateRight.gif")));
+        this.rotateRightButton.addActionListener(this);
+        this.rotateRightButton
+                .addMouseListener(jUploadPanel.getMouseListener());
+        this.rotateRightButton.setEnabled(false);
+
+        // The button bar
+        JPanel buttonPanel = new JPanel();
+        buttonPanel.setLayout(new GridLayout(5, 1, 5, 5));
+        buttonPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 5));
+        buttonPanel.add(browse);
+        buttonPanel.add(this.rotateLeftButton);
+        buttonPanel.add(this.rotateRightButton);
+        buttonPanel.add(removeAll);
+        buttonPanel.add(remove);
+
+        // The preview PicturePanel
+        JPanel pPanel = new JPanel();
+        pPanel.setLayout(new GridLayout(1, 1));
+        pPanel.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 10));
+
+        this.picturePanel = new PicturePanel(true, this);
+        this.picturePanel.addMouseListener(jUploadPanel.getMouseListener());
+        pPanel.add(this.picturePanel);
+        // Setting specific cursor for this panel, default for other parts of
+        // the applet.
+        setCursor(null);
+
+        // And last but not least ... creation of the top panel:
+        JPanel topPanel = new JPanel();
+        topPanel.setLayout(new GridLayout(1, 2));
+        topPanel.add(buttonPanel);
+        topPanel.add(pPanel);
+
+        jUploadPanel.getJComponent().setBorder(
+                BorderFactory.createLineBorder(SystemColor.controlDkShadow));
+
+        return topPanel;
+    }// createTopPanel
+
+    /**
+     * This method handles the clicks on the rotation buttons. All other actions
+     * are managed by the {@link DefaultUploadPolicy}.
+     * 
+     * @see java.awt.event.ActionListener#actionPerformed(java.awt.event.ActionEvent)
+     */
+    public void actionPerformed(ActionEvent e) {
+        displayInfo("Action : " + e.getActionCommand());
+        if (e.getActionCommand() == this.rotateLeftButton.getActionCommand()) {
+            this.picturePanel.rotate(-1);
+        } else if (e.getActionCommand() == this.rotateRightButton
+                .getActionCommand()) {
+            this.picturePanel.rotate(1);
+        }
+    }// actionPerformed
+
+    /**
+     * @see wjhk.jupload2.policies.UploadPolicy#onFileSelected(wjhk.jupload2.filedata.FileData)
+     */
+    @Override
+    public void onFileSelected(FileData fileData) {
+        if (fileData != null) {
+            displayDebug("File selected: " + fileData.getFileName(), 30);
+        }
+        if (this.picturePanel != null) {
+            // If this file is a picture, we display it.
+            if (fileData instanceof PictureFileData) {
+                Cursor previousCursor = setWaitCursor();
+                this.picturePanel.setPictureFile((PictureFileData) fileData,
+                        this.rotateLeftButton, this.rotateRightButton);
+                setCursor(previousCursor);
+            } else {
+                this.picturePanel.setPictureFile(null, this.rotateLeftButton,
+                        this.rotateRightButton);
+            }
+        }
+    }
+
+    /**
+     * Open the 'big' preview dialog box. It allows the user to see a full
+     * screen preview of the choosen picture.<BR>
+     * This method does nothing if the panel has no selected picture, that is
+     * when pictureFileData is null.
+     * 
+     * @see UploadPolicy#onFileDoubleClicked(FileData)
+     */
+    @Override
+    public void onFileDoubleClicked(FileData pictureFileData) {
+        if (pictureFileData == null) {
+            // No action
+        } else if (!(pictureFileData instanceof PictureFileData)) {
+            displayWarn("PictureUploadPolicy: received a non PictureFileData in onFileDoubleClicked");
+        } else {
+            new PictureDialog(null, (PictureFileData) pictureFileData, this);
+        }
+    }
+
+    /** @see UploadPolicy#beforeUpload() */
+    @Override
+    public boolean beforeUpload() {
+        // We clear the current picture selection. This insures a correct
+        // managing of enabling/disabling of
+        // buttons, even if the user stops the upload.
+        getContext().getUploadPanel().getFilePanel().clearSelection();
+        if (this.picturePanel != null) {
+            this.picturePanel.setPictureFile(null, this.rotateLeftButton,
+                    this.rotateRightButton);
+        }
+
+        // Then, we call the standard action, if any.
+        return super.beforeUpload();
+    }
+
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+    // /////////////////////// Getters and Setters
+    // ////////////////////////////////////////////////
+    // ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+    /**
+     * Getter for fileChooserImagePreview.
+     * 
+     * @return Current value for the applet parameter: fileChooserImagePreview
+     * @see UploadPolicy#PROP_FILE_CHOOSER_IMAGE_PREVIEW
+     */
+    public boolean getFileChooserImagePreview() {
+        return this.fileChooserImagePreview;
+    }
+
+    /**
+     * Setter for fileChooserIconFromFileContent. Current allowed values are:
+     * -1, 0, 1. Default value is 0.
+     * 
+     * @param fileChooserImagePreview new value to store, for the applet
+     *            parameter: fileChooserImagePreview.
+     * @see UploadPolicy#PROP_FILE_CHOOSER_IMAGE_PREVIEW
+     */
+    public void setFileChooserImagePreview(boolean fileChooserImagePreview) {
+        this.fileChooserImagePreview = fileChooserImagePreview;
+    }
+
+    /** @return the applet parameter <I>highQualityPreview</I>. */
+    public boolean getHighQualityPreview() {
+        return this.highQualityPreview;
+    }
+
+    /** @param highQualityPreview the highQualityPreview to set */
+    void setHighQualityPreview(boolean highQualityPreview) {
+        this.highQualityPreview = highQualityPreview;
+    }
+
+    /**
+     * @return Returns the maxHeight, that should be used by pictures non
+     *         transformed (rotated...) by the applet.
+     */
+    public int getMaxHeight() {
+        return this.maxHeight;
+    }
+
+    /** @param maxHeight the maxHeight to set */
+    void setMaxHeight(int maxHeight) {
+        if (maxHeight <= 0) {
+            this.maxHeight = Integer.MAX_VALUE;
+            displayWarn("[setMaxHeight] maxHeight switched from " + maxHeight
+                    + " to " + this.maxHeight);
+        } else {
+            this.maxHeight = maxHeight;
+        }
+    }
+
+    /**
+     * @return Returns the maxWidth, that should be used by pictures non
+     *         transformed (rotated...) by the applet.
+     */
+    public int getMaxWidth() {
+        return this.maxWidth;
+    }
+
+    /** @param maxWidth the maxWidth to set */
+    void setMaxWidth(int maxWidth) {
+        if (maxWidth <= 0) {
+            this.maxWidth = Integer.MAX_VALUE;
+            displayWarn("[setMaxWidth] maxWidth switched from " + maxWidth
+                    + " to " + this.maxWidth);
+        } else {
+            this.maxWidth = maxWidth;
+        }
+    }
+
+    /**
+     * @return The current value for picture compression.
+     */
+    public float getPictureCompressionQuality() {
+        return this.pictureCompressionQuality;
+    }
+
+    /**
+     * @see #pictureCompressionQuality
+     * @param pictureCompressionQuality The new value for picture compression.
+     */
+    void setPictureCompressionQuality(float pictureCompressionQuality) {
+        this.pictureCompressionQuality = pictureCompressionQuality;
+    }
+
+    /**
+     * @return The current value for transmission (or no transmission) of
+     *         picture metadata.
+     */
+    public boolean getPictureTransmitMetadata() {
+        return this.pictureTransmitMetadata;
+    }
+
+    /**
+     * @see #pictureTransmitMetadata
+     * @param pictureTransmitMetadata The new value for this attribute.
+     */
+    void setPictureTransmitMetadata(boolean pictureTransmitMetadata) {
+        this.pictureTransmitMetadata = pictureTransmitMetadata;
+    }
+
+    /**
+     * @return Returns the maxHeight, that should be used by pictures that are
+     *         transformed (rotated...) by the applet.
+     */
+    public int getRealMaxHeight() {
+        return (this.realMaxHeight == Integer.MAX_VALUE) ? this.maxHeight
+                : this.realMaxHeight;
+    }
+
+    /** @param realMaxHeight the realMaxHeight to set */
+    void setRealMaxHeight(int realMaxHeight) {
+        this.realMaxHeight = realMaxHeight;
+    }
+
+    /**
+     * @return Returns the maxWidth, that should be used by pictures that are
+     *         transformed (rotated...) by the applet.
+     */
+    public int getRealMaxWidth() {
+        return (this.realMaxWidth == Integer.MAX_VALUE) ? this.maxWidth
+                : this.realMaxWidth;
+    }
+
+    /** @param realMaxWidth the realMaxWidth to set */
+    void setRealMaxWidth(int realMaxWidth) {
+        this.realMaxWidth = realMaxWidth;
+    }
+
+    /** @return Returns the targetPictureFormat. */
+    public String getTargetPictureFormat() {
+        return this.targetPictureFormat;
+    }
+
+    /**
+     * @return The current ImageFileConversionInfo
+     */
+    public ImageFileConversionInfo getImageFileConversionInfo() {
+        return this.imageFileConversionInfo;
+    }
+
+    /**
+     * we expect e.g. "png,bmp:jpg;gif:png;"
+     * 
+     * @param targetPictureFormat the targetPictureFormat to set
+     * @throws JUploadException if the conversionList is erroneous
+     */
+    void setTargetPictureFormat(String targetPictureFormat)
+            throws JUploadException {
+        this.targetPictureFormat = targetPictureFormat;
+        this.imageFileConversionInfo = new ImageFileConversionInfo(
+                targetPictureFormat);
+    }
+
+    /**
+     * @return <ul>
+     *         <li><code>true</code>, if the the original file extension should
+     *         be kept</li>
+     *         <li><code>false</code>, if the the original file extension should
+     *         be changed to the target picture format, that the file has been
+     *         converted to</li>
+     *         </ul>
+     */
+    public boolean getKeepOrigExtension() {
+        return this.keepOrigExtension;
+    }
+
+    /**
+     * @param keepOrigExtension if the original file extension should be kept '
+     *            <code>true</code>', or changed '<code>false</code>' (if the
+     *            image was converted)
+     */
+    void setKeepOrigExtension(boolean keepOrigExtension)
+            throws JUploadException {
+        this.keepOrigExtension = keepOrigExtension;
+    }
+
+    /**
+     * This method manages the applet parameters that are specific to this
+     * class. The super.setProperty method is called for other properties.
+     * 
+     * @param prop The property which value should change
+     * @param value The new value for this property. If invalid, the default
+     *            value is used.
+     * @see wjhk.jupload2.policies.UploadPolicy#setProperty(java.lang.String,
+     *      java.lang.String)
+     */
+    @Override
+    public void setProperty(String prop, String value) throws JUploadException {
+        // The, we check the local properties.
+        if (prop.equals(PROP_FILE_CHOOSER_IMAGE_PREVIEW)) {
+            setFileChooserImagePreview(getContext().parseBoolean(value,
+                    getFileChooserImagePreview()));
+        } else if (prop.equals(PROP_HIGH_QUALITY_PREVIEW)) {
+            setHighQualityPreview(getContext().parseBoolean(value,
+                    this.highQualityPreview));
+        } else if (prop.equals(PROP_MAX_HEIGHT)) {
+            setMaxHeight(getContext().parseInt(value, this.maxHeight));
+        } else if (prop.equals(PROP_MAX_WIDTH)) {
+            setMaxWidth(getContext().parseInt(value, this.maxWidth));
+        } else if (prop.equals(PROP_PICTURE_COMPRESSION_QUALITY)) {
+            setPictureCompressionQuality(getContext().parseFloat(value,
+                    this.pictureCompressionQuality));
+        } else if (prop.equals(PROP_PICTURE_TRANSMIT_METADATA)) {
+            setPictureTransmitMetadata(getContext().parseBoolean(value,
+                    this.pictureTransmitMetadata));
+        } else if (prop.equals(PROP_REAL_MAX_HEIGHT)) {
+            setRealMaxHeight(getContext().parseInt(value, this.realMaxHeight));
+        } else if (prop.equals(PROP_REAL_MAX_WIDTH)) {
+            setRealMaxWidth(getContext().parseInt(value, this.realMaxWidth));
+        } else if (prop.equals(PROP_TARGET_PICTURE_FORMAT)) {
+            setTargetPictureFormat(value);
+        } else if (prop.equals(PROP_KEEP_ORIG_EXTENSION)) {
+            setKeepOrigExtension(getContext().parseBoolean(value,
+                    this.keepOrigExtension));
+        } else {
+            // Otherwise, transmission to the mother class.
+            super.setProperty(prop, value);
+        }
+    }
+
+    /** @see DefaultUploadPolicy#displayParameterStatus() */
+    @Override
+    public void displayParameterStatus() {
+        super.displayParameterStatus();
+
+        displayDebug("======= Parameters managed by PictureUploadPolicy", 30);
+        displayDebug(PROP_FILE_CHOOSER_IMAGE_PREVIEW + ": "
+                + getFileChooserImagePreview(), 30);
+        displayDebug(PROP_HIGH_QUALITY_PREVIEW + " : "
+                + this.highQualityPreview, 30);
+        displayDebug(PROP_PICTURE_COMPRESSION_QUALITY + " : "
+                + getPictureCompressionQuality(), 30);
+        displayDebug(PROP_PICTURE_TRANSMIT_METADATA + " : "
+                + getPictureTransmitMetadata(), 30);
+        displayDebug(PROP_MAX_WIDTH + " : " + this.maxWidth + ", "
+                + PROP_MAX_HEIGHT + " : " + this.maxHeight, 30);
+        displayDebug(PROP_REAL_MAX_WIDTH + " : " + this.realMaxWidth + ", "
+                + PROP_REAL_MAX_HEIGHT + " : " + this.realMaxHeight, 30);
+        displayDebug(PROP_STORE_BUFFERED_IMAGE + " : "
+                + this.storeBufferedImage, 30);
+        displayDebug(PROP_TARGET_PICTURE_FORMAT + " : "
+                + this.targetPictureFormat, 30);
+        displayDebug("Format conversions : " + getImageFileConversionInfo(), 40);
+        displayDebug("", 30);
+    }
+
+    /**
+     * Calls the {@link DefaultUploadPolicy#setWaitCursor()} method, then erases
+     * the picture panel specific cursor.
+     * 
+     * @see DefaultUploadPolicy#setCursor(Cursor)
+     */
+    @Override
+    public Cursor setWaitCursor() {
+        Cursor previousCursor = super.setWaitCursor();
+        this.picturePanel.setCursor(null);
+        return previousCursor;
+    }
+
+    /**
+     * Calls the {@link DefaultUploadPolicy#setCursor(Cursor)} method, then set
+     * the picture panel specific cursor.
+     * 
+     * @see DefaultUploadPolicy#setCursor(Cursor)
+     */
+    @Override
+    public Cursor setCursor(Cursor cursor) {
+        Cursor oldCursor = super.setCursor(null);
+        this.picturePanel.setCursor(new Cursor(Cursor.HAND_CURSOR));
+        return oldCursor;
+    }
+
+    /**
+     * Creates the file chooser, from the default implementation, then add an
+     * accessory to preview pictures.
+     * 
+     * @see UploadPolicy#createFileChooser()
+     */
+    @Override
+    public JUploadFileChooser createFileChooser() {
+        JUploadFileChooser jufc = super.createFileChooser();
+        if (getFileChooserImagePreview()) {
+            jufc.setAccessory(new JUploadImagePreview(jufc, this));
+        }
+        return jufc;
+    }
+
+    /**
+     * Returns an icon, calculated from the image content. Currently only
+     * pictures managed by ImageIO can be displayed. Once upon a day, extracting
+     * the first picture of a video may become reality... ;-) <BR>
+     * Note: this method is called in a dedicated thread by the
+     * JUploadFileChooser, to avoid to calculate the icon for all pictures, when
+     * opening a new folder.
+     * 
+     * @return The calculated ImageIcon, or null if no picture can be extracted.
+     * @see UploadPolicy#fileViewGetIcon(File)
+     * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+     */
+    @Override
+    public Icon fileViewGetIcon(File file) {
+        try {
+            return PictureFileData.getImageIcon(file, getFileChooserIconSize(),
+                    getFileChooserIconSize());
+        } catch (JUploadException e) {
+            displayErr(e);
+            return null;
+        }
+    }
+
+    /**
+     * @see wjhk.jupload2.policies.DefaultUploadPolicy#getUploadFilename(wjhk.jupload2.filedata.FileData,
+     *      int)
+     */
+    @Override
+    public String getUploadFilename(FileData fileData, int index)
+            throws JUploadException {
+        String fileName = fileData.getFileName();
+        if (!this.keepOrigExtension) {
+            String targetFormatOrNull = this.imageFileConversionInfo
+                    .getTargetFormatOrNull(fileData.getFileExtension());
+            if (targetFormatOrNull != null) {
+
+                int endIndex = fileName.length()
+                        - fileData.getFileExtension().length();
+                StringBuilder newFilename = new StringBuilder(fileName
+                        .substring(0, endIndex));
+                newFilename.append(targetFormatOrNull);
+                fileName = newFilename.toString();
+            }
+        }
+
+        return getEncodedFilename(fileName);
+    }
+
+    /**
+     * Implementation of the ImageObserver interface
+     * 
+     * @param arg0
+     * @param arg1
+     * @param arg2
+     * @param arg3
+     * @param arg4
+     * @param arg5
+     * @return true or false
+     */
+    public boolean imageUpdate(Image arg0, int arg1, int arg2, int arg3,
+            int arg4, int arg5) {
+        return true;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SilverpeasUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SilverpeasUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SilverpeasUploadPolicy.java	(revision 3951)
@@ -0,0 +1,190 @@
+// $Id: SilverpeasUploadPolicy.java 143  2010-01-27 11:01:06 +0100 (mer. 27 janv. 2010) ehsavoie $
+//
+// jupload - A file upload applet.
+// Copyright 2010 The JUpload Team
+//
+// Created: 2010-05-14
+// Creator: ehsavoie
+// Last modified: $Date: 2010-01-27 11:01:06 +0100 (mer. 27 janv. 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+package wjhk.jupload2.policies;
+
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.Dimension;
+import java.awt.dnd.DropTargetDropEvent;
+import java.io.BufferedReader;
+import java.io.CharArrayWriter;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import javax.swing.BoxLayout;
+import javax.swing.JLabel;
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionTooBigFile;
+import wjhk.jupload2.gui.JUploadPanel;
+
+/**
+ * Personnalised Policy with no button : use only DragAndDrop or Copy/Paste with automatic upload.<br/>
+ * This is given as an example of a personnalized policy to show how JUpload is easy to adapt to your
+ * specific needs.
+ * <ul>
+ *   <li>support for updating the background color.</li>
+ *   <li>load an HTML page to be displayed as a message into the Applet: allows a 'richer' label.</li>
+ *   <li>pre-validation of files size (when they are added, instead of before upload).</li>
+ * </ul>
+ * @author ehsavoie
+ */
+public class SilverpeasUploadPolicy extends DefaultUploadPolicy {
+
+  /** */
+  public static final String MESSAGE_URL = "message";
+  /** */
+  public static final String COLOR_RED = "bgcolor_r";
+  /** */
+  public static final String COLOR_BLUE = "bgcolor_b";
+  /** */
+  public static final String COLOR_GREEN = "bgcolor_g";
+  /** */
+  public static final String COLOR_ALPHA = "bgcolor_a";
+
+  /**
+   * The JUpload constructor for this upload policy. Like all upload policies,
+   * this constructor is called by the {@link UploadPolicyFactory}
+   *
+   * @param juploadContext
+   * @throws JUploadException
+   */
+  public SilverpeasUploadPolicy(JUploadContext juploadContext)
+          throws JUploadException {
+    super(juploadContext);
+    setNbFilesPerRequest(20);
+    displayInfo("Loading SilverpeasUploadPolicy ...");
+  }
+
+  /**
+   * This methods allow the upload policy to override the default disposition
+   * of the components on the applet.
+   *
+   * @see UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)
+   */
+  @Override
+  public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel) {
+    // Set the global layout of the panel.
+    displayInfo("Displaying SilverpeasUploadPolicy ...");
+    jUploadPanel.getJComponent().setLayout(new BoxLayout(jUploadPanel.getJComponent(),
+            BoxLayout.Y_AXIS));
+    displayInfo("Accessing the message " + getMessage());
+    Color color = new Color(getContext().getParameter(COLOR_RED, Color.LIGHT_GRAY.getRed()),
+            getContext().getParameter(COLOR_GREEN, Color.LIGHT_GRAY.getGreen()),
+            getContext().getParameter(COLOR_BLUE, Color.LIGHT_GRAY.getBlue()),
+            getContext().getParameter(COLOR_ALPHA, Color.LIGHT_GRAY.getAlpha()));
+    jUploadPanel.getJComponent().setBackground(color);
+    jUploadPanel.getStatusLabel().setBackground(color);
+    jUploadPanel.getUploadProgressBar().setBackground(color);
+
+    jUploadPanel.getStatusLabel().setText(getMessage());
+    jUploadPanel.getStatusLabel().setHorizontalAlignment(JLabel.CENTER);
+    jUploadPanel.getStatusLabel().setVerticalAlignment(JLabel.CENTER);
+    Dimension appletSize = getContext().getApplet().getSize();
+    Dimension preferredAppletSize = getContext().getApplet().getPreferredSize();
+    Dimension maxAppletSize = getContext().getApplet().getMaximumSize();
+    jUploadPanel.getStatusLabel().setAlignmentX(Component.CENTER_ALIGNMENT);
+    jUploadPanel.getStatusLabel().setAlignmentY(Component.CENTER_ALIGNMENT);
+    jUploadPanel.getStatusLabel().setPreferredSize(new Dimension(preferredAppletSize.width, preferredAppletSize.height
+            - 25));
+    jUploadPanel.getStatusLabel().setSize(new Dimension(appletSize.width, appletSize.height - 25));
+    jUploadPanel.getStatusLabel().setMaximumSize(new Dimension(maxAppletSize.width, maxAppletSize.height
+            - 25));
+    jUploadPanel.getStatusLabel().setMinimumSize(new Dimension(appletSize.width, appletSize.height
+            - 25));
+    jUploadPanel.getStatusLabel().setBackground(new Color(DEFAULT_ALBUM_ID));
+    jUploadPanel.getJComponent().add(jUploadPanel.getStatusLabel());
+    jUploadPanel.getJComponent().setAlignmentX(Component.CENTER_ALIGNMENT);
+    jUploadPanel.getUploadProgressBar().setAlignmentX(Component.CENTER_ALIGNMENT);
+    jUploadPanel.getUploadProgressBar().setAlignmentY(Component.CENTER_ALIGNMENT);
+    jUploadPanel.getUploadProgressBar().setPreferredSize(
+            new Dimension(preferredAppletSize.width, 20));
+    jUploadPanel.getUploadProgressBar().setSize(new Dimension(appletSize.width, 20));
+    jUploadPanel.getUploadProgressBar().setMaximumSize(new Dimension(maxAppletSize.width, 20));
+    jUploadPanel.getUploadProgressBar().setMinimumSize(new Dimension(appletSize.width, 20));
+    jUploadPanel.getUploadProgressBar().setStringPainted(false);
+    jUploadPanel.getUploadProgressBar().setBorderPainted(false);
+    // Then, add on the screen of the only component that is visible.
+    jUploadPanel.getJComponent().add(jUploadPanel.getUploadProgressBar());
+    // Now, we add the log window.
+    jUploadPanel.showOrHideLogWindow();
+    jUploadPanel.getJComponent().add(jUploadPanel.getJLogWindowPane());
+    displayInfo("Displaying SilverpeasUploadPolicy ...");
+  }
+
+  /**
+   * Loads the message from the specified URL.
+   * @return the remote message.
+   */
+  protected String getMessage() {
+    displayInfo("The message to be displayed is " + juploadContext.getParameter(MESSAGE_URL, ""));
+    String urlContent = juploadContext.getParameter(MESSAGE_URL, "");
+    String content = urlContent;
+    HttpURLConnection connection = null;
+    BufferedReader in = null;
+    try {
+      URL url = new URL(urlContent);
+      connection = (HttpURLConnection) url.openConnection();
+      connection.connect();
+      in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+      displayInfo("Getting data ...");
+      CharArrayWriter text = new CharArrayWriter();
+      int size = 0;
+      char[] buffer = new char[8];
+      while ((size = in.read(buffer)) >= 0) {
+        text.write(buffer, 0, size);
+      }
+      content = text.toString();
+    } catch (IOException ioex) {
+      displayErr(ioex);
+    } finally {
+      try {
+        if (in != null) {
+          in.close();
+        }
+      } catch (IOException ex) {
+        displayErr(ex);
+      }
+      connection.disconnect();
+    }
+    return content;
+  }
+
+  /**
+   * Default reaction after a successful drop operation: no action.
+   *
+   * @see UploadPolicy#afterFileDropped(DropTargetDropEvent)
+   */
+  @Override
+  public void afterFileDropped(DropTargetDropEvent dropEvent) {
+    getContext().getUploadPanel().doStartUpload();
+  }
+
+  /**
+   * @param description
+   * @see UploadPolicy#sendDebugInformation(String, Exception) */
+  @Override
+  public void sendDebugInformation(String description, Exception exception) {
+    if (exception instanceof JUploadExceptionTooBigFile) {
+       getContext().getUploadPanel().getFilePanel().removeAll();
+    }
+    super.sendDebugInformation(description, exception);
+  }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicy.java	(revision 3951)
@@ -0,0 +1,2643 @@
+//
+// $Id: UploadPolicy.java 287 2007-06-17 09:07:04 +0000 (dim., 17 juin 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-04
+// Creator: etienne_sf
+// Last modified: $Date: 2010-08-18 08:23:24 -0300 (Qua, 18 Ago 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.awt.Cursor;
+import java.awt.dnd.DropTargetDropEvent;
+import java.io.File;
+import java.util.Locale;
+
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.filechooser.FileFilter;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadFileChooser;
+import wjhk.jupload2.gui.JUploadFileFilter;
+import wjhk.jupload2.gui.JUploadFileView;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.gui.image.PictureDialog;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+
+/**
+ * This package contains upload policies, which allow easy configuration of the
+ * applet behavior. <br>
+ * <br>
+ * The class {@link DefaultUploadPolicy} contains a default implementation for
+ * all UploadPolicy methods. <br>
+ * <br>
+ * <h4><a name="parameters">Parameters</a></h4> <!-- ATTENTION: The following
+ * comment is used by Ant build. DO NOT CHANGE!! --> <!-- ANT_COPYDOC_START -->
+ * <p>
+ * Here is the list of all parameters available in the current package, that is:
+ * available in available upload policies. These are applet parameters that can
+ * be 'given' to the applet, with <PARAM> tags, as explained below in the <a
+ * href="#example">example</a>.
+ * </p>
+ * <P>
+ * Let's start with some hints: <DIR>
+ * <LI><A href="debugLevel">debugLevel</A> and <A
+ * href="showLogWindow">showLogWindow</A>: I recommend putting debugLevel to 99
+ * and showLogWindow to onError.
+ * <LI><A href="maxFileSize">maxFileSize</A>: this prevents the user to upload
+ * too big files. The value depends on your needs.
+ * <LI><A href="#maxChunkSize">maxChunkSize</A>: allows you to override the
+ * server's maximum upload file size. The uploaded file will be split in pieces
+ * of maxChunkSize bytes. Then, it's up to you to concatenate the file pieces,
+ * into a server script. There are sample in this doc, and in the JUpload wiki.
+ * Please add your samples also...</DIR>
+ * </P>
+ * <table border="1">
+ * <tr>
+ * <th>Parameter name</th>
+ * <th>Default value / <br>
+ * Implemented in</th>
+ * <th>Description</th>
+ * </tr>
+ * <tr>
+ * <td>afterUploadTarget<br>
+ * Since 2.9.2rc4</td>
+ * <td>_self<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter allows to select a specific target frame when redirecting
+ * to <code>afterUploadURL</code>. The following values are possible:<br>
+ * <ul>
+ * <li><code>_self</code> - Show in the window and frame that contain the
+ * applet.</li>
+ * <li><code>_parent</code> - Show in the applet's parent frame. If the applet's
+ * frame has no parent frame, acts the same as <i>_self</i>.</li>
+ * <li><code>_top</code> - Show in the top-level frame of the applet's window.
+ * If the applet's frame is the top-level frame, acts the same as <i>_self</i>.</li>
+ * <li><code>_blank</code> - Show in a new, unnamed top-level window.
+ * <li><i>name</i> - Show in the frame or window named <i>name</i>. If a target
+ * named <i>name</i> does not already exist, a new top-level window with the
+ * specified name is created, and the document is shown there.</li>
+ * </ul>
+ * See also:
+ * {@link java.applet.AppletContext#showDocument(java.net.URL, java.lang.String)}
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>afterUploadURL</td>
+ * <td><i>null</i><br>
+ * since 2.9.0<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter is used by all policies. It allows the applet to change
+ * the current page to another one after a successful upload. <br>
+ * This allows, for instance, to display a page containing the file description
+ * of the newly uploaded page. Since version 3.0.2b2, you can specify a
+ * JavaScript expression instead of a plain URL. So afterUploadURL can now
+ * contain:<br>
+ * <UL>
+ * <LI><B>A javascript expression</B>: The URL must start by <I>javascript:</I>.
+ * See below for details.</LI>
+ * <LI><B>A http URL</B>: the navigator will open this URL, in the current page
+ * or another, according to the <I>afterUploadTarget</I> parameter. Any URL that
+ * doesn't start by <I>javascript:</I> is handled as an http URL.</LI>
+ * </UL>
+ * If the value of afterUploadURL starts with the string "javascript:", the
+ * remainder of the string is evaluated as JavaScript expression in the current
+ * document context. For example: If afterUloadURL is<br>
+ * <code>"javascript:alert('Thanks for the upload');"</code>,</br> then after a
+ * successful upload, a messagebox would pop up. Since 3.0.2b3 there are now
+ * three place holders available which can be used as parameters in function
+ * calls:
+ * <ul>
+ * <li><code>%success%</code> is replaced by <b>true</b> or <b>false</b>
+ * depending on upload success.
+ * <li><code>%msg%</code> is replaced by an unquoted string, containing the
+ * error message received from the server (if any). Inside that string, all
+ * occurrences of the single-quote character (hex 27) are quoted by backslashes.
+ * <li><code>%body%</code> is replaced by an unquoted string, containing the
+ * complete response body. Inside that string, all occurrences of the
+ * single-quote character (hex 27) are quoted by backslashes.
+ * </ul>
+ * So if you set afterUloadURL to <code>"javascript:alert('%body%');"</code>,
+ * then the resulting message box will show the body content of the last server
+ * response.</td>
+ * </tr>
+ * <tr>
+ * <td>albumId</td>
+ * <td>-1 <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}</td>
+ * <td>This parameter is only used by CoppermineUploadPolicy. So it is to be
+ * used to upload into a <a href="http://coppermine.sourceforge.net/">coppermine
+ * picture gallery</a>. This parameter contains the identifier of the album,
+ * where pictures should be used. See CoppermineUploadPolicy for an example. <br>
+ * Before upload, CoppermineUploadPolicy.
+ * {@link wjhk.jupload2.policies.CoppermineUploadPolicy#beforeUpload()} checks
+ * that the albumId is correct, that is: >=1.</td>
+ * </tr>
+ * <tr>
+ * <td>allowedFileExtensions</td>
+ * <td><i>empty string</i><br>
+ * since 2.9.0<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter allows the caller to specify a list of file extension. If
+ * this parameter is specified, only file with this extension can be selected in
+ * the applet.<br>
+ * This parameter must contains a list of extensions, in lower case, separated
+ * by slashes. eg: jpg/jpeg/gif</td>
+ * </tr>
+ * <tr>
+ * <td>allowHttpPersistent</td>
+ * <td><i>false</i><br>
+ * since 3.0.0rc1<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter allows to switch off persistent HTTP connections which are
+ * enabled by default (and the protocol version allows it). Currently, we
+ * encountered problems with persistent connections when testing on a windows
+ * box using a loopback interface only. <BR>
+ * Note: default value changed to false in 4.0 version.</td>
+ * </tr>
+ * <tr>
+ * <td>browsingDirectory</td>
+ * <td><i>null</i><br>
+ * since 4.0.0b2<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter allows to control the starting browsing directory, that
+ * is, the directory the is the current one when the file chooser is open.<BR>
+ * <U>Notes:</U> <DIR>
+ * <UL>
+ * If the directory doesn't exist, or can not be read, a warning is written on
+ * the local log window (visible only in debug mode), and this parameter is
+ * ignored.
+ * <UL>
+ * This directory may begin with ~/ or ~\, to have a path set relative to the
+ * current user's home.</DIR>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>debugLevel</td>
+ * <td>0 <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>With 0, you get the normal production output. The higher the number is,
+ * the more information is displayed in the log window. Here are some hints
+ * about debug level values (please note that this is indicative ... including
+ * for me, as I'me writing this during 3.3.2 release: <DIR>
+ * <LI>0: No debug output. Only INFO and ERROR
+ * <LI>10: Structural debug output (entering method, exception info...)
+ * <LI>30: Details about method parameters
+ * <LI>50: Details about internal method variables.
+ * <LI>70: Details about encoding toward the server
+ * <LI>80: Details about server's response
+ * <LI>90: Details about query and server response when sending debug output to
+ * urlToSendErrorTo
+ * <LI>100: Maximum output information level. The redirection toward
+ * afterUploadURL is blocked
+ * <LI>>100: Additional things for internal debug, like some wait in the code to
+ * check what messages the applet displays, while uploading small files on
+ * localhost.</DIR> <br>
+ * Note: All debug messages are stored in a temporary log file. This can be used
+ * to display more information, if needed. See also the <I>urlToSendErrorTo</I>
+ * applet parameter.</td>
+ * </tr>
+ * <tr>
+ * <td>fileChooserIconFromFileContent</td>
+ * <td><i>0</i><br>
+ * since 3.1.0b<br>
+ * {@link wjhk.jupload2.policies.UploadPolicy}</td>
+ * <td>This parameter allows to control whether the file icons in the file
+ * chooser are calculated from the file content. This is currently only
+ * available for pictures.<BR>
+ * If activated, the file chooser will open each pictures, and calculate the
+ * icon by resizing the picture. This is done in by using thread of minimam
+ * priority, to minimize performances impact on the navigator. Available values
+ * are: <DIR>
+ * <LI>-1: disabled. The default system are used.
+ * <LI>0 (default): available only in picture mode. That is: the current upload
+ * policy is an instance of or a class inheriting from
+ * {@link PictureUploadPolicy}
+ * <LI>1: available for all upload policies. </DIR></td>
+ * </tr>
+ * <tr>
+ * <td>fileChooserIconSize</td>
+ * <td><i>20</i><br>
+ * since 3.1.0b<br>
+ * {@link wjhk.jupload2.policies.UploadPolicy}</td>
+ * <td>This parameter allows to control the size of icons, in pixels, in the
+ * file chooser. Used only when fileChooserIconFromFileContent is activated.<BR>
+ * Note: The standard icon size is a value of 20. With 50, you'll get a better
+ * view of the picture.</td>
+ * </tr>
+ * <tr>
+ * <td>fileChooserImagePreview</td>
+ * <td><i>true</i><br>
+ * since 3.1.0b<br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameter allows to control whether an preview is available for
+ * picture in the file chooser. If activated, the file chooser will open the
+ * preview in a separate thread, of high priority. This avoid blocking the
+ * applet while calculating the preview picture, when the user just
+ * double-clicked a picture file. This parameter is ignored for
+ * DefaultUploadPolicy.
+ * </tr>
+ * <tr>
+ * <tr>
+ * <td>fileFilterName</td>
+ * <td><i>null</i><br>
+ * since 5.0.0</td>
+ * Contains the name of the file filter, as it will be displayed in the drop
+ * down list of filters, in the file chooser. If this name is given to the
+ * applet, it will be returned by the {@link FileFilter#getDescription()}
+ * method. <BR>
+ * Default value for applet parameter "fileFilterName". This default value let
+ * the {@link DefaultUploadPolicy} return a calculated name, which contains the
+ * list of allowed file extensions.<BR>
+ * Note: this parameter is ignored, if there is no file filter, that is, if the
+ * allowedFileExtensions applet parameter is not used.
+ * <td>
+ * </tr>
+ * <tr>
+ * <td><s>filenameEncoding</s></td>
+ * <td><S><i>null</i></S><br>
+ * <br>
+ * <S>{@link wjhk.jupload2.policies.DefaultUploadPolicy}</S></td>
+ * <td>Since 3.3.0, this parameter is no more used. The full applet upload HTTP
+ * request to the server is now correctly encoded.<BR>
+ * <S>With null, the filename in the <i>Content-Disposition</i> header is not
+ * encoded. If not null, the applet tries to encode this filename with the given
+ * encoding. It's up to the receiver (the web site) to decode this encoding (see
+ * {@link #getUploadFilename(FileData, int)}. <br>
+ * Example: if the "UTF8" encoding is chosen, the PHP function urldecode can be
+ * used to decode the filename. </S></td>
+ * </tr>
+ * <tr>
+ * <tr>
+ * <td>formdata</td>
+ * <td><i>null</i><br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
+ * <i>Since 2.9.2rc4</i></td>
+ * <td>With this parameter, the name of a HTML form can be specified. If the
+ * specified form exists in the same document like the applet, all all
+ * form-variables are added as POST parameters to the applet's POST request.<BR>
+ * <B>Note:</B> Whatever value is in the <U>httpUploadParameterType</U> applet
+ * parameter, these parameters with the name of the given input in the form.
+ * That is: if you have an input text named 'myText', there will be one myText
+ * parameter in the HTTP upload request, with the text/plain mime type, and
+ * whose value is the content of this field, in the form.</td>
+ * </tr>
+ * <tr>
+ * <td>ftpCreateDirectoryStructure</td>
+ * <td><i>false</i><br>
+ * since 4.2.0<br>
+ * {@link wjhk.jupload2.policies.UploadPolicy}</td>
+ * <td>This parameter allows to control whether the directory structure on the
+ * client side must be created on the server side.<BR>
+ * Example: if the user upload the test/ directory, which contains the
+ * readme.txt file. With <I>ftpCreateDirectoryStructure</I> to false (or default
+ * value), the readme.txt is uploaded in the postURL directory. If set to true,
+ * the test/ folder is created as a subfolder of the path given in the postURL
+ * directory, and the readme.txt is uploaded in this subfolder.<BR>
+ * Note: in HTTP upload, the pathinfo and relpathinfo allows the server side
+ * script to manage this directory structure.</td>
+ * </tr>
+ * <tr>
+ * <td>ftpTransfertBinary</td>
+ * <td><i>true</i><br>
+ * since 4.1.0<br>
+ * {@link wjhk.jupload2.policies.UploadPolicy}</td>
+ * <td>This parameter allows to control whether the upload should be done in
+ * binary or ascii mode. Default is to upload in binary mode.</td>
+ * </tr>
+ * <tr>
+ * <td>ftpTransfertPassive</td>
+ * <td><i>true</i><br>
+ * since 4.1.0<br>
+ * {@link wjhk.jupload2.policies.UploadPolicy}</td>
+ * <td>This parameter allows to control whether the upload should be done in FTP
+ * passive mode, or in active mode (where the FTP server opens a connection to
+ * the client, to do the upload). Default passive mode.</td>
+ * </tr>
+ * <tr>
+ * <td>highQualityPreview</td>
+ * <td>false<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>If this parameter is set to <i>true</i>, the applet will call the
+ * BufferedImage.getScaledInstance(), instead of doing a basic scale
+ * transformation. This consume more CPU: on a PII 500MHz, the full screen go
+ * from around 5 seconds to between 12 and 20 seconds, for a picture created by
+ * my EOS20D (8,5M pixels). The standard preview (above the file list) seem to
+ * be displayed at the same speed, whatever is the value of this parameter. <br>
+ * Note: when resizing is done before upload, the
+ * BufferedImage.getScaledInstance() is always called, so that the uploaded
+ * picture is of the best available quality.</td>
+ * </tr>
+ * <tr>
+ * <td>httpUploadParameterName</td>
+ * <td>File<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<BR>
+ * since 4.5.0</td>
+ * <td>Contains the parameter name, that will be used to send the file in the
+ * HTTP upload request. The default value (File), associated with the default
+ * value for httpUploadParameterType (see below), makes all file be uploaded
+ * with name from File0 to FileN (when there are N+1 file to upload).<BR>
+ * Put another value, of your server part script need a particular parameter
+ * name to work properly.<BR>
+ * Note: valid characters for this parameter are: first letter (letter or
+ * number), next letters (letter, number or underscore)</td>
+ * </tr>
+ * <tr>
+ * <td>httpUploadParameterType</td>
+ * <td>iteration<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<BR>
+ * since 4.5.0</td>
+ * <td>Allowed values are: <DIR>
+ * <LI><B>iteration</B>: Used to have the attribute property that actually
+ * contains the file be named File0 to FileN (if you have N+1 uploaded files).
+ * This is the default behavior. In this case, your server script should look
+ * for POST properties, named 'File0' to 'FileN'</LI>
+ * <LI><B>array</B>: Used if your server script want to receive one array, that
+ * will contain all uploaded files.</LI>
+ * <LI><B>oneFile</B>: Indicates that, in the HTTP upload request, there will be
+ * only one file. This value is only valid when nbFilesPerRequest is 1. The
+ * parameters in the HTTP upload request are let untransformed. For instance, if
+ * httpUploadParameterName is the default value (File), the file content will be
+ * loaded under the HTTP parameter 'File' (not File0 or File[]).</LI></DIR><BR>
+ * <B>Note:</B> All parameters common to all pictures are sent directly. For
+ * instance, if toto is given on the URL, the toto parameter is sent as is (no
+ * toto0 for iteration or toto[] for array). Also, if you use the
+ * <U>formdata</U> applet parameter, these parameters are sent as is (no 0 or []
+ * added to the parameter name).</td>
+ * </tr>
+ * <tr>
+ * <td>keepOriginalFileExtensionForConvertedImages</td>
+ * <td><i>false</i></td>
+ * <td>is only relevant, if targetPictureFormat is specified.<br />
+ * <ul>
+ * <li>false (default): <br />
+ * If you upload the file 'test.png' and it is converted to 'jpg', the
+ * fileextension will be changed, so that the server will receive this filename:
+ * 'test.jpg'</li>
+ * <li>true: <br />
+ * If you upload the file 'test.png' and it is converted to 'jpg', the
+ * fileextension will NOT be changed, so that the server will receive the
+ * original filename: 'test.png'</li>
+ * </ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>lang</td>
+ * <td>Navigator language <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>Should be something like <i>en</i>, <i>fr</i>... Currently only French
+ * and English are known from the applet. If anyone want to add another language
+ * ... Please translate the wjhk.jupload2.lang.lang_en, and send it back to
+ * <mailto:etienne_sf@sourceforge.net">.</td>
+ * </tr>
+ * <tr>
+ * <td>lookAndFeel <br>
+ * since 2.5</td>
+ * <td><i>empty</i><br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This allows to control the look &amp; feel of the applet. The authorized
+ * values are:
+ * <ul>
+ * <li><i>empty</i>: uses the default look &amp; feel. This is the same as java.
+ * <li>java: uses the java default look &amp; feel. Same as <i>empty</i>.
+ * <li>system: uses the current system look and feel. The call will be : <br>
+ * UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+ * <li>Any valid String argument for UIManager.setLookAndFeel(String).
+ * </ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>maxChunkSize<br>
+ * Since 2.7.1</td>
+ * <td>0<br>
+ * <i>Long.MAX_VALUE</i><br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameters defines the maximum size of an upload.
+ * <ul>
+ * <li>If not set, or set to a value of 0 or less, the chunk mode is disabled.
+ * That is: each file will be uploaded within being split in pieces.
+ * <li>If set to a value of 1 or more, the upload size will be never be more
+ * than maxChunkSize. A file bigger will be split in several part of
+ * <i>maxChunkSize</i> size, then the last part will contain the remaining, and
+ * will probably be smaller than <i>maxChunkSize</i>.
+ * </ul>
+ * <br>
+ * <b>How to build the server part:</b> the server will have to 'guess' that the
+ * file is split, and then it will have to reconstruct the uploaded file. Here
+ * are the necessary informations:
+ * <ul>
+ * <li>When a file is chunked, the <i>jupart</i> and <i>jufinal</i> parameter
+ * are given in the URL (get parameters). This identify a chunk upload. If these
+ * parameters are not given, the file(s) is(are) uploaded in one piece.
+ * <li><i>jupart</i> identify the part number: from 1 to N for a file being
+ * split in N pieces. The N-1 chunks should be <i>maxChunkSize</i> bytes long.
+ * The last one contains the remaining of the file.
+ * <li><i>jufinal</i> is set to 0 for chunks from 1 to N-1. It is is set to 1
+ * only for the last chunk (N, in this 'example').
+ * <li>The uploaded filename is not modified when the upload is chunked.
+ * Example: upload of the file <i>bigPicture.jpeg</i>, of 4,5 Mb, with chunk of
+ * 2Mb. The upload is split in three chunk. Chunk 1 and 2 are 2Mb long. The
+ * third one is 0,5Mb long. The uploaded filename for these three uploads is
+ * <i>bigPicture.jpeg</i>. It's up to the server part to read the <i>jupart</i>
+ * and <i>jufinal</i> get parameters, to understand that the upload is chunked.
+ * <li><b>Important:</b> The server script <u>must</u> check the resulting
+ * filesize. If not, the client can send a file of any size, and fill the server
+ * hard drive.
+ * <li>The wwwroot/pages/parseRequest.jsp is a java example of a server page
+ * that can receive chunk upload. It stores each chunk is <i>filename.partN</i>
+ * (where N is the chunk number), then construct the final file, by
+ * concatenating all parts together.
+ * </ul>
+ * <b>Note: </b> If nbFilesPerRequest is different than 1, the applet will try
+ * to upload the files until the sum of their content length is less than
+ * maxChunkSize. The upload is triggered just before the sum of their content
+ * length is bigger then maxChunkSize.<br>
+ * If one file is bigger than <i>maxChunkSize</i>, all previous files are
+ * uploaded (at once or not, depending on nbFilesPerRequest). Then the 'big'
+ * file is uploaded alone, split in chunk. Then upload goes on, file by file or
+ * not, depending on <i>nbFilesPerRequest</i>.</td>
+ * </tr>
+ * <tr>
+ * <td>maxFileSize<br>
+ * Since 2.7.1</td>
+ * <td>0<br>
+ * <i>Long.MAX_VALUE</i><br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter identify the maximum size that an uploaded file may have.
+ * It prevent the user to upload too big files. It is especially important when
+ * chunk upload is activated (see below <i>maxChunkSize</i>).
+ * <ul>
+ * <li>If <i>maxChunkSize</i> is not set, negative or 0, <i>maxFileSize</i>
+ * should be the maximum upload size of the server. In this case, it is useful
+ * only to display a message when the user select a file that will be refused by
+ * the server.
+ * <li>If chunk upload is activated, this parameter becomes really important: in
+ * this case the maximum file size of an uploaded file is ... the available
+ * space on the server hard drive! (see below, <i>maxChunkSize</i>).
+ * </ul>
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>maxPicHeight</td>
+ * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
+ * (was -1)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameters allows the HTML page to control the maximum height for
+ * pictures. If a picture is to be download, and its height is bigger, the
+ * picture will be resized. The proportion between width and height of the
+ * resized picture are the same as those of the original picture. If both
+ * maxPicHeight and maxPicWidth are given, it can happen that the resized
+ * picture has a height lesser than maxPicHeight, so that width is no more than
+ * maxPicWidth. <br>
+ * <b>Precisions:</b> <br>
+ * If this parameter value is negative or 0, then no control is done on the
+ * picture height. <br>
+ * If the original picture is smaller than the maximum size, the picture is not
+ * enlarged. <br>
+ * If the picture is resized, its other characteristics are kept (number of
+ * colors, ColorModel...). The picture format is kept, if targetPictureFormat is
+ * empty. If the picture format is a destructive (like jpeg), the maximum
+ * available quality is chosen. <br>
+ * <i>See also maxPicWidth, realMaxPicHeight</i></td>
+ * </tr>
+ * <tr>
+ * <td>maxPicWidth</td>
+ * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
+ * (was -1)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>Same as maxPicHeight, but for the maximum width of the uploaded picture.
+ * <br>
+ * <i>See also maxPicHeight, realMaxPicWidth</i></td>
+ * </tr>
+ * <tr>
+ * <td>nbFilesPerRequest</td>
+ * <td>1 since 4.3.0 <BR>
+ * (was -1) <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This allows the control of the maximal number of files that are uploaded
+ * in one HTTP upload to the server. <br>
+ * If set to less than 1 (0 or negative), there is no maximum. This means that all files are uploaded in
+ * the same HTTP request. <br>
+ * If set to 5, for instance, and there are 6 files to upload, there will be two
+ * HTTP upload request to the server : 5 files in the first one, and that last
+ * file in a second HTTP request.</td>
+ * </tr>
+ * <tr>
+ * <td>pictureCompressionQuality</td>
+ * <td><i>0.8</i><br>
+ * since 3.1.0<br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameter controls the picture compression quality, when writing the
+ * picture file. 1 means high quality picture, but big files. 0 means poor
+ * quality pictures, but small files. 0.8 is a good compromise for the web.<br>
+ * It is different from the highQualityPreview, which controls the way picture
+ * are resized in memory.<br>
+ * This parameter is currently applied only to jpg (and jpeg) pictures.</td>
+ * </tr>
+ * <tr>
+ * <td>pictureTransmitMetadata</td>
+ * <td><i>false since 3.3.0<br>
+ * (was true before)</i><br>
+ * since 3.2.0<br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameter controls whether the applet transmit metadata of the
+ * original picture. This may prevent personal information to be thrown on the
+ * net.<br>
+ * Note 1: This parameter is especially important for picture coming from the
+ * Canon EOS 20D, 30D and 40D: pictures shooted in portrait mode contain
+ * metadata that are incompatible with Java 1.6.0_3! The colors of transformed
+ * pictures become strange... <B>Since 3.3.0: default to false</B>, to avoid
+ * this annonying (and currently not explained) problem.<br>
+ * Note 2: <Caution> As of 3.2.0, this parameter blocks metadata only for
+ * pictures that are updated by the applet. Metadata from picture transmitted
+ * 'as is' are not removed. This is corrected in 3.3.0.</td>
+ * </tr>
+ * <tr>
+ * <td>postURL</td>
+ * <td>null since 1.9.2rc4, (was <i>Mandatory</i> before)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter specifies the target URL toward which the files should be
+ * uploaded. Since version 1.9.2rc4 this parameter is not mandatory anymore.
+ * Instead, if omitted or a <i>relative</i> URL is given, the resulting URL is
+ * constructed from the applet's DocumentBaseURL. This means, that if the applet
+ * tag is dynamically constructed from a PHP script without specifying
+ * <code>postURL</code>, the <i>same</i> same script receives the subsequent
+ * POST request(s). If this URL may change during the applet execution time, you
+ * can call the setProperty applet method from javascript, or create a new
+ * UploadPolicy class and either :
+ * <ul>
+ * <li>Override the {@link wjhk.jupload2.policies.UploadPolicy#getPostURL()}
+ * method, to make the postURL totaly dynamic.
+ * <li>Override the
+ * {@link wjhk.jupload2.policies.UploadPolicy#setPostURL(String)} method, to
+ * modify the postURL on the fly, when it is changed.
+ * <li>Override the
+ * {@link wjhk.jupload2.policies.UploadPolicy#setProperty(String, String)}
+ * method. The {@link wjhk.jupload2.policies.CoppermineUploadPolicy} changes the
+ * postURL when the albumID property changes.
+ * <li>Find another solution ...
+ * </ul>
+ * <u>Note 1:</u> in HTTP, the upload is done in the same user session, as the
+ * applet uses the cookies from the navigator. This allows right management
+ * during upload, on the server side.<br>
+ * <u>Note 2:</u> in FTP, you can't use path that contain spaces. Filename may
+ * contain spaces. <u>Note 5:</u> in HTTP, the applet use the current Java
+ * parameter to connect to the host. By default, this configuration is to use
+ * the navigator configuration. So, if a proxy is configured in the navigator
+ * network configuration, the applet should use it automatically.<br>
+ * <u>Note 3:</u> FTP URL should looks like:
+ * ftp://username:password@myhost.com:21/directory<br>
+ * <u>Note 4:</u> in FTP, you'll have to add the jakarta-commons-oro.jar and
+ * jakarta-commons-net.jar jar files in the applet ARCHIVE tag attribute. See
+ * the 'advanced_js_demo.html page for a sample. You'll have to put the two
+ * files coming from the JUpload distribution in the same directory as the
+ * wjhk.jupload.jar. <br>
+ * <u>Note 5:</u> in FTP, you can use the user default folder by putting no
+ * folder. The URL can be: ftp://user:mdp@host</td>
+ * <u>Note 6 (security):</u> take care that the full URL is visible, if the user
+ * take a look at the page source. So, you should take care when putting login
+ * and password there. </td>
+ * </tr>
+ * <tr>
+ * <td>readCookieFromNavigator</td>
+ * <td>Since 4.3.0: Boolean<BR>
+ * (true)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
+ * <i>Since v2.8.1</i></td>
+ * <td>If true (default), the applet read cookies from the navigator, with the
+ * javascript document.cookie value. If false, the caller should put the
+ * relevant 'Cookie' header in the specificHeaders applet parameter. This allows
+ * to override any javascript cookie access restriction.</td>
+ * </tr>
+ * <td>readUserAgentFromNavigator</td>
+ * <td>Since 4.6.1rc2: Boolean<BR>
+ * (true)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
+ * </td>
+ * <td>If true (default), the applet read the userAgent from the navigator, with
+ * the javascript document.userAgent value. If false, the caller can put the
+ * relevant userAgent header in the specificHeaders applet parameter.</td> </tr>
+ * <tr>
+ * <td>realMaxPicHeight</td>
+ * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
+ * (was -1)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}<br>
+ * <i>Since v2.8.1</i></td>
+ * <td>This parameters is about the same as maxPicHeight. It overrides it for
+ * pictures that must be transformed (currentlty only when the picture is
+ * rotated). <br>
+ * The aim of this parameter, is to prevent the applet to resize picture, and
+ * let the server do it: it will be much quicker. <br>
+ * This allows you to:
+ * <ul>
+ * <li>Put a 'big' <i>maxPicHeight</i> (or don't provide the parameter in the
+ * APPLET tag), and let the server resize the picture according to the real
+ * maxPicHeight. The <i>maxPicHeight</i> will be used when the picture is not
+ * tranformed by the user.
+ * <li>Put this realMaxHeight to the real configured maxPicHeight. The applet
+ * will then directly produce the final file, when it has to tranform the
+ * picture (picture rotation, for instance).
+ * </ul>
+ * <br>
+ * <i>See also maxPicHeight, realMaxPicWidth, maxChunkSize (to override any
+ * server upload size limitation).</i></td>
+ * </tr>
+ * <tr>
+ * <td>realMaxPicWidth</td>
+ * <td>Since 3.3.0: Integer.MAX_VALUE<BR>
+ * (was -1)<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}<br>
+ * <i>Since v2.8.1</i></td>
+ * <td>Same as realMaxPicHeight, but for the maximum width of uploaded picture
+ * that must be transformed. <br>
+ * <i>See also maxPicWidth, realMaxPicHeight</i></td>
+ * </tr>
+ * <tr>
+ * <td>retryMaxNumberOf</td>
+ * <td>1<BR>
+ * <i>Since 5.0.0</i></td>
+ * <td>Maximum number of retries, that the applet will do, for upload resumable
+ * error. A 'upload resumable error', is typically a network error. The default
+ * value is 0, to maintain the same behaviour as before.<BR>
+ * This maximum of allowed retries is for each packet, that is: if one packet
+ * fails two times, and succeed in the third attempt, the next packet will still
+ * have up to retryMaxNumberOf retries. For instance, the default value (1),
+ * means that the applet will do a one new attempt after a first upload error,
+ * for each packet.</td>
+ * </tr>
+ * <tr>
+ * <td>retryNbSecondsBetween</td>
+ * <td>30<BR>
+ * <i>Since 5.0.0</i></td>
+ * <td>The number of seconds, to wait, before trying a new upload of a packet
+ * whose upload was in error. This is used if <I>retryMaxNumberOf</I> is 1 or
+ * more, and if 'resumable upload error' occurs.</td>
+ * </tr>
+ * <tr>
+ * <td>serverProtocol</td>
+ * <td>null since 2.9.2rc4<br>
+ * (before: "HTTP/1.1")<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter allows the control of the protocol toward the server. It
+ * can be HTTP/0.9 (not tested), HTTP/1.0, HTTP/1.1 and FTP. HTTP supports
+ * https. Since version 2.9.2rc4, the default is <i>null</i>, introducing a new
+ * facility of automatically adjusting the protocol according to the server
+ * response.<br>
+ * This parameter is really useful only in
+ * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}, as the coppermine
+ * application also controls that the requests send within an HTTP session uses
+ * the same HTTP protocol (as a protection to limit the 'steal' of session
+ * cookies).</td>
+ * </tr>
+ * <tr>
+ * <td>sendMD5Sum</td>
+ * <td>false<BR>
+ * since 5.0.0<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter indicates whether the applet will send the MD5Sum for
+ * uploaded files, or not. If set to true, the MD5Sum is sent in the
+ * <I>md5sum</I> HTTP POST argument.</td>
+ * </tr>
+ * <tr>
+ * <td>showLogWindow<br>
+ * Since 3.0.2<br>
+ * Changed in 3.5.0</td>
+ * <td>true<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter was formerly known as <i>showStatusBar</i> which now has a
+ * different purpose. <BR>
+ * <U>Since 3.5.0:</U> Available values are (case sensitive):<DIR>
+ * <LI>true: always visible.
+ * <LI>false: always hiden.
+ * <LI>onError: the log window is hidden. It will be displayed when an error
+ * occurs. If you put 99 into the debugLevel, then the full debugOutput become
+ * visible if and only if an error occurs</DIR> <BR>
+ * <U>Until 3.4.2</U>, it works this way: If given with the <i>False</i> value,
+ * the log window will be hidden. The applet will still store all debug
+ * information in it. But the user won't see it any more. If a problem occurs,
+ * the <i>urlToSendErrorTo</i> can still be used to log all available
+ * information.</td>
+ * </tr>
+ * <tr>
+ * <td>showStatusBar</td>
+ * <td>True<br>
+ * <br>
+ * New meaning since 3.0.2<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This parameter controls if the status bar is shown in the applet. If
+ * shown, the stausbar provides information about the current transfer speed and
+ * estimated time of completion. Before version 3.0.2, this parameter was used
+ * to control visibility of the log window. This is now controlled by
+ * <i>showLogWindow</i>.</td>
+ * </tr>
+ * <tr>
+ * <td>specificHeaders</td>
+ * <td><I>null</I><br>
+ * <br>
+ * Since 3.0.2<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>Allows the caller to add any header(s) to the applet. These headers will
+ * be sent with each HTTP request to the server. If you put several lines in
+ * this parameter, these parameter should be separated by the "&#92;n" string
+ * (not the LineFeed character, but the antislash character followed by the n
+ * character, like msg="&#92;&#92;n";). No "&#92;n" at the end: it will be added
+ * by the applet. In PHP, put '&#92;n', and not "&#92;n" (See PHP doc, on
+ * strings)<BR>
+ * This allows an easy management of <B>Basic HTTP authentication</B>. Just add
+ * a header like this one:<BR>
+ * Authorization: Basic Base64EncodedString Where Base64EncodedString is the
+ * string "login:passord" encoded in Base 64.</td>
+ * </tr>
+ * <tr>
+ * <td>sslVerifyCert<br>
+ * Since 3.0.2b1</td>
+ * <td>none<br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>With this parameter, the handling of certificates when using SSL can be
+ * configured. There are 4 possible settings:<br>
+ * <ul>
+ * <li><i>none</i> (default): Any server cert is accepted, no cert-based client
+ * authentication is performed.</li>
+ * <li><i>server</i>: The server cert is verified against the local truststore
+ * and if that fails, a dialog pops up which asks the user if the certificate
+ * shall be accepted permanently, just for the current session or not at all
+ * (Just like any browser would do).</li>
+ * <li><i>client</i>: A user-certificate (which must be available in the local
+ * keystore) is used to perform client authentication.</li>
+ * <li><i>strict</i>: The combination of <i>client</i> and <i>server</i>.</li>
+ * </ul>
+ * <p>
+ * The location of the local truststore and keystore uses the normal JRE
+ * conventions. This means, that the system truststore is used for verifying
+ * server certs (usually in $JAVA_HOME/lib/security/cacerts) unless either the
+ * system property <i>javax.net.ssl.trusStore</i> specifies another location or
+ * a file <b>.truststore</b> exists in the user's home directory. If the user
+ * decides to permanently accept an untrusted certificate, the file
+ * <b>.truststore</b> in the user's home directory is written. The default
+ * keystore (for client certificates) is the file <b>.keystore</b> in the user's
+ * home directory. This can be overridden by setting the system property
+ * <i>javax.net.ssl.keyStore</i>. If the name of the keystore ends in
+ * <b>.p12</b>, it is assumed that the keystore is in <b>PKCS12</b> format,
+ * otherwise the default format as specified in the JRE security-configuration
+ * is used.
+ * <p>
+ * <b>Important Note about client authentication:</b>
+ * <p>
+ * At the time of this writing, a <i>serious</i> bug exists in apache 2.0.x
+ * which prevents POST requests when SSL renegotiation is about to happen.
+ * Renegotiation is triggered by a location-based (or directory-based) change of
+ * the SSLVerifyClient directive in apache. Therefore you <b>can not</b> protect
+ * a sub-area of an otherwise unprotected SSL server. You can circumvent that by
+ * setting up a virtualhost which is configured to perform SSL client
+ * verification <b>for the complete virtualhost</b>. Attached to the bug report
+ * at <a href="http://issues.apache.org/bugzilla/show_bug.cgi?id=12355">ASF
+ * Bugzilla</a>, there are several patches which claim to fix the problem.
+ * However in that same report, other users complain about those patches to be
+ * ineffective. Therefore, the author recommends avoiding re-negotiation
+ * alltogether by using the virtualhost aproach described above. It is the
+ * understanding of the author, that this bug has been fixed for apache 2.2,
+ * however the author did not verify that. Test-Reports from users running
+ * apache 2.2 are welcome.
+ * </td>
+ * </tr>
+ * <tr>
+ * <td>storeBufferedImage</td>
+ * <td>false <br>
+ * <I>Deprecated</I> <br>
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameter indicates that the preview image on the applet is kept in
+ * memory. It works really nice under eclise. But, once in the navigator, the
+ * applet runs very quickly out of memory. So I add a lot of calls to
+ * {@link wjhk.jupload2.filedata.PictureFileData#freeMemory(String, UploadPolicy)}
+ * , but it doesn't change anything. Be careful to this parameter, and let it to
+ * the default value, unless you've well tested it under all your target client
+ * configurations. <BR>
+ * <I>This parameter will probably never be correctly implemented.</I></td>
+ * </tr>
+ * <tr>
+ * <td>stringUploadError</td>
+ * <td>Since 3.2.0: "^ERROR: (.*)$" for all upload policies<br>
+ * Empty string ("") [if using DefaultUploadPolicy]<br>
+ * "ERROR: (.*)" [if using CopperminUploadPolicy]<br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
+ * Since 2.9.2rc4</td>
+ * <td>This string is a regular expression. It allows the applet to test that
+ * the server has detected an error in the upload. If this parameter is given to
+ * the applet, the upload thread will try to match this regular expression
+ * against each line of the server response <b>body</b>. If a group is found, it
+ * is considered as the error message, and will be displayed to the user.<br>
+ * If the match is successfull once, the upload is considered to have failed.
+ * and {@link wjhk.jupload2.exception.JUploadExceptionUploadFailed} is thrown.
+ * If the expression contains a hunt-group, the matching contents of that group
+ * is reported to the user. For example: If let the default value "^ERROR:
+ * (.*)$" here, the applet will find an error if at least one line returned in
+ * the server response begins with "ERROR: ". Then, all characters that follow
+ * are extracted as the error message. So, if the server response contains the
+ * line "ERROR: md5sum check failed", the string "md5sum check failed" is used
+ * for the exception message. But if it returns a line "maybe ERROR: is it an
+ * error?", then the applet won't find any error in the server response. <BR>
+ * <B>Note:</B> you can put line breaks in the error message. The message must
+ * be in one line in the HTTP response. To display a line break to the user,
+ * just put the two characters \n in the http response (would be a "\\n" in java
+ * or PHP).</td>
+ * </tr>
+ * <tr>
+ * <td>stringUploadSuccess</td>
+ * <td>"^SUCCESS$"<br>
+ * empty string ("") since 2.9.0<br>
+ * (was ".* 200 OK$" before) <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>This string is a regular expression. It allows the applet to test that
+ * the server has accepted the upload. If this parameter is given to the applet,
+ * the upload thread will try to match this regular expression against each
+ * lines returned from the server.<br>
+ * If the match is successfull once, the upload is considered to be a success.
+ * If not, a {@link wjhk.jupload2.exception.JUploadExceptionUploadFailed} is
+ * thrown. <br>
+ * The default test expression testes that the web server returns no HTTP error:
+ * 200 is the return code for a successfull HTTP request. It actually means that
+ * postURL is a valid URL, and that the applet was able to send a request to
+ * this URL: there should be no problem with the network configuration, like
+ * proxy, password proxy...). <br>
+ * <b>But</b> it doesn't mean that the uploaded files have correctly be managed
+ * by the server. For instance, the URL can be http://sourceforge.net, which, of
+ * course, would not take your files into account. <br>
+ * So, as soon as you know a regular expression that test the return from the
+ * target application (and not just a techical HTTP response code), change the
+ * stringUploadSuccess to this value. For instance, the default value will be
+ * matched if the HTTP body content of the server response contains one line
+ * that is exactly 'SUCCESS', without any other character. This 'success' means
+ * that the pictures have correctly uploaded to the server, and that he
+ * successfully managed the uploaded files.</td>
+ * </tr>
+ * <tr>
+ * <td>stringUploadWarning</td>
+ * <td>"^WARNING: (.*)$" <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}<br>
+ * Since 3.4.2</td>
+ * <td>This string is a regular expression. It allows the applet to test that
+ * the server has detected a warning was generated by the server. This warning
+ * is just a warning, that will be displayed to the user, as is. There may be
+ * several warnings in the server return. If one or more warning is/are
+ * received, the message(s) will be displayed to the user.<BR>
+ * If the expression contains a hunt-group, the matching contents of that group
+ * is reported to the user. For example: If you let the default value "^WARNING:
+ * (.*)$" here, the applet will find an error if at least one line returned in
+ * the server response begins with "WARNING: ". Then, all characters that follow
+ * are extracted as the error message. So, if the server response contains the
+ * line "WARNING: Bad encoding", the string "Bad encoding" is displayed as
+ * warning message to the user. But if it returns a line "maybe WARNING: is it
+ * an error?", then the applet won't find any warning in the server response.<BR>
+ * <B>Notes:</B> <DIR>
+ * <LI>There is no link between these warning and the fact the upload is
+ * considered to be a success or not. Upload success is only based on the
+ * success and error string. See the <B>stringUploadSuccess</B> and
+ * <B>stringUploadError</B> applet parameters, here above.
+ * <LI>You can put line breaks in the error message. The message must be in one
+ * line in the HTTP response. To display a line break to the user, just put the
+ * two characters \n in the http response (would be a "\\n" in java or PHP).
+ * </DIR></td>
+ * </tr>
+ * <tr>
+ * <td>targetPictureFormat</td>
+ * <td><i>Empty String</i><br />
+ * {@link wjhk.jupload2.policies.PictureUploadPolicy}</td>
+ * <td>This parameter can contain a list to convert image formats
+ * <p>
+ * Example 1:{@code "png,bmp:jpg;gif:png;"}
+ * <ul>
+ * <li>both png and bmp files will be converted to jpg,</li>
+ * <li>gif files will be converted to png</li>
+ * </ul>
+ * Example 2:{@code "jpeg,jpg:png;"}
+ * <ul>
+ * <li>both jpeg and jpg files will be converted to png,</li>
+ * </ul>
+ * </p>
+ * the value is expected to be a semi-colon separated list of relations from
+ * source-format(s) to a target format.<br />
+ * format: <code>{SOURCEFORMAT{,SOURCEFORMAT*}:TARGETFORMAT;}*</code>
+ * <ul>
+ * <li>formats can contain any picture writer known by the JVM. For instance:
+ * jpeg, png, gif. All standard formats should be available. More information
+ * can be found on the <a
+ * href="http://java.sun.com/j2se/1.4.2/docs/guide/imageio/spec/title.fm.html"
+ * >java.sun.com</a> web site.
+ * <li>SOURCEFORMAT: the source format that should be converted to the
+ * TARGETFORMAT<br />
+ * e.g. png, jpg, jpeg, ..</li>
+ * <li>TARGETFORMAT: the target format that all given SOURCEFORMAT should be
+ * converted to <br />
+ * e.g. png, jpg, jpeg, ..</li>
+ * <li>all format strings are case insensitive, so all following strings are the
+ * same:
+ * <ul>
+ * <li><code>"jpeg,jpg:png;"</code></li>
+ * <li><code>"JPEG,JPG:PNG;"</code></li>
+ * <li><code>"jPeG,JpG:pNg;"</code></li>
+ * </ul>
+ * </li>
+ * </ul>
+ * notes:
+ * <ul>
+ * <li>animated gifs will not be converted</li>
+ * <li>jpg and jpeg are distinct types.</li>
+ * <li>gifs can only be converted if the user has installed JRE >= 1.6</li>
+ * <li>the trailing semi-colon is optional</li>
+ * <li>when a file needs to be transformed, the content type will reflect the
+ * new picture format. the file extension will be changed dependant on the
+ * parameter <code>keepOriginalFileExtensionForConvertedImages</code>
+ * <ul>
+ * <li>example1:
+ * <ul>
+ * <li><code>targetPictureFormat="bmp:png;"</code></li>
+ * <li><code>keepOriginalFileExtensionForConvertedImages=false</code> (default)</li>
+ * </ul>
+ * When you upload: <code>C:\myBitmap.bmp</code>, the filename will be changed
+ * to <code>C:\myBitmap.png</code> and transferred to the server, and the
+ * content-type will be changed to "image/png"</li>
+ * <li>
+ * <li>example2:
+ * <ul>
+ * <li><code>targetPictureFormat="bmp:png;"</code></li>
+ * <li><code>keepOriginalFileExtensionForConvertedImages=true</code></li>
+ * </ul>
+ * When you upload: <code>C:\myBitmap.bmp</code>, the filename will NOT be
+ * changed and transferred to the server, but the content-type will be changed
+ * to "image/png"</li>
+ * </ul>
+ * </li>
+ * </ul>
+ * see {@link wjhk.jupload2.filedata.helper.ImageFileConversionInfo}<br />
+ * see keepOriginalFileExtensionForConvertedImages</td>
+ * </tr>
+ * <tr>
+ * <td><b>uploadPolicy</b></td>
+ * <td>DefaultUploadPolicy <br>
+ * <br>
+ * see {@link wjhk.jupload2.policies.UploadPolicyFactory}</td>
+ * <td>This parameter contains the class name for the UploadPolicy that should
+ * be used. If it is not set, or if its value is unknown from
+ * {@link wjhk.jupload2.policies.UploadPolicyFactory#getUploadPolicy(JUploadContext)}
+ * , the {@link wjhk.jupload2.policies.DefaultUploadPolicy} is used.</td>
+ * </tr>
+ * <tr>
+ * <td>urlToSendErrorTo</td>
+ * <td><i>null</i> <br>
+ * <br>
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}</td>
+ * <td>If this url is given, and an upload error occurs, the applet posts all
+ * debug output to this address. It's up to this URL to handle this message. It
+ * is possible to just store the file, or to log the error in a database, or to
+ * send a mail (like the mail.php script given with the coppermine pack). <br>
+ * <u>Notes:</u> <DIR>
+ * <LI>Only http and https URL schemes are supported.</LI>
+ * <LI>The error information is sent in a POST request sent to the given URL.
+ * These post parameters are used: description (a quick description of the
+ * error), javaError (the java output for the error, or null if no java error
+ * were caught) and debugOutput (the full debug generated by the applet).</LI>
+ * </DIR></td>
+ * </tr>
+ * </table>
+ * <h3><a name="example">HTML call example</a></h3>
+ * <p>
+ * Below, an example of how to put the applet into a PHP page is shown:
+ * </p>
+ * <code><pre>
+ *                                     &lt;applet name=&quot;JUpload&quot; code=&quot;wjhk.jupload2.JUploadApplet&quot;
+ *                                       archive=&quot;plugins/jupload/wjhk.jupload.jar&quot;
+ *                                       &lt;!-- Applet display size, on the navigator page --&gt;
+ *                                       width=&quot;500&quot; height=&quot;700&quot;
+ *                                       &lt;!-- The applet uses some javascript functions, so we must allow that : --&gt;
+ *                                       mayscript="true"&gt;
+ *                                       &lt;!-- No parameter is mandatory. We don't precise the UploadPolicy, so
+ *                                            DefaultUploadPolicy is used. The applet behaves like the original
+ *                                            JUpload. (jupload v1) --&gt;
+ *                                       &lt;param name=&quot;postURL&quot; value=&quot;http://some.host.com/youruploadpage.php&quot;&gt;
+ *                                       Java 1.5 or higher plugin required.
+ *                                     &lt;/applet&gt;
+ * </pre></code>
+ * <BR>
+ * <!-- ANT_COPYDOC_END --> <!-- ATTENTION: The previous comment is used by Ant
+ * build. DO NOT CHANGE!! -->
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1388 $
+ * @see wjhk.jupload2.policies.DefaultUploadPolicy
+ */
+
+public interface UploadPolicy {
+
+	/*
+	 * Available parameters for the applet. New parameters (for instance for new
+	 * policies) should all be added here, in alphabetic order. This ensures
+	 * that all tags are unique
+	 */
+
+	/***************************************************************************
+	 * ************************************************************************
+	 * ************************* LIST OF PROPERTIES **************************
+	 * ************************************************************************
+	 **************************************************************************/
+	/**
+	 * Parameter/Property name for URL to be loaded after an successful upload.
+	 */
+	public final static String PROP_AFTER_UPLOAD_URL = "afterUploadURL";
+
+	/**
+	 * Parameter/Property name for allowing persistent HTTP connections.
+	 */
+	public final static String PROP_ALLOW_HTTP_PERSISTENT = "allowHttpPersistent";
+
+	/**
+	 * Parameter/Property name for specifying the allowed file extensions
+	 */
+	public final static String PROP_ALLOWED_FILE_EXTENSIONS = "allowedFileExtensions";
+
+	/**
+	 * Parameter/Property name for specifying the album id
+	 */
+	public final static String PROP_ALBUM_ID = "albumId";
+
+	/**
+	 * Indicates the directory, from which the applet should open the browsing
+	 * window (file chooser) first.
+	 */
+	public final static String PROP_BROWSING_DIRECTORY = "browsingDirectory";
+
+	/**
+	 * Parameter/Property name for specifying if images should be cached in
+	 * memory. Be careful: if set to true, you'll probably have memory problems
+	 * while in a navigator.
+	 */
+	public final static String PROP_STORE_BUFFERED_IMAGE = "storeBufferedImage";
+
+	/**
+	 * Parameter/Property name for specifying the debug level
+	 */
+	public final static String PROP_DEBUG_LEVEL = "debugLevel";
+
+	/**
+	 * This parameter allows to control whether the file icons in the file
+	 * chooser are calculated from the file content. This is currently only
+	 * available for pictures.<BR>
+	 * If activated, the file chooser will open each pictures, and calculate the
+	 * icon by resizing the picture. This is done in by using thread of minimam
+	 * priority, to minimize performances impact on the navigator. Available
+	 * values are: <DIR> <LI>-1: disabled. The default system are used. <LI>0
+	 * (default): available only in picture mode. That is: the current upload
+	 * policy is an instance of or a class inheriting from
+	 * {@link PictureUploadPolicy} <LI>1: available for all upload policies.
+	 * </DIR>
+	 */
+	public final static String PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT = "fileChooserIconFromFileContent";
+
+	/**
+	 * This parameter allows to control the size of icons, in pixels, in the
+	 * file chooser. Used only when fileChooserIconFromFileContent is activated.
+	 */
+	public final static String PROP_FILE_CHOOSER_ICON_SIZE = "fileChooserIconSize";
+
+	/**
+	 * Allows control on the preview on the file chooser. Only for
+	 * {@link PictureUploadPolicy} and its inheritants.
+	 */
+	public final static String PROP_FILE_CHOOSER_IMAGE_PREVIEW = "fileChooserImagePreview";
+
+	/**
+	 * Contains the name of the file filter, as it will be displayed in the drop
+	 * down list of filters, in the file chooser. If this name is given to the
+	 * applet, it will be returned by the {@link FileFilter#getDescription()}
+	 * method.
+	 */
+	public final static String PROP_FILE_FILTER_NAME = "fileFilterName";
+
+	/**
+	 * Parameter/Property name for specifying the encoding of file names.
+	 */
+	public final static String PROP_FILENAME_ENCODING = "filenameEncoding";
+
+	/**
+	 * Parameter/Property name for specifying additional form data.
+	 */
+	public final static String PROP_FORMDATA = "formdata";
+
+	/**
+	 * Parameter/Property name to specify, when in FTP mode, if subfolders must
+	 * be created, or if all files must be uploaded on the root of postURL.
+	 */
+	public final static String PROP_FTP_CREATE_DIRECTORY_STRUCTURE = "ftpCreateDirectoryStructure";
+
+	/** FTP: binary or ascii mode */
+	public final static String PROP_FTP_TRANSFERT_BINARY = "ftpTransfertBinary";
+
+	/** FTP: passive or active mode */
+	public final static String PROP_FTP_TRANSFERT_PASSIVE = "ftpTransfertPassive";
+
+	/**
+	 * Parameter/Property name for specifying high quality previews.
+	 */
+	public final static String PROP_HIGH_QUALITY_PREVIEW = "highQualityPreview";
+
+	/**
+	 * Parameter/Property name for specifying high quality previews.
+	 */
+	public final static String PROP_HTTP_UPLOAD_PARAMETER_NAME = "httpUploadParameterName";
+
+	/**
+	 * Parameter/Property name for specifying high quality previews.
+	 */
+	public final static String PROP_HTTP_UPLOAD_PARAMETER_TYPE = "httpUploadParameterType";
+
+	/**
+	 * Parameter/Property name for specifying the UI language
+	 */
+	public final static String PROP_LANG = "lang";
+
+	/**
+	 * Parameter/Property name for specifying a list of specific headers, that
+	 * will be added to all HTTP request to the server. The parameter can be
+	 * used for Basic Authentication, by adding this header: Authorization:
+	 * Basic [Bae64 encoding of the string "user:password"]
+	 */
+	public final static String PROP_SPECIFIC_HEADERS = "specificHeaders";
+
+	/**
+	 * Parameter/Property name for specifying a PLAF class to load.
+	 */
+	public final static String PROP_LOOK_AND_FEEL = "lookAndFeel";
+
+	/**
+	 * Parameter/Property name for specifying the maximum size of a chunk of
+	 * uploaded data.
+	 */
+	public final static String PROP_MAX_CHUNK_SIZE = "maxChunkSize";
+
+	/**
+	 * Parameter/Property name for specifying the maximum size of a single file.
+	 */
+	public final static String PROP_MAX_FILE_SIZE = "maxFileSize";
+
+	/**
+	 * Parameter/Property name for specifying the maximum height of a picture.
+	 */
+	public final static String PROP_MAX_HEIGHT = "maxPicHeight";
+
+	/**
+	 * Parameter/Property name for specifying the maximum width of a picture.
+	 */
+	public final static String PROP_MAX_WIDTH = "maxPicWidth";
+
+	/**
+	 * Parameter/Property name for specifying the maximum number of file to be
+	 * uploaded in a single request.
+	 */
+	public final static String PROP_NB_FILES_PER_REQUEST = "nbFilesPerRequest";
+
+	/**
+	 * Parameter/Property name for specifying compression of the written picture
+	 * file, if any.
+	 */
+	public final static String PROP_PICTURE_COMPRESSION_QUALITY = "pictureCompressionQuality";
+
+	/**
+	 * Parameter/Property name for specifying whether picture metadata (EXIF
+	 * coming from the camera for instance.
+	 */
+	public final static String PROP_PICTURE_TRANSMIT_METADATA = "pictureTransmitMetadata";
+
+	/**
+	 * Parameter/Property name for specifying URL of the upload post request.
+	 */
+	public final static String PROP_POST_URL = "postURL";
+
+	/**
+	 * Parameter/Property name for specifying URL of the upload post request.
+	 */
+	public final static String PROP_AFTER_UPLOAD_TARGET = "afterUploadTarget";
+
+	/**
+	 * Read cookies from javascript command: document.cookie (or not)
+	 */
+	public final static String PROP_READ_COOKIE_FROM_NAVIGATOR = "readCookieFromNavigator";
+
+	/**
+	 * Read userAgent from javascript command: document.userAgent (or not)
+	 */
+	public final static String PROP_READ_USER_AGENT_FROM_NAVIGATOR = "readUserAgentFromNavigator";
+
+	/**
+	 * Parameter/Property name for specifying the real (server-side-desired)
+	 * picture height.
+	 */
+	public final static String PROP_REAL_MAX_HEIGHT = "realMaxPicHeight";
+
+	/**
+	 * Parameter/Property name for specifying the real (server-side-desired)
+	 * picture width.
+	 */
+	public final static String PROP_REAL_MAX_WIDTH = "realMaxPicWidth";
+
+	/**
+	 * Maximum number of retries, that the applet will do, for upload resumable
+	 * error. A 'upload resumable error', is typically a network error. The
+	 * default value is 0, to maintain the same behaviour as before.
+	 */
+	public final static String PROP_RETRY_MAX_NUMBER_OF = "retryMaxNumberOf";
+
+	/**
+	 * The number of seconds, to wait, before trying a new upload. This is used
+	 * if <I>retryMaxNumberOf</I> is 1 or more, and if 'resumable upload error'
+	 * occurs.
+	 */
+	public final static String PROP_RETRY_NB_SECONDS_BETWEEN = "retryNbSecondsBetween";
+
+	/**
+	 * Parameter/Property name for specifying the server protocol version.
+	 */
+	public final static String PROP_SERVER_PROTOCOL = "serverProtocol";
+
+	/**
+	 * Parameter/Property name to spceify whether the md5sum for uploaded file
+	 * should be sent.
+	 */
+	public final static String PROP_SEND_MD5_SUM = "sendMD5Sum";
+
+	/**
+	 * Parameter/Property name for specifying if the log window should be
+	 * visible.
+	 */
+	public final static String PROP_SHOW_LOGWINDOW = "showLogWindow";
+
+	/**
+	 * Parameter/Property name for specifying if the status bar should be
+	 * visible.
+	 */
+	public final static String PROP_SHOW_STATUSBAR = "showStatusbar";
+
+	/**
+	 * Parameter/Property name for specifying how certificates are handled when
+	 * uploading via SSL.
+	 */
+	public final static String PROP_SSL_VERIFY_CERT = "sslVerifyCert";
+
+	/**
+	 * Parameter/Property name for specifying if the pattern that indicates an
+	 * error in the server's response-body.
+	 */
+	public final static String PROP_STRING_UPLOAD_ERROR = "stringUploadError";
+
+	/**
+	 * Parameter/Property name for specifying if the pattern that indicates
+	 * success in the server's response-body.
+	 */
+	public final static String PROP_STRING_UPLOAD_SUCCESS = "stringUploadSuccess";
+
+	/**
+	 * Parameter/Property name for specifying if the pattern that indicates a
+	 * warning in the server's response-body.
+	 */
+	public final static String PROP_STRING_UPLOAD_WARNING = "stringUploadWarning";
+
+	/**
+	 * Parameter/Property name for specifying the target picture format
+	 * conversions
+	 */
+	public final static String PROP_TARGET_PICTURE_FORMAT = "targetPictureFormat";
+
+	/**
+	 * Parameter/Property name for specifying if the original file extension
+	 * should be changed if an image is converted to another format
+	 */
+	public final static String PROP_KEEP_ORIG_EXTENSION = "keepOriginalFileExtensionForConvertedImages";
+
+	/**
+	 * Parameter/Property name for specifying the upload policy class.
+	 */
+	public final static String PROP_UPLOAD_POLICY = "uploadPolicy";
+
+	/**
+	 * Parameter/Property name for specifying the URL for delivering error
+	 * reports.
+	 */
+	public final static String PROP_URL_TO_SEND_ERROR_TO = "urlToSendErrorTo";
+
+	/***************************************************************************
+	 * ************************************************************************
+	 * ************************* LIST OF ALLOWED VALUES *********************
+	 * ************************************************************************
+	 **************************************************************************/
+
+	/**
+	 * Indicates that, in the HTTP upload request, the parameter that containts
+	 * the uploaded files is an Iteration. For instance: from File0 to FileN
+	 * (for N+1 files).
+	 */
+	public final String HTTPUPLOADPARAMETERTYPE_ARRAY = "array";
+
+	/**
+	 * Indicates that, in the HTTP upload request, the parameter that containts
+	 * the uploaded files is an Iteration. For instance: from File0 to FileN
+	 * (for N+1 files).
+	 */
+	public final String HTTPUPLOADPARAMETERTYPE_ITERATION = "iteration";
+
+	/**
+	 * Indicates that, in the HTTP upload request, there will be only one file.
+	 * This value is only valid when nbFilesPerRequest is 1. The parameters in
+	 * the HTTP upload request are let untransformed. For instance, if
+	 * httpUploadParameterName is the default value (File), the file content
+	 * will be loaded under the HTTP parameter 'File'.
+	 */
+	public final String HTTPUPLOADPARAMETERTYPE_ONE_FILE = "oneFile";
+
+	/** Indicates that the log window is always visible. */
+	public final String SHOWLOGWINDOW_TRUE = "true";
+
+	/** Indicates that the log window is always hidden. */
+	public final String SHOWLOGWINDOW_FALSE = "false";
+
+	/**
+	 * Indicates that the log window is hidden, and will become visible only
+	 * when an error occurs.
+	 */
+	public final String SHOWLOGWINDOW_ONERROR = "onError";
+
+	/***************************************************************************
+	 * ************************************************************************
+	 * ************************* LIST OF DEFAULT VALUES **********************
+	 * ************************************************************************
+	 **************************************************************************/
+
+	/**
+	 * Default value for parameter "afterUploadTarget".
+	 */
+	public final static String DEFAULT_AFTER_UPLOAD_TARGET = null;
+
+	/**
+	 * Default value for parameter "afterUploadURL"
+	 */
+	public final static String DEFAULT_AFTER_UPLOAD_URL = null;
+
+	/**
+	 * Default value for parameter "allowHttpPersisten".
+	 */
+	public final static boolean DEFAULT_ALLOW_HTTP_PERSISTENT = false;
+
+	/**
+	 * Default value for parameter "allowedFileExtensions".
+	 */
+	public final static String DEFAULT_ALLOWED_FILE_EXTENSIONS = null;
+
+	/**
+	 * Default value for parameter "albumId".
+	 */
+	public final static int DEFAULT_ALBUM_ID = 0;
+
+	/**
+	 * Default value for parameter "storeBufferedImage". Be careful: if set to
+	 * true, you'll probably have memory problems while in a navigator.
+	 */
+	public final static boolean DEFAULT_STORE_BUFFERED_IMAGE = false;
+
+	/**
+	 * Default value for the browsing window first: no specific directory.
+	 */
+	public final static String DEFAULT_BROWSING_DIRECTORY = null;
+
+	/**
+	 * Default value for date format when changing date/time variable to String.
+	 */
+	public final static String DEFAULT_DATE_FORMAT = "dd/MM/yyyy HH:mm:ss";
+
+	/**
+	 * Default value for parameter "debugLevel".
+	 */
+	public final static int DEFAULT_DEBUG_LEVEL = 0;
+
+	/**
+	 * Default value for applet parameter "fileChooserIconFromFileContent".
+	 * 
+	 * @see #PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+	 */
+	public final static int DEFAULT_FILE_CHOOSER_ICON_FROM_FILE_CONTENT = 0;
+
+	/**
+	 * Default value for applet parameter "fileChooserIconSize".
+	 * 
+	 * @see #PROP_FILE_CHOOSER_ICON_SIZE
+	 */
+	public final static int DEFAULT_FILE_CHOOSER_ICON_SIZE = 20;
+
+	/**
+	 * Default value for applet parameter "fileChooserImagePreview".
+	 * 
+	 * @see #PROP_FILE_CHOOSER_IMAGE_PREVIEW
+	 */
+	public final static boolean DEFAULT_FILE_CHOOSER_IMAGE_PREVIEW = true;
+
+	/**
+	 * Default value for applet parameter "fileFilterName". This default value
+	 * let the {@link DefaultUploadPolicy} return a calculated name, which
+	 * contains the list of allowed file extensions.
+	 * 
+	 * @see #PROP_FILE_FILTER_NAME
+	 * @see #PROP_ALLOWED_FILE_EXTENSIONS
+	 */
+	public final static String DEFAULT_FILE_FILTER_NAME = null;
+
+	/**
+	 * Default value for applet parameter "ftpCreateDirectoryStructure".
+	 * 
+	 * @see #PROP_FTP_CREATE_DIRECTORY_STRUCTURE
+	 */
+	public final static boolean DEFAULT_FTP_CREATE_DIRECTORY_STRUCTURE = false;
+
+	/** FTP: binary or ascii mode */
+	public final static boolean DEFAULT_FTP_TRANSFERT_BINARY = true;
+
+	/** FTP: passive or active mode */
+	public final static boolean DEFAULT_FTP_TRANSFERT_PASSIVE = true;
+
+	/** Default value for parameter "lang". */
+	public final static String DEFAULT_LANG = null;
+
+	/**
+	 * Default value for parameter "filenameEncoding". Note: the
+	 * CoppermineUploadPolicy forces it to "UTF8".
+	 */
+	public final static String DEFAULT_FILENAME_ENCODING = null;
+
+	/** Default value for parameter "highQualityPreview". */
+	public final static boolean DEFAULT_HIGH_QUALITY_PREVIEW = false;
+
+	/** Default value for parameter "httpUploadParameterName". */
+	public final static String DEFAULT_HTTP_UPLOAD_PARAMETER_NAME = "File";
+
+	/** Default value for parameter "httpUploadParameterName". */
+	public final static String DEFAULT_HTTP_UPLOAD_PARAMETER_TYPE = HTTPUPLOADPARAMETERTYPE_ITERATION;
+
+	/** Default value for parameter "lookAndFeel". */
+	public final static String DEFAULT_LOOK_AND_FEEL = "";
+
+	/** Default value for parameter "maxChunkSize". */
+	public final static long DEFAULT_MAX_CHUNK_SIZE = Long.MAX_VALUE;
+
+	/**
+	 * Default value for parameter "maxFileSize". Take care of this parameter if
+	 * chunk upload is activated! See comment above.
+	 */
+	public final static long DEFAULT_MAX_FILE_SIZE = Long.MAX_VALUE;
+
+	/** Default value for parameter "maxPicWidth". */
+	public final static int DEFAULT_MAX_WIDTH = Integer.MAX_VALUE;
+
+	/** Default value for parameter "maxPicHeight". */
+	public final static int DEFAULT_MAX_HEIGHT = Integer.MAX_VALUE;
+
+	/**
+	 * Default value for parameter "maxPicHeight". Note: the
+	 * CoppermineUploadPolicy forces it to 1.
+	 */
+	public final static int DEFAULT_NB_FILES_PER_REQUEST = 1;
+
+	/**
+	 * Default value for parameter "pictureCompressionQuality".
+	 */
+	public final static float DEFAULT_PICTURE_COMPRESSION_QUALITY = (float) 0.8;
+
+	/**
+	 * Default value for parameter "pictureCompressionQuality".
+	 */
+	public final static boolean DEFAULT_PICTURE_TRANSMIT_METADATA = false;
+
+	/**
+	 * Default value for parameter "postURL".
+	 */
+	public final static String DEFAULT_POST_URL = null;
+
+	/**
+	 * Default value for parameter "readCookieFromNavigator".
+	 */
+	public final static boolean DEFAULT_READ_COOKIE_FROM_NAVIGATOR = true;
+
+	/**
+	 * Default value for parameter "readUserAgentFromNavigator".
+	 */
+	public final static boolean DEFAULT_READ_USER_AGENT_FROM_NAVIGATOR = true;
+
+	/**
+	 * Default value for parameter "realMaxPicWidth".
+	 */
+	public final static int DEFAULT_REAL_MAX_WIDTH = Integer.MAX_VALUE;
+
+	/**
+	 * Default value for parameter "realMaxPicHeight".
+	 */
+	public final static int DEFAULT_REAL_MAX_HEIGHT = Integer.MAX_VALUE;
+
+	/**
+	 * Default value for parameter "retryMaxNumberOf".
+	 */
+	public final static int DEFAULT_RETRY_MAX_NUMBER_OF = 1;
+
+	/**
+	 * Default value for parameter "retryNbSecondsBetween".
+	 */
+	public final static int DEFAULT_RETRY_NB_SECONDS_BETWEEN = 30;
+
+	/**
+	 * Default value for parameter "serverProtocol".
+	 */
+	public final static String DEFAULT_SERVER_PROTOCOL = "HTTP/1.1";
+
+	/**
+	 * Default value for the sendMD5Sum applet parameter
+	 */
+	public final static boolean DEFAULT_SEND_MD5_SUM = false;
+
+	/**
+	 * Default value for parameter "showLogWindow".
+	 */
+	public final static String DEFAULT_SHOW_LOGWINDOW = "true";
+
+	/**
+	 * Default value for parameter "showStatusBar".
+	 */
+	public final static boolean DEFAULT_SHOW_STATUSBAR = true;
+
+	/**
+	 * Default value for parameter "sslVerifyCert"
+	 */
+	public final static String DEFAULT_SPECIFIC_HEADERS = null;
+
+	/**
+	 * Default value for parameter "sslVerifyCert"
+	 */
+	public final static String DEFAULT_SSL_VERIFY_CERT = "none";
+
+	/**
+	 * Default value for parameter "stringUploadError".
+	 * 
+	 * @since 2.9.2rc4
+	 */
+	public final static String DEFAULT_STRING_UPLOAD_ERROR = "^ERROR: (.*)$";
+
+	/**
+	 * Default value for parameter "stringUploadSuccess". Note: was ".* 200 OK$"
+	 * before 2.9.0
+	 */
+	public final static String DEFAULT_STRING_UPLOAD_SUCCESS = "^SUCCESS$";
+
+	/**
+	 * Default value for parameter "stringUploadWarning".
+	 */
+	public final static String DEFAULT_STRING_UPLOAD_WARNING = "^WARNING: (.*)$";
+
+	/**
+	 * Default value for parameter "targetPictureFormat".
+	 */
+	public final static String DEFAULT_TARGET_PICTURE_FORMAT = null;
+
+	/**
+	 * default value for parameter "keepOriginalFileExtensionForConvertedImages"
+	 */
+	public final static boolean DEFAULT_KEEP_ORIG_EXTENSION = false;
+
+	/**
+	 * Default value for parameter "uploadPolicy".
+	 */
+	public final static String DEFAULT_UPLOAD_POLICY = "DefaultUploadPolicy";
+
+	/**
+	 * Default value for parameter "urlToSendErrorTo".
+	 */
+	public final static String DEFAULT_URL_TO_SEND_ERROR_TO = null;
+
+	/**
+	 * Default value for parameter "formdata"
+	 * 
+	 * @since 2.9.2rc4
+	 */
+	public final static String DEFAULT_FORMDATA = null;
+
+	/***************************************************************************/
+	/******************** MISC CONSTANTS ***************************************/
+	/***************************************************************************/
+
+	/**
+	 * Indicating that the applet is currently waiting for the user, to select
+	 * files or start an uploading.
+	 */
+	public final static int EXEC_STATUS_READY = 1;
+	/** Indicating that the applet is currently uploading files */
+	public final static int EXEC_STATUS_UPLOADING = 2;
+
+	/***************************************************************************
+	 * *************************************************************************
+	 * ********************* LIST OF METHODS **********************************
+	 * *************************************************************************
+	 **************************************************************************/
+
+	/**
+	 * This method allows the upolad policy to override the content of the
+	 * applet part that is above the file list, called here the 'top panel'.
+	 * That is: the part that contains the Browse, Remove and RemoveAll buttons.
+	 * The default implementation is defined in
+	 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
+	 * . <BR>
+	 * You can see an example in the
+	 * {@link PictureUploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
+	 * upload policy implementation. <BR>
+	 * <B>Note:</B> This method is called by the
+	 * {@link DefaultUploadPolicy#addComponentsToJUploadPanel(JUploadPanel)}
+	 * method. If you create an upload policy that overrides the
+	 * addComponentsToJUploadPanel method, it's up to you to call it.
+         *  
+	 * @param browse
+	 *            The default browse button.
+	 * @param remove
+	 *            The default removeSelected button.
+	 * @param removeAll
+	 *            The default removeAll button.
+	 * @param mainPanel
+	 *            The panel that contains all objects.
+	 * @return the topPanel, that will be displayed on the top of the Applet.
+	 */
+	public JPanel createTopPanel(JButton browse, JButton remove,
+			JButton removeAll, JUploadPanel mainPanel);
+
+	/**
+	 * This method is called to create the progress panel. The default
+	 * implementation is defined in
+	 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createProgressPanel(JProgressBar, JProgressBar, JButton, JButton, JUploadPanel)}
+	 * .
+	 * 
+	 * @param preparationProgressBar
+	 *            The default preparation progress bar.
+	 * @param uploadProgressBar
+	 *            The default upload progress bar.
+	 * @param uploadButton
+	 *            The default upload button.
+	 * @param stopButton
+	 *            The default stop button.
+	 * @param mainPanel
+	 *            The panel that contains all objects.
+	 * @return the topPanel, that will be displayed on the top of the Applet.
+	 */
+	public JPanel createProgressPanel(JProgressBar preparationProgressBar,
+			JProgressBar uploadProgressBar, JButton uploadButton,
+			JButton stopButton, JUploadPanel mainPanel);
+
+	/**
+	 * This method is used to create a new status bar. The default
+	 * implementation is defined in
+	 * {@link wjhk.jupload2.policies.DefaultUploadPolicy#createStatusBar(JLabel, JUploadPanel)}
+	 * .
+	 * 
+	 * @param statusContent
+	 *            The status bar content
+	 * @param mainPanel
+	 *            The panel that contains all objects.
+	 * @return the topPanel, that will be displayed on the top of the Applet.
+	 */
+	public JPanel createStatusBar(JLabel statusContent, JUploadPanel mainPanel);
+
+	/**
+	 * This methods allow the upload policy to override the default disposition
+	 * of the components on the applet.<br>
+	 * There are some utility methods to style file panel elements (font/color), see
+         * {@link wjhk.jupload2.gui.filepanel.FilePanel}.
+	 * @param jUploadPanel
+	 *            The main applet panel.
+	 * @see #createTopPanel(JButton, JButton, JButton, JUploadPanel)
+	 */
+	public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel);
+
+	/**
+	 * This methods creates a new FileData instance (or one of its inherited
+	 * classes), and return it to the caller.
+	 * 
+	 * @param file
+	 *            The file used to create the FileData instance. This method is
+	 *            called once for each file selected by the user, even if the
+	 *            user added several files in one 'shot'.
+	 * @param root
+	 *            An optional toplevel directory of a hierarchy (can be null).
+	 * @return A FileData instance. The exact class depends on the
+	 *         currentUploadPolicy. Can be null, if the policy performs checks,
+	 *         and the given file is not Ok for these controls. See
+	 *         {@link PictureUploadPolicy#createFileData(File,File)} for an
+	 *         example. It's up to the upload policy to display a message to
+	 *         inform the user that this file won't be added to the file list.
+	 * @throws JUploadExceptionStopAddingFiles
+	 *             The exception is not really an error. It allows an easy way
+	 *             to indicates that the applet should stop adding files when
+	 *             the user clicked on the 'Cancel' button.
+	 */
+	public FileData createFileData(File file, File root)
+			throws JUploadExceptionStopAddingFiles;
+
+	/**
+	 * This method displays the applet parameter list, according to the current
+	 * debugLevel. It is called by the {@link #setDebugLevel(int)} method. It
+	 * should be override by any subclasses, that should display its own
+	 * parameters, then call <i>super.displayParameterStatus()</i>.
+	 */
+	public void displayParameterStatus();
+
+	/**
+	 * Reaction to the applet start. This method was added from the patch
+	 * 3035735 given by Tsukasa Hamano (SF login: cuspy). Its aim is to move all
+	 * call to JSObject from the applet.init() method to the applet.start()
+	 * method. This prevents a crash, under Safari.
+	 */
+	public void start();
+
+	/**
+	 * This method is called by the {@link JUploadPanel#updateButtonState()}
+	 * method, when the execution status of the applet changes. This allow the
+	 * applet to manage specific GUI items, depending on the current execution
+	 * status of the applet.
+	 * 
+	 * @param executionStatus
+	 *            One of the EXEC_STATUS_XXX constant.
+	 */
+	public void updateButtonState(int executionStatus);
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// getters / setters
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * This allow runtime modifications of properties. With this method, you can
+	 * change any applet parameter after the applet initilization, with
+	 * JavaScript for instance. If the applet parameters given in <i>prop</i> is
+	 * not managed by this method, a warning is displayed in the log window.
+	 * 
+	 * @param prop
+	 *            The applet parameter name.
+	 * @param value
+	 *            The new value for this parameter. If the value is not valid
+	 *            (for instance <i>aaa</i> for a number), a warning is displayed
+	 *            in the log window, and the existing value is not changed.
+	 * @throws JUploadException
+	 * @exception JUploadExceptionStopAddingFiles
+	 *                indicates that the applet should stop strying adding the
+	 *                current file selection. Useful for instance, when a user
+	 *                drop a directory, full of unallowed file: it's annoying
+	 *                for the user to click 'Ok' for each file in the alert box.
+	 */
+	public void setProperty(String prop, String value) throws JUploadException;
+
+	/**
+	 * Retrieves the current value for the afterUploadURL applet parameter.
+	 * 
+	 * @return The current value for he afterUploadURL applet parameter.
+	 */
+	public String getAfterUploadURL();
+
+	/**
+	 * Retrieves the current value for allowHttpPersistent
+	 * 
+	 * @return Current value for allowHttpPersistent
+	 */
+	public boolean getAllowHttpPersistent();
+
+	/**
+	 * Retrieves the current value for allowedFileExtensions *
+	 * 
+	 * @return Current value for allowedFileExtensions
+	 */
+	public String getAllowedFileExtensions();
+
+	/**
+	 * A useful function, that has nothing to do with an upload policy. But it
+	 * is useful to have it here, as the uploadPolicy is known everywhere in the
+	 * applet.
+	 * 
+	 * @return Reference to the current JUpload context.
+	 */
+	public JUploadContext getContext();
+
+	/**
+	 * Set the current directory.
+	 * 
+	 * @param currentBrowsingDirectoryParam
+	 *            The directory that will be the current one, the next time the
+	 *            file chooser is opened.
+	 * @see #getCurrentBrowsingDirectory()
+	 * @deprecated
+	 */
+	public void setCurrentBrowsingDirectory(File currentBrowsingDirectoryParam);
+
+	/**
+	 * Set the current directory.
+	 * 
+	 * @param currentBrowsingDirectoryParam
+	 *            The directory that will be the current one, the next time the
+	 *            file chooser is opened. This directory may begin with ~/ or ~\
+	 * @see #getCurrentBrowsingDirectory()
+	 */
+	public void setCurrentBrowsingDirectory(String currentBrowsingDirectoryParam);
+
+	/**
+	 * Returns the current browsing directory, that is: the directory that will
+	 * be current the next time the file chooser is opened. It is initialized
+	 * with the browsingDirectory applet parameter. Then, it contains the last
+	 * directory used in the file chooser.
+	 * 
+	 * @return The directory that will be the current one, the next time the
+	 *         file chooser is opened.
+	 */
+	public File getCurrentBrowsingDirectory();
+
+	/**
+	 * Returns the currently choosen format for date. It must be compatible with
+	 * the SimpleDateFormat standard Java class.
+	 * 
+	 * @return The date format.
+	 */
+	public String getDateFormat();
+
+	/**
+	 * This method indicate whether or not the debug messages must be displayed.
+	 * Default is no debug (0). <br>
+	 * To activate the debug, add a 'debugLevel' parameter to the applet (with 1
+	 * to n value), or call this method. Currently, level used in the code are
+	 * between 0 (no debug) and 100 (max debug). <br>
+	 * With a 0 value, no debug messages will be displayed. The
+	 * {@link DefaultUploadPolicy}.addMsgToDebugBufferString method stores all
+	 * debug output in a BufferString.
+	 * 
+	 * @param debugLevel
+	 *            The new debugLevel.
+	 * @see DefaultUploadPolicy#sendDebugInformation(String, Exception)
+	 */
+	public void setDebugLevel(int debugLevel);
+
+	/**
+	 * This method returns the current debug level.
+	 * 
+	 * @return The current debug level
+	 * @see #setDebugLevel(int)
+	 */
+	public int getDebugLevel();
+
+	/**
+	 * Getter for the fileFilterName property.
+	 * 
+	 * @return Stored value for fileFilterName
+	 * @see UploadPolicy#PROP_FILE_FILTER_NAME
+	 */
+	public String getFileFilterName();
+
+	/**
+	 * Getter for the fileChooserIconFromFileContent applet parameter.
+	 * 
+	 * @return Stored value for fileChooserIconFromFileContent
+	 * @see #PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+	 */
+	public int getFileChooserIconFromFileContent();
+
+	/**
+	 * Getter for the fileChooserIconSize applet parameter.
+	 * 
+	 * @return Stored value for fileChooserIconSize
+	 * @see #PROP_FILE_CHOOSER_ICON_SIZE
+	 */
+	public int getFileChooserIconSize();
+
+	/**
+	 * Returns the encoding that should be used for the filename. This encoding
+	 * has no impact on the content of the file that will be uploaded.
+	 * 
+	 * @return The encoding name, like UTF-8 (see the Charset JDK
+	 *         documentation).
+	 */
+	public String getFilenameEncoding();
+
+	/**
+	 * Returns the current value for the ftpCreateDirectoryStructure applet
+	 * parameter.
+	 * 
+	 * @return The current value of ftpCreateDirectoryStructure
+	 */
+	public boolean getFtpCreateDirectoryStructure();
+
+	/**
+	 * Returns the current value for the ftpTransfertBinary applet parameter.
+	 * 
+	 * @return The current value of ftpTransfertBinary
+	 */
+	public boolean getFtpTransfertBinary();
+
+	/**
+	 * Returns the current value for the ftpTransfertPassive applet parameter.
+	 * 
+	 * @return The current value of ftpTransfertPassive
+	 */
+	public boolean getFtpTransfertPassive();
+
+	/**
+	 * This method sets the current language to take into account. It loads the
+	 * lang resourceBundle, which will allow the applet to display the texts in
+	 * the correct language.
+	 * 
+	 * @param lang
+	 *            The new language to take into account. See the
+	 *            java.util.Locale(String) constructor for a list of valid
+	 *            values.
+	 */
+	public void setLang(String lang);
+
+	/**
+	 * Returns the value of the applet parameter maxChunkSize (see above for a
+	 * description of all applet parameters)
+	 * 
+	 * @return the current value of maxChunkSize.
+	 */
+	public long getMaxChunkSize();
+
+	/**
+	 * Returns the value of the applet parameter maxFileSize (see above for a
+	 * description of all applet parameters)
+	 * 
+	 * @return the current value of maxFileSize.
+	 */
+	public long getMaxFileSize();
+
+	/**
+	 * This function returns the number of files should be uploaded during one
+	 * access to the server. If negative or 0, all files are to be uploaded in
+	 * one HTTP request. If positive, each HTTP upload contains this number of
+	 * files. The last upload request may contain less files. <br>
+	 * Examples :
+	 * <UL>
+	 * <li>If 1 : files are uploaded file by file.
+	 * <li>If 5 : files are uploaded 5 files by 5 files. If 12 files are
+	 * uploaded, 3 HTTP upload are done, containing 5, 5 and 2 files.
+	 * </UL>
+	 * 
+	 * @return Returns the maximum number of files, to download in one HTTP
+	 *         request.
+	 */
+	public int getNbFilesPerRequest();
+
+	/**
+	 * Return the current value of readUserAgentFromNavigator
+	 * 
+	 * @return Current value of readUserAgentFromNavigator
+	 */
+	public boolean getReadUserAgentFromNavigator();
+
+	/**
+	 * Return the current value of retryMaxNumberOf
+	 * 
+	 * @return Current value of retryMaxNumberOf
+	 */
+	public int getRetryMaxNumberOf();
+
+	/**
+	 * Return the current value of retryNbSecondsBetween
+	 * 
+	 * @return Current value of retryNbSecondsBetween
+	 */
+	public int getRetryNbSecondsBetween();
+
+	/**
+	 * Return the current value of readCookieFromNavigator
+	 * 
+	 * @return Current value of readCookieFromNavigator
+	 */
+	public boolean getReadCookieFromNavigator();
+
+	/**
+	 * Get the target URL for upload.
+	 * 
+	 * @return Should be valid URL...
+	 */
+	public String getPostURL();
+
+	/**
+	 * The URL can change during the life of our policy ...
+	 * 
+	 * @param postURL
+	 * @throws JUploadException
+	 */
+	public void setPostURL(String postURL) throws JUploadException;
+
+	/**
+	 * Return the target, specified as applet parameter "afterUploadTarget"
+	 * 
+	 * @return the specified target.
+	 */
+	public String getAfterUploadTarget();
+
+	/**
+	 * HTTP protocol that should be used to send the HTTP request. Currently,
+	 * this is mainly used by
+	 * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}, as the coppermine
+	 * control that the protocol used for each HTTP request is the same as the
+	 * one used during the session creation. It is used in the default policy,
+	 * as it could be used elsewhere. <br>
+	 * Default is : HTTP/1.1
+	 * 
+	 * @return The selected server protocol.
+	 */
+	public String getServerProtocol();
+
+	/**
+	 * @param serverProtocol
+	 *            The protocol is set from the postURL. For HTTP URL, a HEAD
+	 *            request is done toward the server, to check if any temporary
+	 *            redirection is occuring.
+	 */
+	public void setServerProtocol(String serverProtocol);
+
+	/**
+	 * MD5Sum allows the server to control that the file has been correctly
+	 * uploaded. This is interesting, when uploading in chunk mode. But
+	 * calculating this can be long, for big files.
+	 * 
+	 * @return true or false, whether the md5sum should be processed and sent to
+	 *         the server.
+	 */
+	public boolean getSendMD5Sum();
+
+	/**
+	 * MD5Sum allows the server to control that the file has been correctly
+	 * uploaded. This is interesting, when uploading in chunk mode. But
+	 * calculating this can be long, for big files.
+	 * 
+	 * @param sendMD5Sum
+	 *            true or false, whether the md5sum should be processed and sent
+	 *            to the server.
+	 */
+	public void setSendMD5Sum(boolean sendMD5Sum);
+
+	/**
+	 * Retrieves SSL verification mode.
+	 * 
+	 * @return The current SSL verification mode.
+	 */
+	public int getSslVerifyCert();
+
+	/**
+	 * @param showLogWindow
+	 *            The show window status to set.
+	 * @see #getShowLogWindow()
+	 */
+	public void setShowLogWindow(String showLogWindow);
+
+	/**
+	 * Indicate whether the log window should be shown. It may be convenient to
+	 * hide it, as it contains mostly debug information. But it still is the
+	 * only place where possible errors and warnings are shown.<br>
+	 * Default is : true
+	 * 
+	 * @return The current value for the <i>showStatusBar</i> applet parameter.
+	 */
+	public String getShowLogWindow();
+
+	/**
+	 * Returns the list of specific headers, that will be added to all HTTP
+	 * request to the server.
+	 * 
+	 * @return List of specific headers, with a \r\n at the end of each header.
+	 */
+	public String getSpecificHeaders();
+
+	/**
+	 * Get the original name of the file on the disk. This function can encode
+	 * the filename (see the filenameEncoding parameter). By default, the
+	 * original filename is returned.
+	 * 
+	 * @param fileData
+	 *            The file data whose upload file name must be calculated.
+	 * @param index
+	 *            index of the file in the current request to the server (from 0
+	 *            to n)
+	 * @return The filename the is given in the filename part of the
+	 *         Content-Disposition header.
+	 * @throws JUploadException
+	 */
+	public String getUploadFilename(FileData fileData, int index)
+			throws JUploadException;
+
+	/**
+	 * Get an upload filename, that is to be send in the HTTP upload request.
+	 * This is the name part of the Content-Disposition header. That is: this is
+	 * the name under which you can manage the file (for instance in the
+	 * _FILES[$name] in PHP) and not the filename of the original file. <BR>
+	 * If you're using one of the core JUpload {@link UploadPolicy}, the value
+	 * for this parameter is controled by the applet parameters:
+	 * targetPictureFormat and keepOriginalFileExtensionForConvertedImages.
+	 * 
+	 * @param fileData
+	 *            The file data whose upload name must be calculated.
+	 * @param index
+	 *            index of the file in the current request to the server (from 0
+	 *            to n)
+	 * @return The name part of the Content-Disposition header.
+	 * @throws JUploadException
+	 * @see #getUploadFilename(FileData, int)
+	 */
+	public String getUploadName(FileData fileData, int index)
+			throws JUploadException;
+
+	/**
+	 * Returns the current URL where error log must be posted. See <a
+	 * href="#parameters">Parameters</a>
+	 * 
+	 * @return the urlToSendErrorTo
+	 */
+	public String getUrlToSendErrorTo();
+
+	/**
+	 * @param urlToSendErrorTo
+	 *            the urlToSendErrorTo to set
+	 * @throws JUploadException
+	 */
+	public void setUrlToSendErrorTo(String urlToSendErrorTo)
+			throws JUploadException;
+
+	/**
+	 * Retrieve the regular expression that will be tested against each line of
+	 * the server answer. If one line matches this expression, that upload is
+	 * marked as failed. <br>
+	 * 
+	 * @return The regular expression that must be run again each line of the
+	 *         http answer.
+	 */
+	public String getStringUploadError();
+
+	/**
+	 * Get the regular expression that will be tested against each line of the
+	 * server answer. If one line matches this expression, that upload is marked
+	 * as successful. <br>
+	 * The upload works this way:
+	 * <ol>
+	 * <li>Upload the selected file(s) to the server
+	 * <li>Get all the server HTTP response.
+	 * <li>The stringUploadSuccess regular expression is tested against each
+	 * line from the server.
+	 * <li>If the above test gives a match, the upload is marked as successful.
+	 * Else, the upload is marked as unsuccessful, and a
+	 * JUploadExceptionUploadFailure is thrown.
+	 * </ol>
+	 * 
+	 * @return The regular expression that must be run again each line of the
+	 *         http answer.
+	 */
+	public String getStringUploadSuccess();
+
+	/**
+	 * Retrieve the regular expression that will be tested against each line of
+	 * the server answer. If one line matches this expression, a warning message
+	 * is displayed to the user. <br>
+	 * 
+	 * @return The regular expression that must be run again each line of the
+	 *         http answer.
+	 * @see #getStringUploadError()
+	 * @see #getStringUploadSuccess()
+	 */
+	public String getStringUploadWarning();
+
+	/**
+	 * Retrieve the applet's "formdata" parameter.
+	 * 
+	 * @return The applet's formdata parameter.
+	 */
+	public String getFormdata();
+
+	/**
+	 * Retrieve the applet's "httpUploadParameterName" parameter.
+	 * 
+	 * @return The applet's httpUploadParameterName parameter.
+	 */
+	public String getHttpUploadParameterName();
+
+	/**
+	 * Retrieve the applet's "httpUploadParameterType" parameter.
+	 * 
+	 * @return The applet's httpUploadParameterType parameter.
+	 */
+	public String getHttpUploadParameterType();
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// miscellaneous methods
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Reaction by the upload policy, once the management of the dropped file(s)
+	 * is finished, that is: after all the dropped files have been successfully
+	 * added to the file list.
+	 * 
+	 * @param dropEvent
+	 *            The event containing the dropped file
+	 */
+	public void afterFileDropped(DropTargetDropEvent dropEvent);
+
+	// MANAGEMENT OF THE FILE CHOOSER
+
+	/**
+	 * The creation of the file chooser is controled by the upload policy, to
+	 * allow fine control of the way to select files. For instance, the
+	 * {@link PictureUploadPolicy} creates a file chooser, and add an accessory
+	 * to preview pictures.
+	 * 
+	 * @return Return the specific file choose, according to this upload policy.
+	 */
+	public JUploadFileChooser createFileChooser();
+
+	/**
+	 * This methods is called by the {@link JUploadFileFilter#accept(File)}. It
+	 * allows the current upload policy to filter files, according to any
+	 * choosen applet behaviour. This filter applied only when using the
+	 * fileChooser. Files dropped onto the applet won't trigger this function.<br>
+	 * In the {@link DefaultUploadPolicy} upload policy, this filter is based on
+	 * the applet parameter: <i>allowedFileExtensions</i>.
+	 * 
+	 * @param file
+	 *            Allows the applet to filter files from the file chooser.
+	 * @return true or false, whether the file is accepted or not.
+	 * @see JUploadPanel
+	 */
+	public boolean fileFilterAccept(File file);
+
+	/**
+	 * Return a description for the FileFilter, according to the current upload
+	 * policy.
+	 * 
+	 * @return A description for the current filter
+	 */
+	public String fileFilterGetDescription();
+
+	/**
+	 * Response for the {@link JUploadFileView#getIcon(File)}. Default is
+	 * implemented in {@link DefaultUploadPolicy#fileViewGetIcon(File)}, by
+	 * returning null, which displays the default icon.
+	 * 
+	 * @param file
+	 *            The file from which the icon should represent.
+	 * @return The resulting icon.
+	 */
+	public Icon fileViewGetIcon(File file);
+
+	/**
+	 * This method changes the current mouse cursor to the wait one. It returns
+	 * the old one so that, it can be restored, once the work is done.
+	 * 
+	 * @return The cursor that was active, before changing to the wait one.
+	 * @see #setCursor(Cursor)
+	 */
+	public Cursor setWaitCursor();
+
+	/**
+	 * Changes the current mouse cursor. This method can be called at the end of
+	 * a big treatement, to restore the cursor returned by the
+	 * {@link #setWaitCursor()}.
+	 * 
+	 * @param cursor
+	 *            The cursor that must be set.
+	 * @return The cursor that was active before setting the new one. Can be
+	 *         used to restore its previous state.
+	 */
+	public Cursor setCursor(Cursor cursor);
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// DISPLAY OF MESSAGES (ERROR, DEBUG ...)
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * This method allows the applet to post debug information to the website
+	 * (see {@link #getUrlToSendErrorTo()}). Then, it is possible to log the
+	 * error, to send a mail...
+	 * 
+	 * @param reason
+	 *            A string describing briefly the problem. The mail subject will
+	 *            be something like: Jupload Error (reason)
+	 * @param exception
+	 *            The java exception that was raised, or null if no exception.
+	 */
+	public void sendDebugInformation(String reason, Exception exception);
+
+	/**
+	 * log an error message, based on an exception. Will be logged in the log
+	 * window, if defined. <BR>
+	 * The dialog box will only contain an Ok button. Same as caling:
+	 * displayErr(e, JOptionPane.OK_OPTION);
+	 * 
+	 * @param e
+	 *            The exception to report
+	 */
+	public void displayErr(Exception e);
+
+	/**
+	 * log an error message, based on an exception. Will be logged in the log
+	 * window, if defined.<BR>
+	 * 
+	 * @param err
+	 *            The erreur message to be displayed. If null the exception (or
+	 *            it's cause if any) message is displayed.
+	 * @param e
+	 *            The exception to report
+	 * @param optionType
+	 *            One of the valid {@link JOptionPane} option types for the
+	 *            {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)}
+	 *            method: OK_CANCEL_OPTION, YES_NO_OPTION,
+	 *            YES_NO_CANCEL_OPTION... -1 is also accepted, to only have the
+	 *            Ok button. OK_OPTION is prohibited, as it has the same value
+	 *            as YES_NO_OPTION.
+	 * @return The XXX_OPTION, corresponding to the button clicked by the user.
+	 */
+	public int displayErr(String err, Exception e, int optionType);
+
+	/**
+	 * log an error message. Will be logged in the log window, if defined. <BR>
+	 * The dialog box will only contain an Ok button.
+	 * 
+	 * @param err
+	 *            The erreur message to be displayed.
+	 */
+	public void displayErr(String err);
+
+	/**
+	 * log an error message. Will be logged in the log window, if defined. <BR>
+	 * The dialog box will only contain an Ok button.
+	 * 
+	 * @param err
+	 *            The error message to be displayed.
+	 * @param e
+	 *            An exception. It's stacktrace is logged.
+	 */
+	public void displayErr(String err, Exception e);
+
+	/**
+	 * log an info message. Will be logged in the log window, if defined.
+	 * 
+	 * @param info
+	 *            The information message that will be displayed.
+	 */
+	public void displayInfo(String info);
+
+	/**
+	 * log a warning message. Will be logged in the log window, if defined.
+	 * 
+	 * @param warn
+	 *            The warning message that will be displayed.
+	 */
+	public void displayWarn(String warn);
+
+	/**
+	 * log a debug message. Will be logged in the log window, if defined.
+	 * 
+	 * @param debug
+	 *            The message to display.
+	 * @param minDebugLevel
+	 *            If the current debug level is superior or equals to
+	 *            minDebugLevel, the message will be displayed. Otherwise, it
+	 *            will be ignored.
+	 */
+	public void displayDebug(String debug, int minDebugLevel);
+
+	// Others
+
+	/**
+	 * Add an header to the list of headers that will be added to each HTTP
+	 * upload request. This method is called from specific uploadPolicies, which
+	 * would need headers to be added to all uploads. These headers are used in
+	 * {@link wjhk.jupload2.policies.DefaultUploadPolicy}.
+	 * 
+	 * @param header
+	 * @see #onAppendHeader(ByteArrayEncoder)
+	 */
+	public void addHeader(String header);
+
+	/**
+	 * Append specific headers for this upload (session cookies, for instance).
+	 * This method is called while building each upload HTTP request.
+	 * 
+	 * @param sb
+	 *            The header {@link ByteArrayEncoder} where specific headers
+	 *            should be appended.
+	 * @return The {@link ByteArrayEncoder} given in parameters. This is allows
+	 *         to work like with StringBuffer.append method:
+	 *         sb.append(s1).append(s2);
+	 * @throws JUploadIOException
+	 * @see #addHeader(String)
+	 * @see wjhk.jupload2.upload.FileUploadThread
+	 */
+	public ByteArrayEncoder onAppendHeader(ByteArrayEncoder sb)
+			throws JUploadIOException;
+
+	/**
+	 * This method is called each time a file is selected in the panel files. It
+	 * allows, for instance, to preview a picture
+	 * {@link wjhk.jupload2.policies.PictureUploadPolicy}.
+	 * 
+	 * @param fileData
+	 */
+	public void onFileSelected(FileData fileData);
+
+	/**
+	 * Reaction when the user double click on a file, in the file list. Default
+	 * is no reaction. In {@link PictureUploadPolicy}, it will open a
+	 * {@link PictureDialog}.
+	 * 
+	 * @param fileData
+	 */
+	public void onFileDoubleClicked(FileData fileData);
+
+	/**
+	 * Execute any action, that must be done before upload. For instance,
+	 * {@link PictureUploadPolicy} disable the rotation buttons during buttons.
+	 * The {@link DefaultUploadPolicy#beforeUpload()} method just returns true.
+	 * 
+	 * @return indicate if everything is ready for upload.
+	 */
+	public boolean beforeUpload();
+
+	/**
+	 * This method returns true, if upload is a success. A HTTP response of "200
+	 * OK" indicates that the server response is techically correct. But, it may
+	 * be a functionnal error. For instance, the server could answer by a proper
+	 * HTTP page, that the user is no allowed to upload files. It's up to the
+	 * uploadPolicy to check this, and answer true or false to this method. <br>
+	 * This method is called once for each HTTP request toward the server. For
+	 * instance, if the upload is done file by file, and there are three files
+	 * to upload, this method will be called three times. <br>
+	 * So this method is different from the
+	 * {@link #afterUpload(Exception, String)}, that will be called only once in
+	 * this case, after the three calls to the checkUploadSuccess method.
+	 * 
+	 * @param status
+	 *            The numeric response status (e.g. 200)
+	 * @param msg
+	 *            The status message from the first line of the response (e.g.
+	 *            "200 OK").
+	 * @param body
+	 *            The http body part (that is: the serverOuput without the http
+	 *            headers and the blank line that follow them).
+	 * @return true (or an exception is raised, instead of returning false).
+	 *         This garantees that all cases are handled: the compiler will
+	 *         indicate an error if the code can come to the end of the method,
+	 *         without finding a 'return' or a throw exception. This return code
+	 *         can be ignored by the caller.
+	 * @throws JUploadException
+	 *             Thrown if the success conditions are not met.
+	 */
+	public boolean checkUploadSuccess(int status, String msg, String body)
+			throws JUploadException;
+
+	/**
+	 * This method is called after an upload, whether it is successful or not.
+	 * This method is called once for each click of the user on the 'upload'
+	 * button. That is: if the nbFilesPerRequest is 2, and the user selected 5
+	 * files before clicking on the 'upload' button. Then the afterUpload is
+	 * called once the 5 files were uploaded to the server.
+	 * 
+	 * @param e
+	 *            null if success, or the exception indicating the problem.
+	 * @param serverOutput
+	 *            The full server output, including the HTTP headers.
+	 * @throws JUploadException
+	 */
+	public void afterUpload(Exception e, String serverOutput)
+			throws JUploadException;
+
+	/**
+	 * Returns the current locale. It is the default value at startup, based on
+	 * the local computer configuration. Then, if the lang applet parameter is
+	 * given, this method the Locale initialized from this lang parameter.
+	 * 
+	 * @return The current Locale for the current policy.
+	 */
+	public Locale getLocale();
+
+	/**
+	 * Retrieve a lang string, based on the file cointained in the
+	 * wjhk.jupload2.lang package. This allows localization.
+	 * 
+	 * @param key
+	 *            The key, whose associated text is to retrieve. This text must
+	 *            respect the constraints of the
+	 *            {@link String#format(String, Object...)} method, that is
+	 *            called in the
+	 *            {@link DefaultUploadPolicy#getLocalizedString(String, Object...)}
+	 *            implementation of this method.
+	 * @param args
+	 *            The optional parameters, that will replace the placeholders in
+	 *            the localized text identified by 'key'.
+	 * @return The associated text.
+	 */
+	public String getLocalizedString(String key, Object... args);
+
+	/**
+	 * Displays a MessageBox with a unique 'Ok' button, by calling the
+	 * {@link JOptionPane#showMessageDialog(java.awt.Component, Object)} method.
+	 * 
+	 * @param key
+	 *            The string identifying the text to display, depending on the
+	 *            current language.
+	 * @see #alertStr(String)
+	 */
+	public void alert(String key);
+
+	/**
+	 * Displays a MessageBox with a unique 'Ok' button, by calling the
+	 * {@link JOptionPane#showMessageDialog(java.awt.Component, Object)} method.
+	 * 
+	 * @param str
+	 *            The full String that must be displayed to the user.
+	 * @see #alert(String)
+	 */
+	public void alertStr(String str);
+
+	/**
+	 * Displays a MessageBox with a unique 'Ok' button, by calling the
+	 * {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)}
+	 * method.
+	 * 
+	 * @param str
+	 *            The full String that must be displayed to the user.
+	 * @param optionTypes
+	 *            The options indicating the button to display. Valid options
+	 *            are the options valid for the
+	 *            {@link JOptionPane#showConfirmDialog(java.awt.Component, Object, String, int)}
+	 *            method.
+	 * @return The JOptionConstant that indicates the button the user cliecked
+	 *         on (for instance OK_OPTION)
+	 * @see #alert(String)
+	 */
+	public int confirmDialogStr(String str, int optionTypes);
+
+	/**
+	 * Indicates that an error occurs.
+	 * 
+	 * @return The last Exception that occurs in the applet. null if no
+	 *         exception occurs.
+	 */
+	public JUploadException getLastException();
+
+	/**
+	 * Retrieve the body of the last server response.
+	 * 
+	 * @return The string containing the last server response (body);
+	 */
+	public String getLastResponseBody();
+
+	/**
+	 * Retrieve the status/error message of the last server response.
+	 * 
+	 * @return The string containing either the last server status or (if the
+	 *         error regex matches, the parsed error message.
+	 */
+	public String getLastResponseMessage();
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CoppermineUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CoppermineUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CoppermineUploadPolicy.java	(revision 3951)
@@ -0,0 +1,299 @@
+//
+// $Id: CoppermineUploadPolicy.java 143 2007-05-14 02:07:27 +0000 (lun., 14 mai
+// 2007) felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-07
+// Creator: etienne_sf
+// Last modified: $Date: 2010-07-08 08:57:30 -0300 (Qui, 08 Jul 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailed;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailedSuccessNotFound;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.filedata.PictureFileData;
+
+// TODO cookies handling: desc to be mve to UploadPolicy presentation.
+/**
+ * Specific UploadPolicy for the coppermine picture gallery. It is based on the
+ * PictureUploadPolicy, and some specific part to add the uploaded pictures to a
+ * coppermine existing album. <BR>
+ * Specific features for this policy are:
+ * <UL>
+ * <LI>Album handling : the setProperty("albumId", n) can be called from
+ * javascript, when the user selects another album (with n is the numeric id for
+ * the selected album). This needs that the MAYSCRIPT HTML parameter is set, in
+ * the APPLET tag (see the example below). The upload can not start if the user
+ * didn't first select an album.
+ * <LI>If an error occurs, the applet asks the user if he wants to send a mail
+ * to the webmaster. If he answered yes, the full debug output is submitted to
+ * the URL pointed by urlToSendErrorTo. This URL should send a mail to the
+ * manager of the Coppermine galery.
+ * </UL>
+ * <A NAME="example1"> <H3>Call of the applet from a php script in coppermine</H3>
+ * </A> You'll find below an example of how to put the applet into a PHP page: <BR>
+ * <XMP> <?php $URL = $CONFIG['site_url'] . 'xp_publish.php'; $lang =
+ * $lang_translation_info['lang_country_code']; $max_upl_width_height =
+ * $CONFIG['max_upl_width_height']; ?> <APPLET NAME="JUpload"
+ * CODE="wjhk.jupload2.JUploadApplet" ARCHIVE="plugins/jupload/wjhk.jupload.jar"
+ * <!-- Applet display size, on the navigator page --> WIDTH="500" HEIGHT="700"
+ * <!-- The applet call some javascript function, so we must allow it : -->
+ * MAYSCRIPT > <!-- First, mandatory parameters --> <PARAM NAME="postURL"
+ * VALUE="$URL"> <PARAM NAME="uploadPolicy" VALUE="CoppermineUploadPolicy"> <!--
+ * Then, optional parameters --> <PARAM NAME="lang" VALUE="$lang"> <PARAM
+ * NAME="maxPicHeight" VALUE="$max_upl_width_height"> <PARAM NAME="maxPicWidth"
+ * VALUE="$max_upl_width_height"> <PARAM NAME="debugLevel" VALUE="0"> Java 1.4
+ * or higher plugin required. </APPLET> </XMP> <A NAME="example1"> <H3>Example
+ * 2: albumId set by a javascript call.</H3> </A> <XMP> <script
+ * language="javascript" type="text/javascript"> function onAlbumChange() { if
+ * (document.form_album.album_id.selectedIndex >= 0) {
+ * document.applets['JUpload'].setProperty('albumId',
+ * document.form_album.album_id.value); document.form_album.album_name.value =
+ * document
+ * .form_album.album_id.options[document.form_album.album_id.selectedIndex
+ * ].text; document.form_album.album_description.value =
+ * description[document.form_album.album_id.value]; } else {
+ * document.JUpload.setProperty('albumId', '');
+ * document.form_album.album_name.value = '';
+ * document.form_album.album_description.value = ''; } } </script> </XMP>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1367 $
+ */
+public class CoppermineUploadPolicy extends PictureUploadPolicy {
+
+	/**
+	 * The coppermine's album id where picture must be uploaded.
+	 */
+	private int albumId;
+
+	/**
+	 * The number of pictures to download in the current upload. This number is
+	 * stored in the {@link #beforeUpload()} method, which is called at the
+	 * beginning of each upload.
+	 */
+	private int nbPictureInUpload = 0;
+
+	/**
+	 * @param juploadContext
+	 *            Identifier for the current applet. It's necessary, to read
+	 *            information from the navigator.
+	 * @throws JUploadException
+	 */
+	public CoppermineUploadPolicy(JUploadContext juploadContext)
+			throws JUploadException {
+		// Let's call our mother ! :-)
+		super(juploadContext);
+
+		// Let's read the albumId from the applet parameter. It can be unset,
+		// but the user must then choose
+		// an album before upload.
+		this.albumId = getContext().getParameter(PROP_ALBUM_ID,
+				DEFAULT_ALBUM_ID);
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#onFileSelected(wjhk.jupload2.filedata.FileData)
+	 */
+	@Override
+	public void onFileSelected(FileData fileData) {
+		if (fileData != null && fileData instanceof PictureFileData) {
+			// The selected file is a picture, we let PictureUploadPolicy manage
+			// it.
+			super.onFileSelected(fileData);
+		} else {
+			// he selected file is not a picture. We simulate the fact that no
+			// more picture is selected, so that the preview picture is cleared.
+			super.onFileSelected(null);
+		}
+	}
+
+	/**
+	 * This method only handles the <I>albumId</I> parameter, which is the only
+	 * applet parameter that is specific to this class. The super.setProperty
+	 * method is called for other properties.
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#setProperty(java.lang.String,
+	 *      java.lang.String)
+	 */
+	@Override
+	public void setProperty(String prop, String value) throws JUploadException {
+		displayDebug("[CoppermineUploadPolicy] Call of setProperty: " + prop
+				+ " => " + value, 30);
+
+		// Check if it's a local property.
+		if (prop.equals(PROP_ALBUM_ID)) {
+			this.albumId = getContext().parseInt(value, 0);
+			displayDebug("Post URL (modified in CoppermineUploadPolicy) = "
+					+ getPostURL(), 10);
+		} else {
+			// Otherwise, transmission to the mother class.
+			super.setProperty(prop, value);
+		}
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#getPostURL()
+	 */
+	@Override
+	public String getPostURL() {
+		// Within the coppermine PHP script, that contains the call to this
+		// applet, the postURL given contains the full URL, without the album
+		// id. So we ask for this postURL, and just concatenate the albumId on
+		// the fly.
+		String postURL = super.getPostURL();
+		return postURL + (postURL.contains("?") ? "&" : "?") + "album="
+				+ this.albumId;
+	}
+
+	/**
+	 * This method checks that an album id has been given, and then stores the
+	 * number of files that are to be uploaded, before upload, then call its
+	 * superclass. This number is then used to display to the user the list of
+	 * pictures he just uploaded.
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#beforeUpload()
+	 */
+	@Override
+	public boolean beforeUpload() {
+		if (this.albumId <= 0) {
+			alert("chooseAlbumFirst");
+			return false;
+		}
+
+		// We note the number of files to upload.
+		this.nbPictureInUpload = getContext().getUploadPanel().getFilePanel()
+				.getFilesLength();
+
+		// Default : Let's ask the mother.
+		return super.beforeUpload();
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#afterUpload(Exception, String) */
+	@Override
+	public void afterUpload(Exception e, String serverOutput)
+			throws JUploadException {
+		int nbPictureAfterUpload = getContext().getUploadPanel().getFilePanel()
+				.getFilesLength();
+		if (nbPictureAfterUpload > this.nbPictureInUpload) {
+			displayErr("CoppermineUploadPolicy.afterUpload: The number of uploaded files is negative! ("
+					+ (this.nbPictureInUpload - nbPictureAfterUpload) + ")");
+		} else if (nbPictureAfterUpload == this.nbPictureInUpload) {
+			displayWarn("CoppermineUploadPolicy.afterUpload: No file were uploaded! ("
+					+ (nbPictureAfterUpload - this.nbPictureInUpload) + ")");
+		} else if (getDebugLevel() >= 100) {
+			alertStr("No switch to property page, because debug level is "
+					+ getDebugLevel() + " (>=100)");
+		} else if (e == null) {
+			// Let's display an alert box, to explain what to do to the
+			// user: he will be redirected to the coppermine page that
+			// allow him to associate names and comments to the uploaded
+			// pictures.
+			alert("coppermineUploadOk");
+
+			// Let's change the afterUploadURL value, so we can call the
+			// standard afterUpload method (DefaultUploadPolicy).
+
+			// Since JUpload 4.2.0, CPG 1.5 upload is done againts the
+			// /upload.php script, to use
+			// the Coppermine upload API ofr plugins.
+			String postURL = getPostURL();
+			if (postURL.contains("/upload.php?")) {
+				setAfterUploadURL(postURL.substring(0, getPostURL()
+						.lastIndexOf("/upload.php?"))
+						+ "/index.php?file=jupload/jupload&action=edit_uploaded_pics&album="
+						+ this.albumId
+						+ "&nb_pictures="
+						+ (this.nbPictureInUpload - nbPictureAfterUpload));
+			} else {
+				setAfterUploadURL(postURL.substring(0, getPostURL()
+						.lastIndexOf('/'))
+						+ "/jupload&action=edit_uploaded_pics&album="
+						+ this.albumId
+						+ "&nb_pictures="
+						+ (this.nbPictureInUpload - nbPictureAfterUpload));
+			} // ... and call the standard behavior.
+			super.afterUpload(e, serverOutput);
+		}
+	}
+
+	/** @see DefaultUploadPolicy#checkUploadSuccess(int, String, String) */
+	public boolean checkUploadSuccess(int status, String msg, String body)
+			throws JUploadException {
+		try {
+			return super.checkUploadSuccess(status, msg, body);
+		} catch (JUploadExceptionUploadFailedSuccessNotFound e) {
+			// We got here, if the standard return analysis did not find any
+			// error or success status. Let's try a 'Coppermine specific'
+			// analysis now.
+			Pattern patternMessage = Pattern
+					.compile(".*cpg_user_message\">(.*)</span>");
+			Matcher matcherMessage;
+			String line;
+			Pattern pMultiline = Pattern.compile("[\\r\\n]", Pattern.MULTILINE);
+			String[] lines = pMultiline.split(body);
+			StringBuffer sbBodyWithUniformCRLF = new StringBuffer(body.length());
+			for (int i = 0; i < lines.length; i += 1) {
+				line = lines[i];
+				sbBodyWithUniformCRLF.append(line).append("\r\n");
+
+				// FIXME some empty lines are given by the server
+				// Let's remove the empty line: with the p pattern, a multiline
+				// is generated each time a \r\n is received, that is: for each
+				// line.
+				if (line == null || line.equals("")) {
+					// An empty line. Let's go the next line.
+					continue;
+				}
+
+				// Is it 'message line' ?
+				matcherMessage = patternMessage.matcher(line);
+				if (matcherMessage.matches()) {
+					String errmsg = "An error occurs during upload (but the applet couldn't find the error message)";
+					if (matcherMessage.groupCount() > 0) {
+						if (!matcherMessage.group(1).equals("")) {
+							// Let's do a (very simple) formatting: one line to
+							// 100 characters
+							errmsg = formatMessage(matcherMessage.group(1));
+						}
+					}
+					this.lastResponseMessage = errmsg;
+					throw new JUploadExceptionUploadFailed(errmsg);
+				}// if(matcherMessage.matches())
+			}// while(st.hasMoreTokens())
+
+			// We didn't find any precise message. Let's transmit the default
+			// one.
+			throw e;
+		}
+	}
+
+	/** @see DefaultUploadPolicy#displayParameterStatus() */
+	@Override
+	public void displayParameterStatus() {
+		super.displayParameterStatus();
+
+		displayDebug("======= Parameters managed by CoppermineUploadPolicy", 30);
+		displayDebug(PROP_ALBUM_ID + " : " + this.albumId, 30);
+		displayDebug("", 30);
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/DefaultUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/DefaultUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/DefaultUploadPolicy.java	(revision 3951)
@@ -0,0 +1,2698 @@
+//
+// $Id: DefaultUploadPolicy.java 289 2007-06-19 10:04:46 +0000 (mar., 19 juin
+// 2007) etienne_sf $
+//
+// jupload - A file upload juploadContext.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-04
+// Creator: etienne_sf
+// Last modified: $Date: 2010-08-18 08:23:24 -0300 (Qua, 18 Ago 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.awt.BorderLayout;
+import java.awt.Cursor;
+import java.awt.GridLayout;
+import java.awt.SystemColor;
+import java.awt.dnd.DropTargetDropEvent;
+import java.io.BufferedReader;
+import java.io.ByteArrayOutputStream;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.PrintStream;
+import java.io.UnsupportedEncodingException;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.charset.UnsupportedCharsetException;
+import java.util.IllegalFormatException;
+import java.util.Iterator;
+import java.util.Locale;
+import java.util.ResourceBundle;
+import java.util.Vector;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.regex.PatternSyntaxException;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.Icon;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JOptionPane;
+import javax.swing.JPanel;
+import javax.swing.JProgressBar;
+import javax.swing.UIManager;
+import javax.swing.UnsupportedLookAndFeelException;
+import javax.swing.border.BevelBorder;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionStopAddingFiles;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailed;
+import wjhk.jupload2.exception.JUploadExceptionUploadFailedSuccessNotFound;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.DefaultFileData;
+import wjhk.jupload2.filedata.FileData;
+import wjhk.jupload2.gui.JUploadFileChooser;
+import wjhk.jupload2.gui.JUploadFileFilter;
+import wjhk.jupload2.gui.JUploadPanel;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+import wjhk.jupload2.upload.helper.ByteArrayEncoderHTTP;
+import wjhk.jupload2.upload.helper.HTTPConnectionHelper;
+import wjhk.jupload2.upload.helper.HttpProtocolFinderThread;
+import wjhk.jupload2.upload.helper.InteractiveTrustManager;
+
+/**
+ * This class implements all {@link wjhk.jupload2.policies.UploadPolicy}
+ * methods. Its way of working is he same as the JUpload version 1. <BR>
+ * The simplest way to use this policy is given in the presentation of
+ * {@link UploadPolicy}. The DefaultUploadPolicy is used when no
+ * <I>uploadPolicy</I> parameter is given to the juploadContext, or this
+ * parameter has 'DefaultUploadPolicy' as a value. <BR>
+ * <P>
+ * The <U>default behavior</U> is representated below. It can be overridden by
+ * adding parameters to the juploadContext. All available parameters are shown
+ * in the presentation of {@link UploadPolicy}.
+ * </P>
+ * <UL>
+ * <LI>Default implementation for all
+ * {@link wjhk.jupload2.policies.UploadPolicy} methods.
+ * <LI>Files are uploaded all in one HTTP request.
+ * <LI>No handling for particular kind of files: files are transmitted without
+ * any transformation.
+ * <LI>The file are transmitted to the server with the navigator cookies,
+ * userAgent and Protocol (see also the readCookieFromNavigator and
+ * serverProtocol juploadContext parameter). This make upload occurs within the
+ * current user session on the server. So, it allows right management and
+ * context during the management of uploaded files, on the server.
+ * </UL>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1388 $
+ */
+
+public class DefaultUploadPolicy implements UploadPolicy {
+
+	/**
+	 * Maximum number of characters allowed for a message that is displayed in a
+	 * DialogBox
+	 */
+	public final static int DIALOG_MESSAGE_MAX_LINE_LENGTH = 80;
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// APPLET PARAMETERS
+	// ///////////////////////////////////////////////////
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * juploadContext contains the reference of the Applet. It's useful to
+	 * interact with it. <BR>
+	 * It also allows access to the navigator properties, if the html tag
+	 * MAYSCRIPT is put in the APPLET tag. This allows this class to get the
+	 * cookie, userAgent and protocol, to upload files in the current user
+	 * session on the server. <BR>
+	 * Default : no default value
+	 */
+	JUploadContext juploadContext = null;
+
+	/**
+	 * Contains the applet parameter of the same name. If a valid URL is given
+	 * here, the navigator will get redirected to this page, after a successful
+	 * upload.
+	 */
+	private String afterUploadURL = UploadPolicy.DEFAULT_AFTER_UPLOAD_URL;
+
+	/**
+	 * Contains the allowedFileExtensions applet parameter.
+	 */
+	private boolean allowHttpPersistent = UploadPolicy.DEFAULT_ALLOW_HTTP_PERSISTENT;
+
+	/**
+	 * Contains the allowedFileExtensions applet parameter.
+	 */
+	private String allowedFileExtensions = UploadPolicy.DEFAULT_ALLOWED_FILE_EXTENSIONS;
+
+	/**
+	 * Indicate whether the log window is shown or not to the user. In all cases
+	 * it remains in memory, and stores all debug information. This allows a log
+	 * information, in case of an error occurs.
+	 * 
+	 * @see #urlToSendErrorTo
+	 */
+	private String showLogWindow = UploadPolicy.DEFAULT_SHOW_LOGWINDOW;
+
+	private boolean showStatusbar = UploadPolicy.DEFAULT_SHOW_STATUSBAR;
+
+	private String specificHeaders = null;
+
+	/** Indicates the directory in which the file chooser is to be opened */
+	private File currentBrowsingDirectory = null;
+
+	/**
+	 * This parameter controls whether the applet generates a debug file or not.
+	 * If true, this file contains the full debug output, whatever the current
+	 * debugLevel is.
+	 */
+	private boolean debugGenerateFile = true;
+
+	/**
+	 * The current debug level. This control the details of information that is
+	 * written in the log part of the applet.
+	 */
+	private int debugLevel = UploadPolicy.DEFAULT_DEBUG_LEVEL;
+
+	/**
+	 * Stored value for the fileChooserIconFromFileContent applet property.
+	 * 
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+	 */
+	private int fileChooserIconFromFileContent = UploadPolicy.DEFAULT_FILE_CHOOSER_ICON_FROM_FILE_CONTENT;
+
+	/**
+	 * Stored value for the fileChooserIconSize applet property.
+	 * 
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_SIZE
+	 */
+	private int fileChooserIconSize = UploadPolicy.DEFAULT_FILE_CHOOSER_ICON_SIZE;
+
+	/**
+	 * Stored value for the {@link UploadPolicy#PROP_FILE_FILTER_NAME}
+	 */
+	private String fileFilterName = UploadPolicy.DEFAULT_FILE_FILTER_NAME;
+	/**
+	 * This String contains the filenameEncoding parameter. All details about
+	 * the available applet parameters are displayed in the <a
+	 * href="UploadPolicy.html@parameters">Upload Policy javadoc page</a>.
+	 */
+	private String filenameEncoding = UploadPolicy.DEFAULT_FILENAME_ENCODING;
+
+	/**
+	 * Default value for the ftpCreateDirectoryStructure applet parameter
+	 */
+	private boolean ftpCreateDirectoryStructure = UploadPolicy.DEFAULT_FTP_CREATE_DIRECTORY_STRUCTURE;
+
+	/**
+	 * Default value for the ftpCreateDirectoryStructure applet parameter
+	 */
+	private boolean ftpTransfertBinary = UploadPolicy.DEFAULT_FTP_TRANSFERT_BINARY;
+
+	/**
+	 * Default value for the ftpCreateDirectoryStructure applet parameter
+	 */
+	private boolean ftpTransfertPassive = UploadPolicy.DEFAULT_FTP_TRANSFERT_PASSIVE;
+
+	/** Default value for the httpUploadParameterName applet parameter */
+	protected String httpUploadParameterName = UploadPolicy.DEFAULT_HTTP_UPLOAD_PARAMETER_NAME;
+
+	/** Default value for the httpUploadParameterType applet parameter */
+	protected String httpUploadParameterType = UploadPolicy.DEFAULT_HTTP_UPLOAD_PARAMETER_TYPE;
+
+	/**
+	 * The lang parameter, given to the applet.
+	 */
+	private String lang = UploadPolicy.DEFAULT_LANG;
+
+	/**
+	 * The current Locale. If the lang parameter is given and value, this
+	 * supersede the default locale.
+	 */
+	private Locale locale = Locale.getDefault();
+
+	/**
+	 * Contains the last exception that occurs in the applet.
+	 * 
+	 * @see #displayErr(String, Exception)
+	 */
+	private JUploadException lastException = null;
+
+	/**
+	 * The look and feel is used as a parameter of the
+	 * UIManager.setLookAndFeel(String) method. See the parameters list on the
+	 * {@link UploadPolicy} page.
+	 */
+	private String lookAndFeel = UploadPolicy.DEFAULT_LOOK_AND_FEEL;
+
+	/**
+	 * The applet will do as may HTTP requests to upload all files, with the
+	 * number as a maximum number of files for each HTTP request. <BR>
+	 * Default : -1
+	 */
+	private int nbFilesPerRequest = UploadPolicy.DEFAULT_NB_FILES_PER_REQUEST;
+
+	/**
+	 * Current value (or default value) of the maxChunkSize applet parameter. <BR>
+	 * Default : Long.MAX_VALUE
+	 */
+	private long maxChunkSize = UploadPolicy.DEFAULT_MAX_CHUNK_SIZE;
+
+	/**
+	 * Current value (or default value) of the maxFileSize applet parameter. <BR>
+	 * Default : Long.MAX_VALUE
+	 */
+	private long maxFileSize = UploadPolicy.DEFAULT_MAX_FILE_SIZE;
+
+	/**
+	 * The URL where files should be posted. <BR>
+	 * Default : no default value. (mandatory)
+	 */
+	private String postURL = UploadPolicy.DEFAULT_POST_URL;
+
+	/** @see UploadPolicy#getReadCookieFromNavigator() */
+	private boolean readCookieFromNavigator = UploadPolicy.DEFAULT_READ_COOKIE_FROM_NAVIGATOR;
+
+	/** @see UploadPolicy#getReadUserAgentFromNavigator() */
+	private boolean readUserAgentFromNavigator = UploadPolicy.DEFAULT_READ_USER_AGENT_FROM_NAVIGATOR;
+
+	/** @see UploadPolicy#getRetryMaxNumberOf() */
+	private int retryMaxNumberOf = UploadPolicy.DEFAULT_RETRY_MAX_NUMBER_OF;
+
+	/** @see UploadPolicy#getRetryNbSecondsBetween() */
+	private int retryNbSecondsBetween = UploadPolicy.DEFAULT_RETRY_NB_SECONDS_BETWEEN;
+
+	/** @see UploadPolicy#getSendMD5Sum() */
+	private boolean sendMD5Sum = UploadPolicy.DEFAULT_SEND_MD5_SUM;
+
+	/** @see UploadPolicy#getServerProtocol() */
+	private String serverProtocol = UploadPolicy.DEFAULT_SERVER_PROTOCOL;
+
+	/**
+	 * @see UploadPolicy#getStringUploadError()
+	 */
+	private String stringUploadError = UploadPolicy.DEFAULT_STRING_UPLOAD_ERROR;
+
+	/**
+	 * @see UploadPolicy#getStringUploadSuccess()
+	 */
+	private String stringUploadSuccess = UploadPolicy.DEFAULT_STRING_UPLOAD_SUCCESS;
+
+	/**
+	 * @see UploadPolicy#getStringUploadWarning()
+	 */
+	private String stringUploadWarning = UploadPolicy.DEFAULT_STRING_UPLOAD_WARNING;
+
+	/**
+	 * If an error occurs during upload, and this attribute is not null, the
+	 * applet asks the user if wants to send the debug ouput to the
+	 * administrator. If yes, the full debug information is POSTed to this URL.
+	 * It's a little development on the server side to send a mail to the
+	 * webmaster, or just log this error into a log file.
+	 * 
+	 * @see UploadPolicy#sendDebugInformation(String, Exception)
+	 */
+	private String urlToSendErrorTo = UploadPolicy.DEFAULT_URL_TO_SEND_ERROR_TO;
+
+	/**
+	 * Optional name of a form (in the same document like the applet) which is
+	 * used to populate POST parameters.
+	 */
+	private String formData = UploadPolicy.DEFAULT_FORMDATA;
+
+	private String afterUploadTarget = UploadPolicy.DEFAULT_AFTER_UPLOAD_TARGET;
+
+	private String lastResponseBody = null;
+
+	protected String lastResponseMessage = null;
+
+	private int sslVerifyCert = InteractiveTrustManager.NONE;
+
+	private final String CRLF = System.getProperty("line.separator");
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// INTERNAL ATTRIBUTE
+	// ///////////////////////////////////////////////////
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * This Vector contains headers that will be added for each upload. It may
+	 * contains specific cookies, for instance.
+	 * 
+	 * @see #onAppendHeader(ByteArrayEncoder)
+	 */
+	private Vector<String> headers = new Vector<String>();
+
+	/**
+	 * The resourceBundle contains all localized String (and others ??)
+	 */
+	private ResourceBundle resourceBundle = null;
+
+	/**
+	 * This stream is used to store all information that could be useful, in
+	 * case a problem occurs. Is content can then be sent to the webmaster.
+	 */
+	protected PrintStream debugOut = null;
+
+	/**
+	 * The actual file, used for the debug log.
+	 * 
+	 * @see #debugGenerateFile
+	 */
+	protected File debugFile = null;
+
+	/**
+	 * This flag prevents endless repeats of opening the debug log, if that
+	 * failed for some reason.
+	 */
+	protected boolean debugOk = true;
+
+	/**
+	 * Same as {@link #patternSuccess}, but for the error message. If found,
+	 * then the upload was accepted by the remote HTTP server, but rejected by
+	 * the remote application. This pattern should also find the error message
+	 * in the first matching string.
+	 */
+	protected Pattern patternError = Pattern
+			.compile(UploadPolicy.DEFAULT_STRING_UPLOAD_ERROR);
+
+	/**
+	 * The regexp pattern that is used to find the success string in the HTTP
+	 * response. If found, the upload is considered to be a success: it has been
+	 * accepted by the remote server and the remote application.
+	 */
+	protected Pattern patternSuccess = Pattern
+			.compile(UploadPolicy.DEFAULT_STRING_UPLOAD_SUCCESS);
+
+	/**
+	 * Same as {@link #patternSuccess}, but for the warning message. Each time
+	 * it is found, a message is displayed to the user.
+	 */
+	protected Pattern patternWarning = Pattern
+			.compile(UploadPolicy.DEFAULT_STRING_UPLOAD_WARNING);
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// CONSTRUCTORS
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * The main constructor : use default values, and the given postURL.
+	 * 
+	 * @param juploadContext
+	 *            The current juploadContext. As the reference to the current
+	 *            upload policy exists almost everywhere, this parameter allows
+	 *            any access to anyone on the juploadContext... including
+	 *            reading the applet parameters.
+	 * @throws JUploadException
+	 *             If an applet parameter is invalid
+	 */
+	public DefaultUploadPolicy(JUploadContext juploadContext)
+			throws JUploadException {
+		// Call default constructor for all default initialization;.
+		this.juploadContext = juploadContext;
+		displayInfo("JUpload juploadContext started, with "
+				+ this.getClass().getName() + " upload policy");
+
+		// get the debug level. This control the level of debug messages that
+		// are written in the log window (see displayDebugMessage). In all
+		// cases, the full output is written in the debugBufferString (see also
+		// urlToSendErrorTo)
+		setDebugLevel(juploadContext.getParameter(PROP_DEBUG_LEVEL,
+				DEFAULT_DEBUG_LEVEL), false);
+
+		// Get resource file. This must be the very first parameter to be set,
+		// because during initialization, translations may be needed.
+		setLang(juploadContext.getParameter(PROP_LANG, DEFAULT_LANG));
+
+		// Force the look and feel of the current system. This must be the
+		// second
+		// first parameter to be set, because during initialization, dialogs can
+		// appear.
+		setLookAndFeel(juploadContext.getParameter(PROP_LOOK_AND_FEEL,
+				DEFAULT_LOOK_AND_FEEL));
+
+		// This must be set before any URL's because these might trigger an
+		// connection attempt.
+		setSslVerifyCert(juploadContext.getParameter(PROP_SSL_VERIFY_CERT,
+				DEFAULT_SSL_VERIFY_CERT));
+
+		// get the afterUploadURL juploadContext parameter.
+		setAfterUploadURL(juploadContext.getParameter(PROP_AFTER_UPLOAD_URL,
+				DEFAULT_AFTER_UPLOAD_URL));
+
+		// FTP: whether or not to create subfolders on the server side.
+		setFtpCreateDirectoryStructure(juploadContext.getParameter(
+				PROP_FTP_CREATE_DIRECTORY_STRUCTURE,
+				DEFAULT_FTP_CREATE_DIRECTORY_STRUCTURE));
+		// FTP transfert mode
+		setFtpTransfertBinary(juploadContext.getParameter(
+				PROP_FTP_TRANSFERT_BINARY, DEFAULT_FTP_TRANSFERT_BINARY));
+		// FTP connection mode
+		setFtpTransfertPassive(juploadContext.getParameter(
+				PROP_FTP_TRANSFERT_PASSIVE, DEFAULT_FTP_TRANSFERT_PASSIVE));
+
+		// get the fileChooser parameters
+		setAllowedFileExtensions(juploadContext.getParameter(
+				PROP_ALLOWED_FILE_EXTENSIONS, DEFAULT_ALLOWED_FILE_EXTENSIONS));
+		setFileFilterName(juploadContext.getParameter(PROP_FILE_FILTER_NAME,
+				DEFAULT_FILE_FILTER_NAME));
+
+		setAllowHttpPersistent(juploadContext.getParameter(
+				PROP_ALLOW_HTTP_PERSISTENT, DEFAULT_ALLOW_HTTP_PERSISTENT));
+
+		setShowStatusbar(juploadContext.getParameter(PROP_SHOW_STATUSBAR,
+				DEFAULT_SHOW_STATUSBAR));
+
+		setShowLogWindow(juploadContext.getParameter(PROP_SHOW_LOGWINDOW,
+				DEFAULT_SHOW_LOGWINDOW));
+
+		// set the fileChooser relative stuff.
+		setFileChooserIconFromFileContent(juploadContext.getParameter(
+				PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT,
+				DEFAULT_FILE_CHOOSER_ICON_FROM_FILE_CONTENT));
+		setFileChooserIconSize(juploadContext.getParameter(
+				PROP_FILE_CHOOSER_ICON_SIZE, DEFAULT_FILE_CHOOSER_ICON_SIZE));
+		setCurrentBrowsingDirectory(juploadContext.getParameter(
+				PROP_BROWSING_DIRECTORY, DEFAULT_BROWSING_DIRECTORY));
+		// get the filenameEncoding. If not null, it should be a valid argument
+		// for the URLEncoder.encode method.
+		// DEPRECATED.
+		setFilenameEncoding(juploadContext.getParameter(PROP_FILENAME_ENCODING,
+				DEFAULT_FILENAME_ENCODING));
+
+		// Read parameters about the HTTP upload request.
+		setNbFilesPerRequest(juploadContext.getParameter(
+				PROP_NB_FILES_PER_REQUEST, DEFAULT_NB_FILES_PER_REQUEST));
+		setHttpUploadParameterName(juploadContext.getParameter(
+				PROP_HTTP_UPLOAD_PARAMETER_NAME,
+				DEFAULT_HTTP_UPLOAD_PARAMETER_NAME));
+		setHttpUploadParameterType(juploadContext.getParameter(
+				PROP_HTTP_UPLOAD_PARAMETER_TYPE,
+				DEFAULT_HTTP_UPLOAD_PARAMETER_TYPE));
+		// get the maximum size of a file on one HTTP request (indicates if the
+		// file must be splitted before upload, see UploadPolicy comment).
+		setMaxChunkSize(juploadContext.getParameter(PROP_MAX_CHUNK_SIZE,
+				DEFAULT_MAX_CHUNK_SIZE));
+		// get the maximum size of an uploaded file.
+		setMaxFileSize(juploadContext.getParameter(PROP_MAX_FILE_SIZE,
+				DEFAULT_MAX_FILE_SIZE));
+		// retry management
+		setRetryMaxNumberOf(juploadContext.getParameter(
+				PROP_RETRY_MAX_NUMBER_OF, DEFAULT_RETRY_MAX_NUMBER_OF));
+		setRetryNbSecondsBetween(juploadContext
+				.getParameter(PROP_RETRY_NB_SECONDS_BETWEEN,
+						DEFAULT_RETRY_NB_SECONDS_BETWEEN));
+
+		// get the URL where files must be posted.
+		setPostURL(juploadContext.getParameter(PROP_POST_URL, DEFAULT_POST_URL));
+
+		// get any additional headers.
+		setReadCookieFromNavigator(juploadContext.getParameter(
+				PROP_READ_COOKIE_FROM_NAVIGATOR,
+				DEFAULT_READ_COOKIE_FROM_NAVIGATOR));
+		setReadUserAgentFromNavigator(juploadContext.getParameter(
+				PROP_READ_USER_AGENT_FROM_NAVIGATOR,
+				DEFAULT_READ_USER_AGENT_FROM_NAVIGATOR));
+		setSendMD5Sum(juploadContext.getParameter(PROP_SEND_MD5_SUM,
+				DEFAULT_SEND_MD5_SUM));
+		setSpecificHeaders(juploadContext.getParameter(PROP_SPECIFIC_HEADERS,
+				DEFAULT_SPECIFIC_HEADERS));
+		setStringUploadError(juploadContext.getParameter(
+				PROP_STRING_UPLOAD_ERROR, DEFAULT_STRING_UPLOAD_ERROR));
+		setStringUploadSuccess(juploadContext.getParameter(
+				PROP_STRING_UPLOAD_SUCCESS, DEFAULT_STRING_UPLOAD_SUCCESS));
+		setStringUploadWarning(juploadContext.getParameter(
+				PROP_STRING_UPLOAD_WARNING, DEFAULT_STRING_UPLOAD_WARNING));
+
+		// get the URL where the full debug output can be sent when an error
+		// occurs.
+		setUrlToSendErrorTo(juploadContext.getParameter(
+				PROP_URL_TO_SEND_ERROR_TO, DEFAULT_URL_TO_SEND_ERROR_TO));
+		this.formData = juploadContext.getParameter(PROP_FORMDATA,
+				DEFAULT_FORMDATA);
+		this.afterUploadTarget = juploadContext.getParameter(
+				PROP_AFTER_UPLOAD_TARGET, DEFAULT_AFTER_UPLOAD_TARGET);
+
+		// Let's touch the server, to test that everything is Ok. Take care,
+		// this is the only place where we override the default value, by null:
+		// the default value will be used by the HttpConnect.getProtocol()
+		// method.
+		// Also, in FTP mode, there can be no default value.
+		HttpProtocolFinderThread.computeServerProtocol(this, juploadContext
+				.getParameter(PROP_SERVER_PROTOCOL, null));
+
+		// We let the UploadPolicyFactory call the displayParameterStatus
+		// method, so that the initialization is finished, including for classes
+		// which inherit from DefaultUploadPolicy.
+		displayDebug(
+				"[DefaultUploadPolicy] end of constructor (serverProtocol has been set)",
+				30);
+	}
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// UploadPolicy methods
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/** @see UploadPolicy#start() */
+	public void start() {
+		// The current context may add any specific headers.
+		if (getReadCookieFromNavigator()) {
+			this.juploadContext.readCookieFromNavigator(this.headers);
+		}
+		if (getReadUserAgentFromNavigator()) {
+			this.juploadContext.readUserAgentFromNavigator(this.headers);
+		}
+	}
+	
+	
+	// getters and setters are sorted below
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#addHeader(java.lang.String)
+	 */
+	public void addHeader(String header) {
+		this.headers.add(header);
+	}
+
+	/**
+	 * The default behavior (see {@link DefaultUploadPolicy}) is to check that
+	 * the stringUploadSuccess applet parameter is present in the response from
+	 * the server. The return is tested, in the order below: <DIR> <LI>False, if
+	 * the stringUploadError is found. An error message is then displayed. <LI>
+	 * True, if the stringUploadSuccess is null or empty (no test at all). <LI>
+	 * True, if the stringUploadSuccess string is present in the
+	 * serverOutputBody. <LI>True, If previous condition is not filled, but the
+	 * HTTP header "HTTP(.*)200OK$" is present: the test is currently non
+	 * blocking, because I can not test all possible HTTP configurations.<BR>
+	 * <LI>False if the previous conditions are not fullfilled. </DIR> <BR>
+	 * This method also looks for the stringUploadWarning regular expression.
+	 * Each time it is matched, the found message is displayed to the user.
+	 * 
+	 * @param status
+	 *            The HTTP response code
+	 * @param msg
+	 *            The status message from the first line of the response (e.g.
+	 *            "200 OK").
+	 * @param body
+	 *            The body of the HTTP answer.
+	 * @return True or False, indicating if the upload is a success or not.
+	 * @see UploadPolicy#checkUploadSuccess(int, String, String)
+	 */
+	public boolean checkUploadSuccess(int status, String msg, String body)
+			throws JUploadException {
+		boolean bReturn = false;
+
+		if (getDebugLevel() > 100) {
+			// Let's have a little time to check the upload messages written on
+			// the progress bar.
+			try {
+				Thread.sleep(300);
+			} catch (InterruptedException e) {
+			}
+		}
+
+		this.lastResponseBody = body;
+		this.lastResponseMessage = msg;
+		displayDebug("HTTP status: " + msg, 30);
+		// HTTP-100 correction, thanks to Marc Reidy
+		if ((status != 200) && (status != 100))
+			throw new JUploadExceptionUploadFailed("Received HTTP status "
+					+ msg);
+
+                // HTTP-100 "continue", in case we're uploading
+                // to an ASP.NET development server. We should
+                // continue sending...
+                if(status == 100)
+                    return true;
+
+		// Let's analyze the body returned, line by line. The end of line
+		// character may be CR, LF, or CRLF. We navigate through the body, and
+		// replace any end of line character by a uniform CRLF.
+		Matcher matcherError, matcherWarning;
+		String line;
+		Pattern p = Pattern.compile("[\\r\\n]", Pattern.MULTILINE);
+		String[] lines = p.split(body);
+		StringBuffer sbBodyWithUniformCRLF = new StringBuffer(body.length());
+		for (int i = 0; i < lines.length; i += 1) {
+			line = lines[i];
+			sbBodyWithUniformCRLF.append(line).append("\r\n");
+
+			// FIXME some empty lines are given by the server
+			// Let's remove the empty line: with the p pattern, a multiline is
+			// generated each time a \r\n is received, that is: for each line.
+			if (line == null || line.equals("")) {
+				// An empty line. Let's go the next line.
+				continue;
+			}
+
+			// Check if this is a success
+			// The success string should be in the http body
+			if (getStringUploadSuccess() != null
+					&& !getStringUploadSuccess().equals("")) {
+				if (this.patternSuccess.matcher(line).matches()) {
+					// We go on. There may be some WARNING message, hereafter.
+					bReturn = true;
+				}
+			}
+
+			// Check if this is an error
+			if (getStringUploadError() != null
+					&& !getStringUploadError().equals("")) {
+				matcherError = this.patternError.matcher(line);
+				if (matcherError.matches()) {
+					String errmsg = "An error occurs during upload (but the applet couldn't find the error message)";
+					if (matcherError.groupCount() > 0) {
+						if (!matcherError.group(1).equals("")) {
+							// Let's do a (very simple) formatting: one line to
+							// 100 characters
+							errmsg = formatMessage(matcherError.group(1));
+						}
+					}
+					this.lastResponseMessage = errmsg;
+					throw new JUploadExceptionUploadFailed(errmsg);
+				}
+			}// getStringUploadError
+
+			// Check if this is an warning
+			if (getStringUploadWarning() != null
+					&& !getStringUploadWarning().equals("")) {
+				matcherWarning = this.patternWarning.matcher(line);
+				if (matcherWarning.matches()) {
+					String warnmsg = "A warning occurs during upload (but the applet couldn't find the warning message)";
+					if (matcherWarning.groupCount() > 0) {
+						if (!matcherWarning.group(1).equals("")) {
+							warnmsg = formatMessage(matcherWarning.group(1));
+						}
+					}
+					this.lastResponseMessage = warnmsg;
+					displayWarn(warnmsg);
+					alertStr(warnmsg);
+				}
+			}// getStringUploadWarning
+
+		}// while(st.hasMoreTokens())
+
+		if (bReturn) {
+			return true;
+		}
+
+		// We found no stringUploadSuccess nor stringUploadError
+		if (getStringUploadSuccess() == null
+				|| getStringUploadSuccess().equals("")) {
+			// No chance to check the correctness of this upload. -> Assume Ok
+			return true;
+		}
+
+		// stringUploadSuccess was defined but we did not find it.
+		// This is most certainly an error as http-status 200 does *not* refer
+		// to the correctness of the content. It merely means that the protocol
+		// handling was ok. -> throw an exception
+		throw new JUploadExceptionUploadFailedSuccessNotFound(getClass()
+				.getName()
+				+ ".checkUploadSuccess(): The regexp string \""
+				+ getStringUploadSuccess()
+				+ "\" was not found in the response body");
+	} // checkUploadSuccess
+
+	/**
+	 * Generation of a formatted error message, so that it can be displayed in a
+	 * DialogBox. That is: each line that contains more than
+	 * {@link #DIALOG_MESSAGE_MAX_LINE_LENGTH} is truncated to
+	 * DIALOG_MESSAGE_MAX_LINE_LENGTH.
+	 * 
+	 * @param msg
+	 * @return
+	 */
+	protected String formatMessage(String msg) {
+		StringBuffer sbMsg = new StringBuffer();
+		String[] lines = msg.split("\\\\n");
+		for (int i = 0; i < lines.length; i += 1) {
+			// For each line, we truncate it, if it's too long.
+			String line = lines[i];
+			for (int j = 0, remaining = line.length(); remaining > 0; remaining -= DIALOG_MESSAGE_MAX_LINE_LENGTH, j += 1) {
+				if (remaining <= DIALOG_MESSAGE_MAX_LINE_LENGTH) {
+					// It's the last loop.
+					sbMsg.append(line.substring(j
+							* DIALOG_MESSAGE_MAX_LINE_LENGTH));
+				} else {
+					sbMsg.append(line.substring(j
+							* DIALOG_MESSAGE_MAX_LINE_LENGTH, (j + 1)
+							* DIALOG_MESSAGE_MAX_LINE_LENGTH));
+					sbMsg.append("\n");
+				}
+			}
+			// End we add the EOL characters, for all lines, but the last one.
+			if (i < lines.length - 1) {
+				sbMsg.append("\n");
+			}
+		}
+
+		return sbMsg.toString();
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#afterUpload(Exception, String)
+	 */
+	public void afterUpload(Exception e, String serverOutput)
+			throws JUploadException {
+		// If there was no error, and afterUploadURL is defined, let's try to go
+		// to this URL.
+		String url = getAfterUploadURL();
+		if (url != null) {
+			this.juploadContext.displayURL(url, e == null);
+		}
+	}
+
+	/** @see UploadPolicy#alertStr(String) */
+	public void alertStr(String str) {
+		String str2 = str.replaceAll("\\\\n", "\n");
+		JOptionPane.showMessageDialog(null, str2, "Alert",
+				JOptionPane.WARNING_MESSAGE);
+	}
+
+	/** @see UploadPolicy#confirmDialogStr(String, int) */
+	public int confirmDialogStr(String str, int optionTypes) {
+		String str2 = str.replaceAll("\\\\n", "\n");
+		return JOptionPane.showConfirmDialog(getContext().getUploadPanel()
+				.getJComponent().getParent(), str2, "Alert", optionTypes);
+	}
+
+	/** @see UploadPolicy#alert(String) */
+	public void alert(String key) {
+		alertStr(getLocalizedString(key));
+	}
+
+	/**
+	 * The DefaultUpload accepts all file types: we just return an instance of
+	 * FileData, without any test.
+	 * 
+	 * @exception JUploadExceptionStopAddingFiles
+	 *                If the users choosed to stop adding. This occurs when the
+	 *                {@link #fileFilterAccept(File)} method returns false, and
+	 *                the user then choose to stop adding files.
+	 * @see UploadPolicy#createFileData(File, File)
+	 */
+	public FileData createFileData(File file, File root)
+			throws JUploadExceptionStopAddingFiles {
+		if (!fileFilterAccept(file)) {
+			String msg = file.getName() + " : "
+					+ getLocalizedString("errForbiddenExtension");
+			displayWarn(msg);
+			if (confirmDialogStr(msg, JOptionPane.OK_CANCEL_OPTION) == JOptionPane.CANCEL_OPTION) {
+				// The user want to stop to add files to the list. For instance,
+				// when he/she added a whole directory, and it contains a lot of
+				// files that don't match the allowed file extension.
+				throw new JUploadExceptionStopAddingFiles("Stopped by the user");
+			}
+			return null;
+		} else if (!file.canRead()) {
+			displayInfo("Can't read file " + file.getName()
+					+ ". No DefaultFileData creation.");
+			return null;
+		} else {
+			return new DefaultFileData(file, root, this);
+		}
+	}
+
+	/**
+	 * Default implementation of
+	 * {@link wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
+	 * . IT creates a JPanel, containing the three given JButton. It creates the
+	 * same panel as the original JUpload.
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton,
+	 *      JButton, JUploadPanel)
+	 */
+	public JPanel createTopPanel(JButton browse, JButton remove,
+			JButton removeAll, JUploadPanel jUploadPanel) {
+		JPanel jPanel = new JPanel();
+
+		jPanel.setLayout(new GridLayout(1, 3, 10, 5));
+		jPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
+		jPanel.add(browse);
+		jPanel.add(removeAll);
+		jPanel.add(remove);
+
+		jUploadPanel.getJComponent().setBorder(
+				BorderFactory.createLineBorder(SystemColor.controlDkShadow));
+
+		return jPanel;
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#createProgressPanel(JProgressBar,
+	 *      JProgressBar, JButton, JButton, JUploadPanel)
+	 */
+	public JPanel createProgressPanel(JProgressBar preparationProgressBar,
+			JProgressBar uploadProgressBar, JButton uploadButton,
+			JButton stopButton, JUploadPanel mainPanel) {
+
+		// There may be two progress bar: one for preparation progress of files
+		// (preparation before upload) and one to follow the actual upload.
+		JPanel jProgressBarPanel = new JPanel();
+		jProgressBarPanel.setLayout(new BorderLayout(10, 1));
+		jProgressBarPanel.add(preparationProgressBar, BorderLayout.NORTH);
+		jProgressBarPanel.add(uploadProgressBar, BorderLayout.SOUTH);
+
+		JPanel jProgressPanel = new JPanel();
+		jProgressPanel.setLayout(new BorderLayout(10, 0));
+		jProgressPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
+		jProgressPanel.add(uploadButton, BorderLayout.LINE_START);
+		jProgressPanel.add(jProgressBarPanel, BorderLayout.CENTER);
+		jProgressPanel.add(stopButton, BorderLayout.LINE_END);
+		return jProgressPanel;
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#createStatusBar(javax.swing.JLabel,
+	 *      JUploadPanel)
+	 */
+	public JPanel createStatusBar(JLabel content, JUploadPanel mainPanel) {
+		if (this.showStatusbar) {
+			JPanel pstatus = new JPanel();
+			pstatus.setLayout(new BorderLayout());
+			pstatus.add(content, BorderLayout.CENTER);
+			pstatus.setBorder(new BevelBorder(BevelBorder.LOWERED));
+			return pstatus;
+		}
+		return null;
+	}
+
+	/**
+	 * This methods allow the upload policy to override the default disposition
+	 * of the components on the applet.
+	 * 
+	 * @see UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)
+	 */
+	public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel) {
+		// Set the global layout of the panel.
+		jUploadPanel.getJComponent().setLayout(
+				new BoxLayout(jUploadPanel.getJComponent(), BoxLayout.Y_AXIS));
+
+		// The top panel is the upper part of the applet: above the file
+		// list.
+		// JPanel topPanel = new JPanel();
+		JPanel topPanel = createTopPanel(jUploadPanel.getBrowseButton(),
+				jUploadPanel.getRemoveButton(), jUploadPanel
+						.getRemoveAllButton(), jUploadPanel);
+		if (topPanel != null) {
+			jUploadPanel.getJComponent().add(topPanel);
+			topPanel.addMouseListener(jUploadPanel.getMouseListener());
+		}
+
+		// Then, we add the file list.
+		jUploadPanel.getJComponent().add(
+				jUploadPanel.getFilePanel().getDropComponent());
+
+		// The progress panel contains the progress bar, and the upload and stop
+		// buttons.
+		JPanel progressPanel = createProgressPanel(jUploadPanel
+				.getPreparationProgressBar(), jUploadPanel
+				.getUploadProgressBar(), jUploadPanel.getUploadButton(),
+				jUploadPanel.getStopButton(), jUploadPanel);
+		jUploadPanel.getJComponent().add(progressPanel);
+		jUploadPanel.getJComponent().addMouseListener(
+				jUploadPanel.getMouseListener());
+
+		// Now, we add the log window.
+		jUploadPanel.showOrHideLogWindow();
+		jUploadPanel.getJComponent().add(jUploadPanel.getJLogWindowPane());
+
+		// And, to finish with: the status bar.
+		JPanel p = createStatusBar(jUploadPanel.getStatusLabel(), jUploadPanel);
+		if (null != p) {
+			jUploadPanel.getJComponent().add(p);
+			p.addMouseListener(jUploadPanel.getMouseListener());
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void updateButtonState(int executionStatus) {
+		// First step: check the parameter.
+		if (executionStatus != UploadPolicy.EXEC_STATUS_READY
+				&& executionStatus != UploadPolicy.EXEC_STATUS_UPLOADING) {
+			throw new java.lang.IllegalArgumentException(
+					"Unknow value for executionStatus: " + executionStatus);
+		}
+
+		// Then ... nothing to do! This class has no specific GUI item.
+	}
+
+	/** @see UploadPolicy#displayErr(Exception) */
+	public void displayErr(Exception e) {
+		displayErr(e.getMessage(), e);
+	}
+
+	/** @see UploadPolicy#displayErr(String) */
+	public void displayErr(String err) {
+		displayErr(err, null);
+	}
+
+	/**
+	 * Logs a stack trace for the given exception.
+	 * 
+	 * @param throwable
+	 */
+	private void displayStackTrace(Throwable throwable) {
+		if (throwable != null) {
+			ByteArrayOutputStream bs = new ByteArrayOutputStream();
+			PrintStream ps = new PrintStream(bs);
+			throwable.printStackTrace(ps);
+			ps.close();
+			displayMsg("", bs.toString());
+
+			// If there is a cause, let's be sure its stack trace is displayed.
+			if (throwable.getCause() != null) {
+				displayMsg("", "Caused by:");
+				displayStackTrace(throwable.getCause());
+			}
+		}
+	}
+
+	/**
+	 * This method just logs an error.
+	 * 
+	 * @param errorText
+	 * @param exception
+	 */
+	private void logErr(String errorText, Exception exception) {
+		if (exception == null) {
+			setLastException(new JUploadException("errorText"));
+		} else if (exception instanceof JUploadException) {
+			setLastException((JUploadException) exception);
+		} else {
+			setLastException(new JUploadException(exception));
+		}
+
+		// Default behavior: if debugLevel is 0, and an error occurs, we force
+		// the debug level to 1: this makes the log window become visible, if it
+		// was hidden.
+		if (getDebugLevel() == 0)
+			setDebugLevel(1);
+
+		String exceptionMsg = null;
+		String exceptionClassName = null;
+		String logMsg = errorText;
+
+		// First, we construct the exception class name.
+		if (exception == null) {
+			exceptionClassName = "";
+		} else if (exception instanceof JUploadException) {
+			exceptionClassName = "["
+					+ ((JUploadException) exception).getClassNameAndClause()
+					+ "] ";
+		} else {
+			exceptionClassName = "[" + exception.getClass().getName() + "] ";
+		}
+
+		// Then, the message body can be completed by the exception message.
+		if (exception != null) {
+			// Ok, we have an exception.
+			if (exception.getCause() != null) {
+				exceptionMsg = exception.getCause().getMessage();
+			} else {
+				exceptionMsg = exception.getMessage();
+			}
+			logMsg = exceptionMsg + " (" + errorText + ")";
+		}
+
+		// Add the message to the log window
+		displayMsg("[ERROR]", exceptionClassName + logMsg);
+		// Let's display the stack trace, if relevant.
+		displayStackTrace(exception);
+
+		// Then we copy the debug output to the clipboard, and say it to the
+		// current user.
+		if (this.juploadContext.getUploadPanel() != null
+				&& getDebugLevel() >= 99) {
+			// Ok, the applet has been fully built.
+			this.juploadContext.getUploadPanel().copyLogWindow();
+			alert("messageLogWindowCopiedToClipboard");
+		}
+
+	}
+
+	/**
+	 * If debug is off, the log window may not be visible. We switch the debug
+	 * to on, to be sure that some information will be displayed to the user. <BR>
+	 * If debug is -1, the log window remains hidden.
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#displayErr(java.lang.String,
+	 *      java.lang.Exception, int)
+	 */
+	public int displayErr(String errorText, Exception exception, int optionTypes) {
+		// Then, we display it to the user.
+		String alertMsg = errorText;
+		// Then, the message body can be completed by the exception message.
+		if (exception != null && (errorText == null || errorText.equals(""))) {
+			// Ok, we have an exception.
+			if (exception.getCause() != null) {
+				alertMsg = exception.getCause().getMessage();
+			} else {
+				alertMsg = exception.getMessage();
+			}
+		}
+
+		// The message displayed depend on the debug level:
+		if (getDebugLevel() >= 30 && exception != null) {
+			alertMsg = exception.getClass().getName() + ": " + alertMsg;
+		}
+
+		// Display the message to the user. The kind of alert box depends on the
+		// given options:
+		int buttonClicked = 0;
+		switch (optionTypes) {
+		case -1:
+			// Standard message box.
+			alertStr(alertMsg);
+			buttonClicked = JOptionPane.OK_OPTION;
+			break;
+		case JOptionPane.OK_CANCEL_OPTION:
+		case JOptionPane.YES_NO_CANCEL_OPTION:
+		case JOptionPane.YES_NO_OPTION:
+			buttonClicked = confirmDialogStr(alertMsg, optionTypes);
+			break;
+		default:
+			// This is a problem. Let's display it to the user as a standard
+			// alert box.
+			alertStr(alertMsg);
+			buttonClicked = JOptionPane.OK_OPTION;
+			// Then, we log this new problem.
+			String msg = "Unknown optionType in displayErr(String, Exception, int)";
+			alertStr(msg);
+			logErr(msg, null);
+		}
+
+		// First, we log the error.
+		logErr(errorText, exception);
+
+		return buttonClicked;
+	}
+
+	/**
+	 * If debug is off, the log window may not be visible. We switch the debug
+	 * to on, to be sure that some information will be displayed to the user. <BR>
+	 * If debug is -1, the log window remains hidden.
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#displayErr(java.lang.String,
+	 *      java.lang.Exception)
+	 */
+	public void displayErr(String errorText, Exception exception) {
+		displayErr(errorText, exception, -1);
+	}
+
+	/**
+	 * @see UploadPolicy#displayInfo(String)
+	 */
+	public void displayInfo(String info) {
+		displayMsg("[INFO]", info);
+	}
+
+	/**
+	 * @see UploadPolicy#displayWarn(String)
+	 */
+	public void displayWarn(String warn) {
+		displayMsg("[WARN]", warn);
+	}
+
+	/**
+	 * @see UploadPolicy#displayDebug(String, int)
+	 */
+	public void displayDebug(String debug, int minDebugLevel) {
+		final String tag = "[DEBUG]";
+		if (this.debugLevel >= minDebugLevel) {
+			// displayMsg will add the message to the debugStrignBuffer.
+			displayMsg(tag, debug);
+		} else if (this.debugGenerateFile) {
+			// We have to write the message to the debug file, whatever the
+			// debugLevel is.
+			addMsgToDebugLog(tag + debug);
+		}
+	}
+
+	/** @see UploadPolicy#getLocalizedString(String, Object...) */
+	public String getLocalizedString(String key, Object... args) {
+		String ret = this.resourceBundle.getString(key);
+		try {
+			// We have to recreate the correct call to String.format
+			switch (args.length) {
+			case 0:
+				return String.format(ret);
+			case 1:
+				return String.format(ret, args[0]);
+			case 2:
+				return String.format(ret, args[0], args[1]);
+			case 3:
+				return String.format(ret, args[0], args[1], args[2]);
+			case 4:
+				return String.format(ret, args[0], args[1], args[2], args[3]);
+			case 5:
+				return String.format(ret, args[0], args[1], args[2], args[3],
+						args[4]);
+			case 6:
+				return String.format(ret, args[0], args[1], args[2], args[3],
+						args[4], args[5]);
+			case 7:
+				return String.format(ret, args[0], args[1], args[2], args[3],
+						args[4], args[5], args[6]);
+			default:
+				throw new IllegalArgumentException(
+						"DefaultUploadPolicy.getLocalizedString accepts up to 7 variable parameters ("
+								+ args.length
+								+ " values were given for the 'args' argument");
+			}
+		} catch (IllegalFormatException ife) {
+			displayErr(ife.getClass().getName() + " (" + ife.getMessage()
+					+ ")when managing this string: " + ret);
+			throw ife;
+		}
+	}
+
+	/**
+	 * @see UploadPolicy#getUploadFilename(FileData, int)
+	 */
+	public String getUploadFilename(FileData fileData, int index)
+			throws JUploadException {
+		return getEncodedFilename(fileData.getFileName());
+	}
+
+	/**
+	 * returns the filename and encodes it, if necessary
+	 * 
+	 * @param filename
+	 *            the original filename
+	 * @return filename (encoded, if necessary)
+	 * @throws JUploadException
+	 */
+	protected final String getEncodedFilename(String filename)
+			throws JUploadException {
+		if (this.filenameEncoding == null || this.filenameEncoding.equals("")) {
+			return filename;
+		}
+		try {
+			return URLEncoder.encode(filename, this.filenameEncoding);
+		} catch (UnsupportedEncodingException e) {
+			throw new JUploadException(e);
+		}
+	}
+
+	/** @see UploadPolicy#getUploadName(FileData, int) */
+	public String getUploadName(FileData fileData, int index)
+			throws JUploadException {
+		if (this.httpUploadParameterType
+				.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ARRAY)) {
+			return this.httpUploadParameterName + "[]";
+		} else if (this.httpUploadParameterType
+				.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ITERATION)) {
+			return this.httpUploadParameterName + index;
+		} else if (this.httpUploadParameterType
+				.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ONE_FILE)) {
+			// Only valid if nbFilesPerRequest is 1. Let's check it.
+			if (getNbFilesPerRequest() == 1) {
+				return this.httpUploadParameterName;
+			} else {
+				throw new JUploadException(
+						UploadPolicy.PROP_HTTP_UPLOAD_PARAMETER_TYPE
+								+ " value '" + this.httpUploadParameterType
+								+ "' is only valid when '"
+								+ UploadPolicy.PROP_NB_FILES_PER_REQUEST
+								+ " is 1.");
+			}
+		} else {
+			throw new JUploadException(
+					UploadPolicy.PROP_HTTP_UPLOAD_PARAMETER_TYPE + " '"
+							+ this.httpUploadParameterType
+							+ "' is not implemented.");
+		}
+	}
+
+	/** @see UploadPolicy#getHttpUploadParameterName() */
+	public String getHttpUploadParameterName() {
+		return this.httpUploadParameterName;
+	}
+
+	/**
+	 * Setter for the {@link #httpUploadParameterName}. This value is used by
+	 * the {@link #getUploadName(FileData, int)} method, to generate the name of
+	 * the upload parameter that will contain the uploaded file.<BR>
+	 * The name must begin by a letter, then contain letter or numbers
+	 * 
+	 * @throws JUploadException
+	 *             When the given value is invalid (null, empty string, or
+	 *             contains other characters than letters and/or numbers)
+	 */
+	protected void setHttpUploadParameterName(String httpUploadParameterName)
+			throws JUploadException {
+		// Some useful checks.
+		if (httpUploadParameterName == null
+				|| httpUploadParameterName.equals("")) {
+			throw new JUploadException(
+					"httpUploadParameterName may not be null");
+		}
+		// Control the parameter name content.
+		if (!httpUploadParameterName.matches("^[a-zA-Z0-9][a-zA-Z0-9_]*$")) {
+			throw new JUploadException(
+					"httpUploadParameterName may only contain letters (lowercase or uppercase) and numbers.");
+		}
+
+		// Ok, we're happy with the given value. Let's store it.
+		this.httpUploadParameterName = httpUploadParameterName;
+	}
+
+	/** @see UploadPolicy#getHttpUploadParameterType() */
+	public String getHttpUploadParameterType() {
+		return this.httpUploadParameterType;
+	}
+
+	/**
+	 * Setter for the {@link #httpUploadParameterType}. This value is used by
+	 * the {@link #getUploadName(FileData, int)} method, to generate the name of
+	 * the upload parameter that will contain the uploaded file. Depending on
+	 * this value, the parameter will be an iteration or an array.
+	 * 
+	 * @throws JUploadException
+	 */
+	protected void setHttpUploadParameterType(String httpUploadParameterType)
+			throws JUploadException {
+		// Some useful checks.
+		if (httpUploadParameterType == null) {
+			throw new JUploadException(
+					"httpUploadParameterType may not be null");
+		}
+
+		// Check against the list of allowed values
+		if (!httpUploadParameterType
+				.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ARRAY)
+				&& !httpUploadParameterType
+						.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ITERATION)
+				&& !httpUploadParameterType
+						.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ONE_FILE)) {
+			throw new JUploadException("'" + httpUploadParameterType
+					+ "' is not an allowed value for httpUploadParameterType.");
+		}
+
+		// OneFile is only valid ... when we upload file per file !
+		if (httpUploadParameterType
+				.equals(UploadPolicy.HTTPUPLOADPARAMETERTYPE_ONE_FILE)) {
+			if (getNbFilesPerRequest() != 1) {
+				throw new JUploadException("'" + httpUploadParameterType
+						+ "' is only valid when nbFilesPerRequest is 1.");
+			}
+		}
+
+		// Ok, we're happy. Let's store the value !
+		this.httpUploadParameterType = httpUploadParameterType;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#beforeUpload() */
+	public boolean beforeUpload() {
+		// Default : nothing to do before upload, so we're ready.
+		return true;
+	}
+
+	/** @see UploadPolicy#onAppendHeader(ByteArrayEncoder) */
+	public ByteArrayEncoder onAppendHeader(ByteArrayEncoder bae)
+			throws JUploadIOException {
+		Iterator<String> it = this.headers.iterator();
+		String header;
+		displayDebug("[onAppendHeader] Start", 80);
+		while (it.hasNext()) {
+			header = it.next();
+			if (header == null || header.equals("")) {
+				displayWarn("[onAppendHeader] Found one empty header. Ignoring it.");
+			} else {
+				bae.append(header).append("\r\n");
+				displayDebug("[onAppendHeader] Header appended; " + header, 80);
+			}
+		}
+		displayDebug("[onAppendHeader] End", 80);
+		return bae;
+	}// appendHeader
+
+	/**
+	 * Default implementation of the
+	 * {@link wjhk.jupload2.policies.UploadPolicy#onFileSelected(wjhk.jupload2.filedata.FileData)}
+	 * . Nothing's done.
+	 */
+	public void onFileSelected(FileData fileData) {
+		// Default implementation : no action
+	}
+
+	/**
+	 * Default implementation of the
+	 * {@link wjhk.jupload2.policies.UploadPolicy#onFileDoubleClicked(FileData)}
+	 * . Nothing's done.
+	 */
+	public void onFileDoubleClicked(FileData fileData) {
+		// Default implementation : no action
+	}
+
+	/** @see UploadPolicy#sendDebugInformation(String, Exception) */
+	public void sendDebugInformation(String description, Exception exception) {
+		try {
+			if (null == getUrlToSendErrorTo()) {
+				displayInfo("getUrlToSendErrorTo is null. No debug information is sent.");
+				if (exception == null) {
+					displayInfo("  No exception was stored!");
+				} else {
+					displayInfo("  The exception was: "
+							+ exception.getClass().getName()
+							+ exception.getMessage());
+				}
+			} else {
+				displayInfo("Sending debug information to "
+						+ getUrlToSendErrorTo());
+				if (JOptionPane
+						.showConfirmDialog(null,
+								getLocalizedString("questionSendMailOnError"),
+								getLocalizedString("Confirm"),
+								JOptionPane.YES_NO_OPTION,
+								JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
+					displayDebug(
+							"[sendDebugInformation] Within response == true",
+							30);
+
+					String action = null;
+					String line;
+					HTTPConnectionHelper connectionHelper = null;
+					boolean localDebugOk = this.debugOk;
+
+					try {
+						URL url = new URL(this.urlToSendErrorTo);
+						connectionHelper = new HTTPConnectionHelper(this);
+						connectionHelper.initRequest(url, "POST", false, true);
+
+						ByteArrayEncoder baeContent = new ByteArrayEncoderHTTP(
+								this, connectionHelper.getByteArrayEncoder()
+										.getBoundary(), connectionHelper
+										.getByteArrayEncoder().getEncoding());
+						// The message is written in English, as it is not sure
+						// that
+						// the webmaster speaks the same language as the current
+						// user.
+						baeContent.appendTextProperty("description",
+								"An error occured during upload, in JUpload.",
+								-1);
+						String exceptionClass = null;
+						String exceptionCause = null;
+						String exceptionStackTrace = null;
+						if (exception != null) {
+							exceptionClass = exception.getClass().getName();
+							if (exception.getCause() != null) {
+								exceptionCause = exception.getCause()
+										.getClass().getName();
+							}
+							StackTraceElement[] elements = exception
+									.getStackTrace();
+							ByteArrayEncoderHTTP baeStackTrace = new ByteArrayEncoderHTTP(
+									this, connectionHelper
+											.getByteArrayEncoder()
+											.getBoundary(), connectionHelper
+											.getByteArrayEncoder()
+											.getEncoding());
+							for (int i = 0; i < elements.length; i += 1) {
+								baeStackTrace.append(" at ");
+								baeStackTrace
+										.append(elements[i].getClassName());
+								baeStackTrace.append(".");
+								baeStackTrace.append(elements[i]
+										.getMethodName());
+								baeStackTrace.append("() [line ");
+								baeStackTrace.append(Integer
+										.toString(elements[i].getLineNumber()));
+								baeStackTrace.append("]\r\n");
+							}
+							baeStackTrace.close();
+							exceptionStackTrace = baeStackTrace.getString();
+						}
+						baeContent.appendTextProperty("exceptionClass",
+								exceptionClass, -1);
+						baeContent.appendTextProperty("exceptionCause",
+								exceptionCause, -1);
+						baeContent.appendTextProperty("exceptionStackTrace",
+								exceptionStackTrace, -1);
+
+						String baeBound = connectionHelper
+								.getByteArrayEncoder().getBoundary();
+						String baeEncoding = connectionHelper
+								.getByteArrayEncoder().getEncoding();
+						ByteArrayEncoder baeDebug = new ByteArrayEncoderHTTP(
+								this, baeBound, baeEncoding);
+						if (this.debugGenerateFile) {
+							// During debug output, we need to make sure that
+							// the debug log is not changed, so we set debugOk
+							// to false temporarily. -> Everything goes to
+							// stdout.
+							action = "flush (debugGenerateFile=true)";
+							synchronized (this) {
+								this.debugOut.flush();
+								this.debugOk = false;
+								// First, calculate the size of the strings we
+								// will
+								// send.
+								action = "read debug file (debugGenerateFile=true)";
+								BufferedReader debugIn = new BufferedReader(
+										new FileReader(this.debugFile));
+								while ((line = debugIn.readLine()) != null) {
+									baeDebug.append(line).append("\r\n");
+								}
+								debugIn.close();
+
+								// We are done with the debug log, so re-enable
+								// it.
+								this.debugOk = localDebugOk;
+							}// synchronized(this)
+						}// if (this.debugGenerateFile)
+						else {
+							action = "read debug file (debugGenerateFile=false)";
+							baeDebug.append(this.juploadContext.getLogWindow()
+									.getText());
+						}
+						action = "baeDebug.close()";
+						baeDebug.close();
+
+						baeContent.appendTextProperty("debugOutput", baeDebug
+								.getString(), -1);
+						baeContent.appendEndPropertyList();
+						// The content has been built.
+						baeContent.close();
+
+						// byteArrayEncoder
+						// .append("Content-type:
+						// application/x-www-form-urlencoded\r\n");
+						action = "send request";
+						connectionHelper.append(
+								"Content-Type: multipart/form-data; boundary=")
+								.append(
+										connectionHelper.getBoundary()
+												.substring(2)).append("\r\n");
+						connectionHelper.append("Content-length: ").append(
+								String.valueOf(baeContent.getEncodedLength()))
+								.append("\r\n");
+
+						// Let's send the headers (without baeDescription) ...
+						connectionHelper.sendRequest();
+						// Blank line (end of header)
+						connectionHelper.append("\r\n");
+						connectionHelper.append(baeContent);
+
+						action = "connectionHelper.readHttpResponse()";
+						int status = connectionHelper.readHttpResponse();
+
+						displayDebug(
+								"========================================================================================",
+								90);
+						displayDebug(
+								"==================      sendDebugInformation [start]   =================================",
+								90);
+						displayDebug(
+								"========================================================================================",
+								90);
+						displayDebug(
+								"[sendDebugInformation] Sent to server: \r\n"
+										+ connectionHelper
+												.getByteArrayEncoder()
+												.getString(), 90);
+						displayDebug(
+								"========================================================================================",
+								90);
+						displayDebug(
+								"[sendDebugInformation] Body received: \r\n"
+										+ connectionHelper.getResponseBody(),
+								90);
+						displayDebug(
+								"========================================================================================",
+								90);
+						displayDebug(
+								"==================      sendDebugInformation [end]     =================================",
+								90);
+						displayDebug(
+								"========================================================================================",
+								90);
+
+						// Is our upload a success ?
+						if (!checkUploadSuccess(status, connectionHelper
+								.getResponseMsg(), connectionHelper
+								.getResponseBody())) {
+							throw new JUploadExceptionUploadFailed(
+									getLocalizedString("errHttpResponse"));
+						}
+
+						displayInfo("debug information sent correctly");
+					} catch (MalformedURLException e) {
+						throw new JUploadIOException(
+								"Malformed URL Exception for "
+										+ this.urlToSendErrorTo, e);
+					} catch (Exception e) {
+						this.debugOk = localDebugOk;
+						displayErr(getLocalizedString("errDuringLogManagement")
+								+ " (" + action + ")", e);
+					} finally {
+						this.debugOk = localDebugOk;
+					}
+				}
+			}
+		} catch (JUploadIOException e) {
+			displayErr("Could not send debug information", e);
+		}
+	}// sendDebugInformation
+
+	/**
+	 * This method manages all applet parameters. It allows javascript to update
+	 * their value, for instance after the user chooses a value in a list ...
+	 * 
+	 * @throws JUploadException
+	 * @see wjhk.jupload2.policies.UploadPolicy#setProperty(java.lang.String,
+	 *      java.lang.String)
+	 */
+	public void setProperty(String prop, String value) throws JUploadException {
+
+		displayDebug("[DefaultUploadPolicy] Call of setProperty: " + prop
+				+ " => " + value, 30);
+
+		if (prop.equals(PROP_AFTER_UPLOAD_URL)) {
+			setAfterUploadURL(value);
+		} else if (prop.equals(PROP_ALLOW_HTTP_PERSISTENT)) {
+			setAllowHttpPersistent(Boolean.parseBoolean(value));
+		} else if (prop.equals(PROP_ALLOWED_FILE_EXTENSIONS)) {
+			setAllowedFileExtensions(value);
+		} else if (prop.equals(PROP_DEBUG_LEVEL)) {
+			setDebugLevel(this.juploadContext.parseInt(value, this.debugLevel));
+		} else if (prop.equals(PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT)) {
+			setFileChooserIconFromFileContent(this.juploadContext.parseInt(
+					value, getFileChooserIconFromFileContent()));
+		} else if (prop.equals(PROP_FILE_CHOOSER_ICON_SIZE)) {
+			setFileChooserIconSize(this.juploadContext.parseInt(value,
+					getFileChooserIconSize()));
+		} else if (prop.equals(PROP_FILE_FILTER_NAME)) {
+			setFileFilterName(value);
+		} else if (prop.equals(PROP_FILENAME_ENCODING)) {
+			setFilenameEncoding(value);
+		} else if (prop.equals(PROP_LANG)) {
+			setLang(value);
+		} else if (prop.equals(PROP_LOOK_AND_FEEL)) {
+			setLookAndFeel(value);
+		} else if (prop.equals(PROP_MAX_CHUNK_SIZE)) {
+			setMaxChunkSize(this.juploadContext.parseLong(value,
+					this.maxChunkSize));
+		} else if (prop.equals(PROP_MAX_FILE_SIZE)) {
+			setMaxFileSize(this.juploadContext.parseLong(value,
+					this.maxFileSize));
+		} else if (prop.equals(PROP_NB_FILES_PER_REQUEST)) {
+			setNbFilesPerRequest(this.juploadContext.parseInt(value,
+					this.nbFilesPerRequest));
+		} else if (prop.equals(PROP_POST_URL)) {
+			setPostURL(value);
+		} else if (prop.equals(PROP_SERVER_PROTOCOL)) {
+			HttpProtocolFinderThread.computeServerProtocol(this, value);
+		} else if (prop.equals(PROP_STRING_UPLOAD_SUCCESS)) {
+			setStringUploadSuccess(value);
+		} else if (prop.equals(PROP_SSL_VERIFY_CERT)) {
+			setSslVerifyCert(value);
+		} else if (prop.equals(PROP_URL_TO_SEND_ERROR_TO)) {
+			setUrlToSendErrorTo(value);
+		} else {
+			displayWarn("Unknown applet parameter: " + prop
+					+ " (in DefaultUploadPolicy.setProperty)");
+		}
+	}
+
+	/**
+	 * This method displays the applet parameter list, according to the current
+	 * debugLevel. It is called by the {@link #setDebugLevel(int)} method. It
+	 * should be override by any subclasses, that should display its own
+	 * parameters, then call <I>super.displayParameterStatus()</I>.
+	 * 
+	 * @see UploadPolicy#displayParameterStatus()
+	 */
+	public void displayParameterStatus() {
+		displayDebug(
+				"=======================================================================",
+				30);
+		displayDebug("======= Parameters managed by DefaultUploadPolicy", 30);
+		// /////////////////////////////////////////////////////////////////////////////
+		// Let's display some information to the user, about the received
+		// parameters.
+		displayInfo("JUpload applet, version "
+				+ this.juploadContext.getDetailedVersionMessage()
+				+ " (compiled: " + this.juploadContext.getBuildDate()
+				+ "), available at http://jupload.sourceforge.net/");
+		displayDebug("Java version: " + System.getProperty("java.version"), 30);
+
+		displayDebug("List of all applet parameters:", 30);
+		displayDebug("  language: "
+				+ this.resourceBundle.getLocale().getLanguage(), 30);
+		displayDebug("  country: "
+				+ this.resourceBundle.getLocale().getCountry(), 30);
+
+		displayDebug(PROP_AFTER_UPLOAD_URL + ": " + getAfterUploadURL(), 30);
+		displayDebug(PROP_ALLOW_HTTP_PERSISTENT + ": "
+				+ getAllowHttpPersistent(), 30);
+		displayDebug(PROP_ALLOWED_FILE_EXTENSIONS + ": "
+				+ getAllowedFileExtensions(), 30);
+		displayDebug(PROP_BROWSING_DIRECTORY + " (current value): "
+				+ getCurrentBrowsingDirectory(), 30);
+		displayDebug(PROP_DEBUG_LEVEL + ": " + this.debugLevel, 1);
+		synchronized (this) {
+			if (this.debugGenerateFile) {
+				displayDebug("  (debugfile: "
+						+ this.debugFile.getAbsolutePath() + ")", 1);
+			}
+		}
+		displayDebug(PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT + ": "
+				+ getFileChooserIconFromFileContent(), 30);
+		displayDebug(PROP_FILE_CHOOSER_ICON_SIZE + ": "
+				+ getFileChooserIconSize(), 30);
+		displayDebug(PROP_FILE_FILTER_NAME + ": " + getFileFilterName(), 30);
+		displayDebug(PROP_FILENAME_ENCODING + ": " + getFilenameEncoding(), 30);
+		displayDebug(PROP_FORMDATA + ": " + getFormdata(), 30);
+		displayDebug(PROP_FTP_CREATE_DIRECTORY_STRUCTURE + ": "
+				+ getFtpCreateDirectoryStructure(), 30);
+		displayDebug(
+				PROP_FTP_TRANSFERT_BINARY + ": " + getFtpTransfertBinary(), 30);
+		displayDebug(PROP_FTP_TRANSFERT_PASSIVE + ": "
+				+ getFtpTransfertPassive(), 30);
+		displayDebug(PROP_HTTP_UPLOAD_PARAMETER_NAME + ": "
+				+ getHttpUploadParameterName(), 30);
+		displayDebug(PROP_HTTP_UPLOAD_PARAMETER_TYPE + ": "
+				+ getHttpUploadParameterType(), 30);
+		displayDebug("lang: " + this.lang, 30);
+		displayDebug(PROP_MAX_CHUNK_SIZE + ": " + getMaxChunkSize(), 30);
+		if (this.maxFileSize == Long.MAX_VALUE) {
+			// If the maxFileSize was not given, we display its value only
+			// in debug mode.
+			displayDebug(PROP_MAX_FILE_SIZE + ": " + getMaxFileSize(), 30);
+		} else {
+			// If the maxFileSize was given, we always inform the user.
+			displayInfo(PROP_MAX_FILE_SIZE + ": " + getMaxFileSize());
+		}
+		displayDebug(PROP_NB_FILES_PER_REQUEST + ": " + getNbFilesPerRequest(),
+				30);
+		displayDebug(PROP_POST_URL + ": " + this.postURL, 30);
+		displayDebug(PROP_READ_COOKIE_FROM_NAVIGATOR + ": "
+				+ this.readCookieFromNavigator, 30);
+		displayDebug(PROP_READ_USER_AGENT_FROM_NAVIGATOR + ": "
+				+ this.readUserAgentFromNavigator, 30);
+		displayDebug(PROP_RETRY_MAX_NUMBER_OF + ": " + this.retryMaxNumberOf,
+				30);
+		displayDebug(PROP_RETRY_NB_SECONDS_BETWEEN + ": "
+				+ this.retryNbSecondsBetween, 30);
+		displayDebug(PROP_SEND_MD5_SUM + ": " + getSendMD5Sum(), 30);
+		displayDebug(PROP_SERVER_PROTOCOL + ": " + getServerProtocol(), 30);
+		displayDebug(PROP_SHOW_LOGWINDOW + ": " + getShowLogWindow(), 30);
+		displayDebug(PROP_SHOW_STATUSBAR + ": " + this.showStatusbar, 30);
+		displayDebug(PROP_SPECIFIC_HEADERS + ": " + getSpecificHeaders(), 30);
+
+		displayDebug("Headers that will be added to the POST request: ", 30);
+		for (Iterator<String> it = this.headers.iterator(); it.hasNext();) {
+			displayDebug(it.next() + "\n", 30);
+		}
+		displayDebug(PROP_STRING_UPLOAD_ERROR + ": " + getStringUploadError(),
+				30);
+		displayDebug(PROP_STRING_UPLOAD_SUCCESS + ": "
+				+ getStringUploadSuccess(), 30);
+		displayDebug(PROP_STRING_UPLOAD_WARNING + ": "
+				+ getStringUploadWarning(), 30);
+		displayDebug(PROP_URL_TO_SEND_ERROR_TO + ": " + getUrlToSendErrorTo(),
+				30);
+		displayDebug("", 30);
+	}
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// getters / setters
+	// ///////////////////////////////////////////////////
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/** @see UploadPolicy#getAfterUploadURL() */
+	public String getAfterUploadURL() {
+		return this.afterUploadURL;
+	}
+
+	/**
+	 * Set the {@link #afterUploadURL}
+	 * 
+	 * @param afterUploadURL
+	 *            The URL to use.
+	 * @throws JUploadException
+	 */
+	protected void setAfterUploadURL(String afterUploadURL)
+			throws JUploadException {
+		if (null == afterUploadURL)
+			return;
+		if (afterUploadURL.toLowerCase().startsWith("javascript:")) {
+			this.afterUploadURL = afterUploadURL;
+		} else
+			this.afterUploadURL = this.juploadContext
+					.normalizeURL(afterUploadURL);
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#getAllowHttpPersistent()
+	 */
+	public boolean getAllowHttpPersistent() {
+		return this.allowHttpPersistent;
+	}
+
+	/** @see UploadPolicy#getAllowedFileExtensions() */
+	public String getAllowedFileExtensions() {
+		return this.allowedFileExtensions;
+	}
+
+	/**
+	 * @param allowedFileExtensions
+	 *            the allowedFileExtensions to set
+	 */
+	protected void setAllowedFileExtensions(String allowedFileExtensions) {
+		if (allowedFileExtensions == null || allowedFileExtensions.equals("")) {
+			this.allowedFileExtensions = null;
+		} else {
+			this.allowedFileExtensions = (allowedFileExtensions.startsWith("/") ? ""
+					: "/")
+					+ allowedFileExtensions.toLowerCase()
+					+ (allowedFileExtensions.endsWith("/") ? "" : "/");
+		}
+	}
+
+	protected void setAllowHttpPersistent(boolean value) {
+		this.allowHttpPersistent = value;
+	}
+
+	/** @see UploadPolicy#getContext() */
+	public JUploadContext getContext() {
+		return this.juploadContext;
+	}
+
+	/** {@inheritDoc} */
+	public void setCurrentBrowsingDirectory(File currentBrowsingDirectoryParam) {
+		try {
+			if (currentBrowsingDirectoryParam.isDirectory()) {
+				this.currentBrowsingDirectory = currentBrowsingDirectoryParam;
+			} else {
+				displayWarn("DefaultUploadPolicy.setCurrentBrowsingDirectory(): "
+						+ currentBrowsingDirectoryParam + " doesn't exist.");
+			}
+		} catch (SecurityException se) {
+			displayWarn(se.getClass().getName()
+					+ " in DefaultUploadPolicy.setCurrentBrowsingDirectory(): "
+					+ currentBrowsingDirectoryParam + " is ignored.");
+		}
+	}
+
+	/**
+	 * @param currentBrowsingDirectoryParam
+	 *            The name of the directory that should be the current one.
+	 * @see UploadPolicy#setCurrentBrowsingDirectory(String)
+	 */
+	public void setCurrentBrowsingDirectory(String currentBrowsingDirectoryParam) {
+		try {
+			if (currentBrowsingDirectoryParam == null) {
+				this.currentBrowsingDirectory = null;
+			} else {
+				// Apparently, Java deosn't manage path beginning by ~. folder
+				// is actually ... ~!
+				// Let's manager this.
+				if (currentBrowsingDirectoryParam.startsWith("~")) {
+					// Let's keep the part of this path that is after the ~
+					currentBrowsingDirectoryParam = System
+							.getProperty("user.home")
+							+ currentBrowsingDirectoryParam.substring(1);
+				}
+
+				this.currentBrowsingDirectory = new File(
+						currentBrowsingDirectoryParam);
+
+				// Let's check that we have a folder.
+				if (this.currentBrowsingDirectory != null
+						&& !this.currentBrowsingDirectory.isDirectory()) {
+					displayWarn("DefaultUploadPolicy.setCurrentBrowsingDirectory(): <"
+							+ currentBrowsingDirectoryParam
+							+ "> doesn't exist or is not a directory.");
+					this.currentBrowsingDirectory = null;
+				}
+			}
+		} catch (SecurityException se) {
+			displayWarn(se.getClass().getName()
+					+ " in DefaultUploadPolicy.setCurrentBrowsingDirectory(): "
+					+ currentBrowsingDirectoryParam + " is ignored.");
+		}
+	}
+
+	/** @see UploadPolicy#getCurrentBrowsingDirectory() */
+	public File getCurrentBrowsingDirectory() {
+		return this.currentBrowsingDirectory;
+	}
+
+	/** @see UploadPolicy#getDateFormat() */
+	public String getDateFormat() {
+		return UploadPolicy.DEFAULT_DATE_FORMAT;
+	}
+
+	/** @see UploadPolicy#getDebugLevel() */
+	public int getDebugLevel() {
+		return this.debugLevel;
+	}
+
+	/** @see UploadPolicy#setDebugLevel(int) */
+	public void setDebugLevel(int debugLevel) {
+		setDebugLevel(debugLevel, true);
+	}
+
+	/**
+	 * Set the debug level.
+	 * 
+	 * @param debugLevel
+	 *            The new debuglevel.
+	 * @param displayAppletParameterList
+	 *            Flag. If set to true, the applet's parameters are shown.
+	 */
+	public synchronized void setDebugLevel(int debugLevel,
+			boolean displayAppletParameterList) {
+		// If the debugLevel was previously set, we inform the user of this
+		// change.
+		if (this.debugLevel >= 0) {
+			displayInfo("Debug level set to " + debugLevel);
+			if (this.debugGenerateFile) {
+				displayInfo("Current debug output file: "
+						+ this.debugFile.getAbsolutePath());
+			}
+		}
+		this.debugLevel = debugLevel;
+
+		// Let's display the current applet parameters.
+		if (displayAppletParameterList) {
+			displayParameterStatus();
+		}
+	}
+
+	/**
+	 * Getter for fileChooserIconFromFileContent.
+	 * 
+	 * @return Current value for fileChooserIconFromFileContent
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+	 */
+	public int getFileChooserIconFromFileContent() {
+		return this.fileChooserIconFromFileContent;
+	}
+
+	/**
+	 * Setter for fileChooserIconFromFileContent. Current allowed values are:
+	 * -1, 0, 1. Default value is 0.
+	 * 
+	 * @param fileChooserIconFromFileContent
+	 *            Value to be set. If the value is not allowed (not -1, 0 or 1),
+	 *            the current value is unchangeed.
+	 * @exception java.lang.IllegalArgumentException
+	 *                When a value not in -1, 0 1 is given.
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_FROM_FILE_CONTENT
+	 */
+	public void setFileChooserIconFromFileContent(
+			int fileChooserIconFromFileContent) {
+		if (fileChooserIconFromFileContent != -1
+				&& fileChooserIconFromFileContent != 0
+				&& fileChooserIconFromFileContent != 1) {
+			throw new java.lang.IllegalArgumentException(
+					"fileChooserIconFromFileContent must be one of -1, 0, 1");
+		}
+		this.fileChooserIconFromFileContent = fileChooserIconFromFileContent;
+	}
+
+	/**
+	 * Getter for fileChooserIconSize.
+	 * 
+	 * @return Current value for fileChooserIconSize
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_SIZE
+	 */
+	public int getFileChooserIconSize() {
+		return this.fileChooserIconSize;
+	}
+
+	/**
+	 * Setter for fileChooserIconSize.
+	 * 
+	 * @param fileChooserIconSize
+	 *            Value to be set.
+	 * @exception java.lang.IllegalArgumentException
+	 *                When a negative value is given.
+	 * @see UploadPolicy#PROP_FILE_CHOOSER_ICON_SIZE
+	 */
+	public void setFileChooserIconSize(int fileChooserIconSize) {
+		if (fileChooserIconSize <= 0) {
+			throw new java.lang.IllegalArgumentException(
+					"fileChooserIconSize must be more than 0");
+		}
+		this.fileChooserIconSize = fileChooserIconSize;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#setLang(String) */
+	public void setLang(String lang) {
+		this.lang = lang;
+		if (lang == null) {
+			displayInfo("lang = null, taking default language");
+			locale = Locale.getDefault();
+		} else {
+			// If we have a 5 characters lang string, then it should look like
+			// ll_CC, where ll is the language code
+			// and CC is the Country code.
+			if (lang.length() == 5
+					&& (lang.substring(2, 3).equals("_") || lang
+							.substring(2, 3).equals("-"))) {
+				String language = lang.substring(0, 2);
+				String country = lang.substring(3, 5);
+				displayDebug("setLang - language read: " + language, 50);
+				displayDebug("setLang - country read: " + country, 50);
+				locale = new Locale(language, country.toUpperCase());
+			} else {
+				locale = new Locale(lang);
+				displayDebug("setLang - language read (no country): " + lang,
+						50);
+			}
+		}
+
+		/*
+		 * Patch given by Patrick Use of a specific class loader. The standard
+		 * ResourceBundle checks first for a class that has the name of the
+		 * resource bundle. Since there is no such class in the jar file, the
+		 * AppletClassLoader makes a http request to the server, which will end
+		 * with a 404 since there is no such class either. To avoid this
+		 * unnecessary lookup we use a class loader that throws directly a
+		 * ClassNotFoundException. After looking for a class (which is
+		 * unsuccessful) ResourceBundle looks finally for a properties file.
+		 * Therefore we delegate that lookup to the original class loader since
+		 * this is in the jar file.
+		 */
+		this.resourceBundle = ResourceBundle.getBundle("lang.lang", locale,
+		// Special class loader, see description above
+				new ClassLoader(this.getClass().getClassLoader()) {
+					/** {@inheritDoc} */
+					@Override
+					public Class<?> loadClass(String name)
+							throws ClassNotFoundException {
+						throw new ClassNotFoundException();
+					}
+
+					/** {@inheritDoc} */
+					@Override
+					public InputStream getResourceAsStream(String name) {
+						return this.getClass().getClassLoader()
+								.getResourceAsStream(name);
+					}
+				});
+	}
+
+	/** {@inheritDoc} */
+	public Locale getLocale() {
+		return this.locale;
+	}
+
+	/**
+     */
+	protected String getLookAndFeel() {
+		return this.lookAndFeel;
+	}
+
+	/**
+	 * @param lookAndFeel
+	 *            the lookAndFeel to set
+	 */
+	protected void setLookAndFeel(String lookAndFeel) {
+		try {
+			this.lookAndFeel = lookAndFeel;
+			if (lookAndFeel != null && !lookAndFeel.equals("")
+					&& !lookAndFeel.equals("java")) {
+				// We try to call the UIManager.setLookAndFeel() method. We
+				// catch
+				// all possible exceptions, to prevent
+				// that the applet is blocked.
+				if (!lookAndFeel.equals("system")) {
+					// Correction given by Fritz. Thanks to him.
+					UIManager.setLookAndFeel(lookAndFeel);
+				} else {
+					UIManager.setLookAndFeel(UIManager
+							.getSystemLookAndFeelClassName());
+				}
+			} else {
+				this.lookAndFeel = "java";
+				UIManager
+						.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
+			}
+		} catch (Exception e) {
+			displayErr(e);
+			try {
+				this.lookAndFeel = "java";
+				UIManager
+						.setLookAndFeel(new javax.swing.plaf.metal.MetalLookAndFeel());
+			} catch (UnsupportedLookAndFeelException e1) {
+				displayErr(e1);
+				// Hum, hum: we should not arrive here... We not a 'dummy' one.
+				this.lookAndFeel = null;
+			}
+		}
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getMaxChunkSize() */
+	public long getMaxChunkSize() {
+		return this.maxChunkSize;
+	}
+
+	/**
+	 * If the given value is less or equals to 0, it is set back to
+	 * Long_MAX_VALUE.
+	 * 
+	 * @param maxChunkSize
+	 *            the maxChunkSize to set
+	 */
+	protected void setMaxChunkSize(long maxChunkSize) {
+		if (maxChunkSize <= 0) {
+			displayDebug(
+					"maxChunkSize<=0 which is invalid. Switched to the default value (Long.MAX_VALUE)",
+					1);
+			maxChunkSize = Long.MAX_VALUE;
+		}
+		this.maxChunkSize = maxChunkSize;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getMaxFileSize() */
+	public long getMaxFileSize() {
+		return this.maxFileSize;
+	}
+
+	/**
+	 * @param maxFileSize
+	 *            the maxFileSize to set
+	 */
+	protected void setMaxFileSize(long maxFileSize) {
+		if (maxFileSize <= 0) {
+			displayDebug(
+					"maxFileSize<=0 which is invalid. Switched to the default value (Long.MAX_VALUE)",
+					1);
+			maxFileSize = Long.MAX_VALUE;
+		}
+		this.maxFileSize = maxFileSize;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getNbFilesPerRequest() */
+	public int getNbFilesPerRequest() {
+		return this.nbFilesPerRequest;
+	}
+
+	/**
+	 * @param nbFilesPerRequest
+	 *            the nbFilesPerRequest to set
+	 * @throws JUploadException
+	 */
+	protected void setNbFilesPerRequest(int nbFilesPerRequest)
+			throws JUploadException {
+		// If httpUploadParameterType is oneFile,
+		if (getHttpUploadParameterType().equals(
+				UploadPolicy.HTTPUPLOADPARAMETERTYPE_ONE_FILE)
+				&& nbFilesPerRequest != 1) {
+			throw new JUploadException(
+					"nbFilesPerRequest must be 1, when httpUploadParameterType is oneFile");
+		}
+
+		if (nbFilesPerRequest < 1) {
+			displayDebug(
+					"nbFilesPerRequest <1 : switched to the 'unlimited' value (Integer.MAX_VALUE)",
+					1);
+			this.nbFilesPerRequest = Integer.MAX_VALUE;
+		} else {
+			this.nbFilesPerRequest = nbFilesPerRequest;
+		}
+	}
+
+	/** @see UploadPolicy#getFilenameEncoding() */
+	public String getFilenameEncoding() {
+		return this.filenameEncoding;
+	}
+
+	/** @see UploadPolicy#getFileFilterName() */
+	public String getFileFilterName() {
+		return this.fileFilterName;
+	}
+
+	/**
+	 * @param fileFilterName
+	 *            The new name for the fileFilter
+	 * @see UploadPolicy#PROP_FILE_FILTER_NAME
+	 */
+	protected void setFileFilterName(String fileFilterName) {
+		this.fileFilterName = fileFilterName;
+	}
+
+	/**
+	 * @param filenameEncoding
+	 *            the filenameEncoding to set
+	 */
+	protected void setFilenameEncoding(String filenameEncoding) {
+		if (filenameEncoding != null && filenameEncoding.equals("")) {
+			filenameEncoding = null;
+		}
+		if (filenameEncoding != null && !Charset.isSupported(filenameEncoding)) {
+			throw new UnsupportedCharsetException("non supported charset ("
+					+ filenameEncoding + ")");
+		}
+		this.filenameEncoding = filenameEncoding;
+	}
+
+	/** @see UploadPolicy#getFtpCreateDirectoryStructure() */
+	public boolean getFtpCreateDirectoryStructure() {
+		return this.ftpCreateDirectoryStructure;
+	}
+
+	/**
+	 * @param ftpCreateDirectoryStructure
+	 *            the ftpCreateDirectoryStructure to set
+	 */
+	protected void setFtpCreateDirectoryStructure(
+			boolean ftpCreateDirectoryStructure) {
+		this.ftpCreateDirectoryStructure = ftpCreateDirectoryStructure;
+	}
+
+	/** @see UploadPolicy#getFtpTransfertBinary() */
+	public boolean getFtpTransfertBinary() {
+		return this.ftpTransfertBinary;
+	}
+
+	/**
+	 * @param ftpTransfertBinary
+	 *            the ftpTransfertBinary to set
+	 */
+	protected void setFtpTransfertBinary(boolean ftpTransfertBinary) {
+		this.ftpTransfertBinary = ftpTransfertBinary;
+	}
+
+	/** @see UploadPolicy#getFtpTransfertPassive() */
+	public boolean getFtpTransfertPassive() {
+		return this.ftpTransfertPassive;
+	}
+
+	/**
+	 * @param ftpTransfertPassive
+	 *            the ftpTransfertPassive to set
+	 */
+	protected void setFtpTransfertPassive(boolean ftpTransfertPassive) {
+		this.ftpTransfertPassive = ftpTransfertPassive;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getPostURL() */
+	public String getPostURL() {
+		return this.postURL;
+	}
+
+	/**
+	 * @throws JUploadException
+	 * @see wjhk.jupload2.policies.UploadPolicy#setPostURL(String)
+	 */
+	public void setPostURL(String postURL) throws JUploadException {
+		// Be more forgiving about postURL:
+		// - If none is specified, use the original DocumentBase of the
+		// applet.
+		// - If a non-absolute URI (an URI without protocol and server) is
+		// specified,
+		// prefix it with "http://servername"
+		// - If a relative URI is specified, prefix it with the DocumentBase's
+		// parent
+		this.postURL = this.juploadContext.normalizeURL(postURL);
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getReadCookieFromNavigator() */
+	public boolean getReadCookieFromNavigator() {
+		return this.readCookieFromNavigator;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getReadCookieFromNavigator() */
+	protected void setReadCookieFromNavigator(boolean readCookieFromNavigator) {
+		this.readCookieFromNavigator = readCookieFromNavigator;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getReadUserAgentFromNavigator() */
+	public boolean getReadUserAgentFromNavigator() {
+		return this.readUserAgentFromNavigator;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getReadUserAgentFromNavigator() */
+	protected void setReadUserAgentFromNavigator(
+			boolean readUserAgentFromNavigator) {
+		this.readUserAgentFromNavigator = readUserAgentFromNavigator;
+	}
+
+	/** @see UploadPolicy#getRetryMaxNumberOf() */
+	public int getRetryMaxNumberOf() {
+		return this.retryMaxNumberOf;
+	}
+
+	/**
+	 * @param retryMaxNumberOf
+	 *            New value to set for the retryMaxNumberOf applet parameter
+	 * @exception IllegalArgumentException
+	 *                If retryMaxNumberOf is less than 0.
+	 * @see UploadPolicy#getRetryMaxNumberOf()
+	 */
+	public void setRetryMaxNumberOf(int retryMaxNumberOf) {
+		if (retryMaxNumberOf < 0) {
+			throw new IllegalArgumentException(
+					"retryMaxNumberOf must be 0 or more");
+		}
+		this.retryMaxNumberOf = retryMaxNumberOf;
+	}
+
+	/** @see UploadPolicy#getRetryNbSecondsBetween() */
+	public int getRetryNbSecondsBetween() {
+		return this.retryNbSecondsBetween;
+	}
+
+	/**
+	 * @param retryNbSecondsBetween
+	 *            New value to set for the retryNbSecondsBetween applet
+	 *            parameter
+	 * @exception IllegalArgumentException
+	 *                If retryNbSecondsBetween is less than 0.
+	 * @see UploadPolicy#getRetryNbSecondsBetween()
+	 */
+	public void setRetryNbSecondsBetween(int retryNbSecondsBetween) {
+		if (retryNbSecondsBetween < 0) {
+			throw new IllegalArgumentException(
+					"retryNbSecondsBetween must be 0 or more");
+		}
+		this.retryNbSecondsBetween = retryNbSecondsBetween;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getServerProtocol() */
+	public String getServerProtocol() {
+		if (this.serverProtocol == null) {
+			return DEFAULT_SERVER_PROTOCOL;
+		} else {
+			return this.serverProtocol;
+		}
+	}
+
+	/** @see UploadPolicy#setServerProtocol(String) */
+	public void setServerProtocol(String serverProtocol) {
+		this.serverProtocol = serverProtocol;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getSendMD5Sum() */
+	public boolean getSendMD5Sum() {
+		return this.sendMD5Sum;
+	}
+
+	/** @see UploadPolicy#setSendMD5Sum(boolean) */
+	public void setSendMD5Sum(boolean sendMD5Sum) {
+		this.sendMD5Sum = sendMD5Sum;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getShowLogWindow() */
+	public String getShowLogWindow() {
+		return this.showLogWindow;
+	}
+
+	/** {@inheritDoc} */
+	public void setShowLogWindow(String showLogWindow) {
+		if (showLogWindow.equals(SHOWLOGWINDOW_TRUE)
+				|| showLogWindow.equals(SHOWLOGWINDOW_FALSE)
+				|| showLogWindow.equals(SHOWLOGWINDOW_ONERROR)) {
+			this.showLogWindow = showLogWindow;
+			// The log window may become visible or hidden, depending on this
+			// parameter.
+			if (this.juploadContext.getUploadPanel() != null) {
+				this.juploadContext.getUploadPanel().showOrHideLogWindow();
+			}
+		} else {
+			displayWarn("[setShowLogWindow] Unallowed value: " + showLogWindow
+					+ " (showLogWindow is left unchanged)");
+		}
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getSpecificHeaders() */
+	public String getSpecificHeaders() {
+		return this.specificHeaders;
+	}
+
+	/**
+	 * Set all specific headers defined in the specificHeaders applet parameter.
+	 * This string is splitted, so that each header is added to the headers
+	 * Vector. These headers are added to the headers list during applet
+	 * initialization. There is currently no automatic way to remove the headers
+	 * coming from specificHeaders, after initialization.
+	 * 
+	 * @param specificHeaders
+	 */
+	protected void setSpecificHeaders(String specificHeaders) {
+		this.specificHeaders = specificHeaders;
+		if (specificHeaders != null) {
+			// Let's add each header in specificHeaders to the headers list. In
+			// specificHeaders, each header is separated by the \n string (two
+			// characters: \ then n, not the \n character).
+			// The regexp to find the \n string (not the \n character) is: \\n
+			// We then double each \ character:
+			String[] headerArray = specificHeaders.split("\\\\n");
+			for (int x = 0; x < headerArray.length; x++) {
+				addHeader(headerArray[x]);
+			}
+		}
+	}
+
+	/**
+	 * @see wjhk.jupload2.policies.UploadPolicy#getSslVerifyCert()
+	 */
+	public int getSslVerifyCert() {
+		return this.sslVerifyCert;
+	}
+
+	protected void setSslVerifyCert(String mode) throws JUploadException {
+		int val = -1;
+		if (mode.toLowerCase().equals("none"))
+			val = InteractiveTrustManager.NONE;
+		if (mode.toLowerCase().equals("server"))
+			val = InteractiveTrustManager.SERVER;
+		if (mode.toLowerCase().equals("client"))
+			val = InteractiveTrustManager.CLIENT;
+		if (mode.toLowerCase().equals("strict"))
+			val = InteractiveTrustManager.STRICT;
+		if (val == -1)
+			throw new JUploadException("Invalid parameter sslVerifyCert ("
+					+ mode + ")");
+		this.sslVerifyCert = val;
+	}
+
+	/**
+	 * @param show
+	 *            the new showStatusbar value
+	 */
+	protected void setShowStatusbar(boolean show) {
+		this.showStatusbar = show;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getStringUploadError() */
+	public String getStringUploadError() {
+		return this.stringUploadError;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getStringUploadSuccess() */
+	public String getStringUploadSuccess() {
+		return this.stringUploadSuccess;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getStringUploadWarning() */
+	public String getStringUploadWarning() {
+		return this.stringUploadWarning;
+	}
+
+	/**
+	 * @param stringUploadError
+	 *            the stringUploadError to set
+	 * @throws JUploadException
+	 */
+	protected void setStringUploadError(String stringUploadError)
+			throws JUploadException {
+		this.stringUploadError = stringUploadError;
+		if (stringUploadError != null) {
+			try {
+				this.patternError = Pattern.compile(stringUploadError);
+			} catch (PatternSyntaxException e) {
+				throw new JUploadException(
+						"Invalid regex in parameter stringUploadError");
+			}
+		}
+	}
+
+	/**
+	 * @param stringUploadSuccess
+	 *            the stringUploadSuccess to set
+	 * @throws JUploadException
+	 */
+	protected void setStringUploadSuccess(String stringUploadSuccess)
+			throws JUploadException {
+		this.stringUploadSuccess = stringUploadSuccess;
+		if (stringUploadSuccess != null) {
+			try {
+				this.patternSuccess = Pattern.compile(stringUploadSuccess);
+			} catch (PatternSyntaxException e) {
+				throw new JUploadException(
+						"Invalid regex in parameter stringUploadSuccess");
+			}
+		}
+	}
+
+	/**
+	 * @param stringUploadWarning
+	 *            the stringUploadWarning to set
+	 * @throws JUploadException
+	 */
+	protected void setStringUploadWarning(String stringUploadWarning)
+			throws JUploadException {
+		this.stringUploadWarning = stringUploadWarning;
+		if (stringUploadWarning != null) {
+			try {
+				this.patternWarning = Pattern.compile(stringUploadWarning);
+			} catch (PatternSyntaxException e) {
+				throw new JUploadException(
+						"Invalid regex in parameter stringUploadWarning");
+			}
+		}
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getUrlToSendErrorTo() */
+	public String getUrlToSendErrorTo() {
+		return this.urlToSendErrorTo;
+	}
+
+	/** {@inheritDoc} */
+	public void setUrlToSendErrorTo(String urlToSendErrorTo)
+			throws JUploadException {
+		if (null == urlToSendErrorTo)
+			return;
+		String tmp = this.juploadContext.normalizeURL(urlToSendErrorTo);
+		if (tmp.startsWith("ftp://")) {
+			throw new JUploadException(
+					"urlToSendErrorTo: ftp scheme not supported.");
+		}
+		this.urlToSendErrorTo = tmp;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getFormdata() */
+	public String getFormdata() {
+		return this.formData;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getAfterUploadTarget() */
+	public String getAfterUploadTarget() {
+		return this.afterUploadTarget;
+	}
+
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////// Internal methods
+	// //////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Delete the current log. (called upon applet termination)
+	 */
+	public synchronized void deleteLog() {
+		if (this.debugGenerateFile) {
+			try {
+				if (null != this.debugOut) {
+					this.debugOut.close();
+					this.debugOut = null;
+				}
+				if (null != this.debugFile) {
+					if (!this.debugFile.delete()) {
+						displayWarn(this.debugFile.getName()
+								+ " was not correctly removed!");
+					}
+					this.debugFile = null;
+				}
+			} catch (Exception e) {
+				// nothing to do: we mask the exception.
+				displayWarn(e.getClass().getName()
+						+ " occured in deleteLog(). Exception ignored.");
+			}
+		}
+	}
+
+	/**
+	 * This methods allows the applet to store all messages (debug, warning,
+	 * info, errors...) into a StringBuffer. If any problem occurs, the whole
+	 * output (displayed or not by the displayDebug, for instance) can be stored
+	 * in a file, or sent to the webmaster. This can help to identify and
+	 * correct problems that can occurs on the various computer configurations.
+	 * 
+	 * @param msg
+	 */
+	protected synchronized void addMsgToDebugLog(String msg) {
+		// If uploading lots of chunks, the buffer gets too large, resulting in
+		// a OutOfMemoryError on the heap so we now use a temporary file for the
+		// debug log.
+		if (this.debugGenerateFile && this.debugOk) {
+			try {
+				if (null == this.debugOut) {
+					this.juploadContext.registerUnload(this, "deleteLog");
+					this.debugFile = File
+							.createTempFile("jupload_", "_log.txt");
+					this.debugOut = new PrintStream(new FileOutputStream(
+							this.debugFile));
+				}
+				boolean endsLF = msg.endsWith("\n");
+				msg = msg.replaceAll("\n", this.CRLF);
+				if (endsLF) {
+					this.debugOut.print(msg);
+				} else {
+					this.debugOut.println(msg);
+				}
+			} catch (IOException e) {
+				this.debugOk = false;
+				System.err.println("IO error on debuglog "
+						+ this.debugFile.getPath()
+						+ "\nFallback to standard output.");
+				System.out.println(msg);
+			}
+		} else {
+			System.out.println(msg);
+		}
+	}
+
+	/**
+	 * Displays a message. If the logWindow panel is set, the message is
+	 * displayed on it. If not, the System.out.println function is used.
+	 * 
+	 * @param msg
+	 *            The message to display.
+	 */
+	private void displayMsg(String tag, String msg) {
+		String message;
+
+		if (this.juploadContext.getLogWindow() == null) {
+			message = tag + " - " + msg;
+			System.out.println(message);
+		} else {
+			message = this.juploadContext.getLogWindow().displayMsg(tag, msg);
+		}
+		// Let's store all text in the debug logfile
+		if (this.debugGenerateFile) {
+			addMsgToDebugLog(message);
+		}
+	}
+
+	/**
+	 * Default reaction after a successful drop operation: no action.
+	 * 
+	 * @see UploadPolicy#afterFileDropped(DropTargetDropEvent)
+	 */
+	public void afterFileDropped(DropTargetDropEvent dropEvent) {
+		// Default: no action.
+	}
+
+	/**
+	 * Default implementation for {@link UploadPolicy#createFileChooser()}: just
+	 * a creation of a {@link JUploadFileChooser}.
+	 * 
+	 * @see UploadPolicy#createFileChooser()
+	 */
+	public JUploadFileChooser createFileChooser() {
+		return new JUploadFileChooser(this);
+	}
+
+	/**
+	 * This method returns the response for the
+	 * {@link JUploadFileFilter#accept(File)} which just calls this method. This
+	 * method checks that the file extension corresponds to the
+	 * allowedFileExtensions applet parameter.
+	 * 
+	 * @see UploadPolicy#fileFilterAccept(File)
+	 */
+	public boolean fileFilterAccept(File file) {
+		if (file.isDirectory()) {
+			return true;
+		} else if (this.allowedFileExtensions == null
+				|| this.allowedFileExtensions.equals("")) {
+			return true;
+		} else {
+			// Get the file extension
+			String extension = DefaultFileData.getExtension(file).toLowerCase();
+			// allowedFileExtensions is :
+			// - a list of file extensions,
+			// - in lower case,
+			// - separated by slash
+			// - A slash has been added at the beginning in
+			// setAllowedFileExtensions
+			// - A slash has been added at the end in setAllowedFileExtensions
+			// So, we just look for the /ext/ string in the stored
+			// allowedFileExtensions.
+			return (this.allowedFileExtensions.indexOf("/" + extension + "/")) >= 0;
+		}
+	}
+
+	/** @see UploadPolicy#fileFilterGetDescription() */
+	public String fileFilterGetDescription() {
+		if (this.allowedFileExtensions == null
+				|| this.allowedFileExtensions.equals("")) {
+			return null;
+		} else if (getFileFilterName() != null) {
+			return getFileFilterName();
+		} else {
+			return "JUpload file filter (" + this.allowedFileExtensions + ")";
+		}
+	}
+
+	/**
+	 * Returns null: the default icon is used.
+	 * 
+	 * @see UploadPolicy#fileViewGetIcon(File)
+	 */
+	public Icon fileViewGetIcon(File file) {
+		return null;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getLastException() */
+	public JUploadException getLastException() {
+		return this.lastException;
+	}
+
+	/**
+	 * Set the last exception.
+	 * 
+	 * @param exception
+	 *            The last exception that occurs into the applet.
+	 */
+	public void setLastException(JUploadException exception) {
+		this.lastException = exception;
+
+		// The log window may become visible.
+		if (this.juploadContext.getUploadPanel() != null) {
+			this.juploadContext.getUploadPanel().showOrHideLogWindow();
+		}
+
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getLastResponseBody() */
+	public String getLastResponseBody() {
+		return this.lastResponseBody;
+	}
+
+	/** @see wjhk.jupload2.policies.UploadPolicy#getLastResponseMessage() */
+	public String getLastResponseMessage() {
+		return (null != this.lastResponseMessage) ? this.lastResponseMessage
+				: "";
+	}
+
+	/**
+	 * @return The cursor that was active before setting the new one. Can be
+	 *         used to restore its previous state.
+	 * @see UploadPolicy#setCursor(Cursor)
+	 */
+	public Cursor setCursor(Cursor cursor) {
+		return this.juploadContext.setCursor(cursor);
+	}
+
+	/**
+	 * @return The cursor that was active before setting the new one. Can be
+	 *         used to restore its previous state.
+	 * @see UploadPolicy#setWaitCursor()
+	 */
+	public Cursor setWaitCursor() {
+		return this.juploadContext.setWaitCursor();
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FilesTogetherUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FilesTogetherUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/FilesTogetherUploadPolicy.java	(revision 3951)
@@ -0,0 +1,91 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2007 The JUpload Team
+//
+// Created: 10 oct. 07
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.awt.BorderLayout;
+import java.awt.GridLayout;
+import java.awt.dnd.DropTargetDropEvent;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.gui.JUploadPanel;
+
+/**
+ * 
+ * Upload policy that is a simple box. It's a 'simple' drop target. Upload
+ * starts immediately, when files are dropped on the applet. <BR>
+ * The only component displayed on the applet is the progress bar.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class FilesTogetherUploadPolicy extends DefaultUploadPolicy {
+
+    /**
+     * The JUpload constructor for this upload policy. Like all upload policies,
+     * this constructor is called by the {@link UploadPolicyFactory}
+     * 
+     * @param juploadContext
+     * @throws JUploadException
+     */
+    public FilesTogetherUploadPolicy(JUploadContext juploadContext)
+            throws JUploadException {
+        super(juploadContext);
+    }
+
+    /**
+     * This methods allow the upload policy to override the default disposition
+     * of the components on the applet.
+     * 
+     * @see UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)
+     */
+
+    @Override
+    public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel) {
+        // Set the global layout of the panel.
+        jUploadPanel.getJComponent().setLayout(new GridLayout(1, 1));
+        jUploadPanel.getJComponent().setLayout(new BorderLayout());
+        // Then, add on the screen of the only component that is visible.
+        jUploadPanel.getJComponent().add(jUploadPanel.getUploadProgressBar(),
+                BorderLayout.CENTER);
+        // Now, we add the log window.
+        jUploadPanel.showOrHideLogWindow();
+        jUploadPanel.getJComponent().add(jUploadPanel.getJLogWindowPane(),
+                BorderLayout.SOUTH);
+    }
+
+    /**
+     * Default reaction after a successful drop operation: no action.
+     * 
+     * @see UploadPolicy#afterFileDropped(DropTargetDropEvent)
+     */
+
+    @Override
+    public void afterFileDropped(DropTargetDropEvent dropEvent) {
+        getContext().getUploadPanel().doStartUpload();
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicyFactory.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicyFactory.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/UploadPolicyFactory.java	(revision 3951)
@@ -0,0 +1,175 @@
+//
+// $Id: UploadPolicyFactory.java 822 2009-07-02 14:49:12Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-06
+// Creator: etienne_sf
+// Last modified: $Date: 2009-07-02 11:49:12 -0300 (Qui, 02 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+
+import wjhk.jupload2.context.JUploadContext;
+
+/**
+ * This class is used to control creation of the uploadPolicy instance,
+ * according to applet parameters (or System properties). <BR>
+ * <BR>
+ * The used parameters are:
+ * <UL>
+ * <LI>postURL: The URL where files are to be uploaded. This parameter is
+ * mandatory if called from a servlet.
+ * <LI>uploadPolicy: the class name to be used as a policy. Currently available
+ * : not defined (then use DefaultUploadPolicy),
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy},
+ * {@link wjhk.jupload2.policies.CoppermineUploadPolicy}
+ * </UL>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 822 $
+ */
+public class UploadPolicyFactory {
+
+    /**
+     * Returns an upload Policy for the given applet and URL. All other
+     * parameters for the uploadPolicy are take from avaiable applet parameters
+     * (or from system properties, if it is not run as an applet).
+     * 
+     * @param theAppletContext if not null : use this Applet Parameters. If
+     *            null, use System properties.
+     * @return The newly created UploadPolicy.
+     * @throws Exception
+     */
+    public static UploadPolicy getUploadPolicy(JUploadContext theAppletContext)
+            throws Exception {
+        UploadPolicy uploadPolicy = theAppletContext.getUploadPolicy();
+
+        if (uploadPolicy == null) {
+            // Let's create the update policy.
+            String uploadPolicyStr = theAppletContext.getParameter(
+                    UploadPolicy.PROP_UPLOAD_POLICY,
+                    UploadPolicy.DEFAULT_UPLOAD_POLICY);
+            int debugLevel = theAppletContext.getParameter(
+                    UploadPolicy.PROP_DEBUG_LEVEL,
+                    UploadPolicy.DEFAULT_DEBUG_LEVEL);
+
+            String action = null;
+            boolean usingDefaultUploadPolicy = false;
+            try {
+                logDebug("Trying to load the given uploadPolicy: "
+                        + uploadPolicyStr, debugLevel);
+
+                action = uploadPolicyStr;
+                Class<?> uploadPolicyClass = null;
+                // Our default is "DefaultUploadPolicy", (without prefix)
+                // so we try the prefixed variant first. But only, if the
+                // user had specified an unqualified class name.
+                if (!uploadPolicyStr.contains(".")) {
+                    try {
+                        uploadPolicyClass = Class
+                                .forName("wjhk.jupload2.policies."
+                                        + uploadPolicyStr);
+                        logDebug("wjhk.jupload2.policies." + uploadPolicyStr
+                                + " class found.", debugLevel);
+                    } catch (ClassNotFoundException e1) {
+                        logDebug(e1.getClass().getName()
+                                + " when looking for [wjhk.jupload2.policies.]"
+                                + uploadPolicyStr, debugLevel);
+                        uploadPolicyClass = null;
+                    }
+                }
+                if (null == uploadPolicyClass) {
+                    // Let's try without the prefix
+                    try {
+                        uploadPolicyClass = Class.forName(uploadPolicyStr);
+                        logDebug(uploadPolicyStr + " class found.", debugLevel);
+                    } catch (ClassNotFoundException e2) {
+                        logDebug(e2.getClass().getName()
+                                + " when looking for the given uploadPolicy ("
+                                + uploadPolicyStr + ")", debugLevel);
+                        // Too bad, we don't know how to create this class.
+                        // Fall back to built-in default.
+                        usingDefaultUploadPolicy = true;
+                        uploadPolicyClass = Class
+                                .forName("wjhk.jupload2.policies.DefaultUploadPolicy");
+                        logDebug(
+                                "Using default upload policy: wjhk.jupload2.policies.DefaultUploadPolicy",
+                                debugLevel);
+                    }
+                }
+                action = "constructorParameters";
+                Class<?>[] constructorParameters = {
+                    Class.forName("wjhk.jupload2.context.JUploadContext")
+                };
+                Constructor<?> constructor = uploadPolicyClass
+                        .getConstructor(constructorParameters);
+                Object[] params = {
+                    theAppletContext
+                };
+                action = "newInstance";
+                uploadPolicy = (UploadPolicy) constructor.newInstance(params);
+            } catch (Exception e) {
+                if (e instanceof InvocationTargetException) {
+                    // If the policy's constructor has thrown an exception,
+                    // Get that "real" exception and print its details and
+                    // stack trace
+                    Throwable t = ((InvocationTargetException) e)
+                            .getTargetException();
+                    System.out.println("-ERROR- " + e.getClass().getName()
+                            + " (message: " + t.getMessage() + ")");
+                    t.printStackTrace();
+                }
+                System.out.println("-ERROR- " + e.getClass().getName() + " in "
+                        + action + "(error message: " + e.getMessage() + ")");
+                throw e;
+            }
+
+            // The current values are displayed here, after the full
+            // initialization of all classes.
+            // It could also be displayed in the DefaultUploadPolicy (for
+            // instance), but then, the
+            // display wouldn't show the modifications done by superclasses.
+            uploadPolicy.displayDebug("uploadPolicy parameter = "
+                    + uploadPolicyStr, 1);
+            if (usingDefaultUploadPolicy) {
+                uploadPolicy.displayWarn("Unable to create the '"
+                        + uploadPolicyStr
+                        + "'. Using the DefaultUploadPolicy instead.");
+            } else {
+                uploadPolicy.displayDebug("uploadPolicy = "
+                        + uploadPolicy.getClass().getName(), 20);
+            }
+
+            // Then, we display the applet parameter list.
+            uploadPolicy.displayParameterStatus();
+        }
+
+        return uploadPolicy;
+    }
+
+    /**
+     * Help to log debug information to the user. Use of log4j, one day in the
+     * future, would help.
+     * 
+     * @param currentDebugLevel
+     */
+    private static void logDebug(String msg, int currentDebugLevel) {
+        if (currentDebugLevel > 0) {
+            System.out.println("[DEBUG] " + msg);
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SuperSimpleUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SuperSimpleUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/SuperSimpleUploadPolicy.java	(revision 3951)
@@ -0,0 +1,192 @@
+//
+// $Id: DefaultUploadPolicy.java 289 2007-06-19 10:04:46 +0000 (mar., 19 juin
+// 2007) etienne_sf $
+//
+// jupload - A file upload juploadContext.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-04
+// Creator: etienne_sf
+// Last modified: $Date: 2010-02-12 18:25:00 +0100 (ven, 12 Feb 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import java.awt.BorderLayout;
+import java.awt.Color;
+import java.awt.Component;
+import java.awt.GridLayout;
+import java.awt.SystemColor;
+import java.awt.dnd.DropTarget;
+
+import javax.swing.BorderFactory;
+import javax.swing.BoxLayout;
+import javax.swing.JButton;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+import javax.swing.SwingConstants;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.gui.JUploadPanel;
+
+/**
+ * A SuperSimpleUploadPolicy - see
+ * https://sourceforge.net/tracker/?func=detail&atid
+ * =490055&aid=2954497&group_id=59144
+ * 
+ * @author nordfalk
+ * @version $Revision: 978 $
+ */
+
+public class SuperSimpleUploadPolicy extends DefaultUploadPolicy {
+
+	/**
+	 * The main constructor : use default values, and the given postURL.
+	 * 
+	 * @param juploadContext
+	 *            The current juploadContext. As the reference to the current
+	 *            upload policy exists almost everywhere, this parameter allows
+	 *            any access to anyone on the juploadContext... including
+	 *            reading the applet parameters.
+	 * @throws JUploadException
+	 *             If an applet parameter is invalid
+	 */
+	public SuperSimpleUploadPolicy(JUploadContext juploadContext)
+			throws JUploadException {
+		super(juploadContext);
+	}
+
+	/**
+	 * Implementation of
+	 * {@link wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton, JButton, JUploadPanel)}
+	 * 
+	 * @see wjhk.jupload2.policies.UploadPolicy#createTopPanel(JButton, JButton,
+	 *      JButton, JUploadPanel)
+	 */
+	public JPanel createTopPanel(JButton browse, JButton remove,
+			JButton removeAll, JUploadPanel jUploadPanel) {
+		JPanel jPanel = new JPanel();
+
+		jPanel.setLayout(new GridLayout(1, 3, 10, 5));
+		jPanel.setBorder(BorderFactory.createEmptyBorder(5, 10, 5, 10));
+		jPanel.add(browse);
+		// jPanel.add(removeAll);
+		jPanel.add(remove);
+		remove.setVisible(false); // will appear after first file has been added
+
+		jUploadPanel.getJComponent().setBorder(
+				BorderFactory.createLineBorder(SystemColor.controlDkShadow));
+
+		jPanel.setBackground(Color.WHITE);
+
+		return jPanel;
+	}
+
+	JPanel dndFilesHere;
+	JPanel progressPanel;
+	JPanel statusBar;
+
+	/**
+	 * This methods allow the upload policy to override the default disposition
+	 * of the components on the applet.
+	 * 
+	 * @see UploadPolicy#addComponentsToJUploadPanel(JUploadPanel)
+	 */
+	public void addComponentsToJUploadPanel(JUploadPanel jUploadPanel) {
+		// Set the global layout of the panel.
+		jUploadPanel.getJComponent().setLayout(
+				new BoxLayout(jUploadPanel.getJComponent(), BoxLayout.Y_AXIS));
+
+		// The top panel is the upper part of the applet: above the file
+		// list.
+		// JPanel topPanel = new JPanel();
+		JPanel topPanel = createTopPanel(jUploadPanel.getBrowseButton(),
+				jUploadPanel.getRemoveButton(), jUploadPanel
+						.getRemoveAllButton(), jUploadPanel);
+		if (topPanel != null) {
+			jUploadPanel.getJComponent().add(topPanel);
+			topPanel.addMouseListener(jUploadPanel.getMouseListener());
+		}
+
+		Component c = jUploadPanel.getFilePanel().getDropComponent();
+		// Then, we add the file list.
+		jUploadPanel.getJComponent().add(c);
+		c.setVisible(false);
+
+		c.setBackground(Color.WHITE);
+
+		dndFilesHere = new JPanel();
+		new DropTarget(this.dndFilesHere, jUploadPanel.getDndListener());
+
+		dndFilesHere.setLayout(new BorderLayout());
+		dndFilesHere.setBackground(Color.WHITE);
+		JLabel jlabel = new JLabel(
+				getLocalizedString("dragDirectoriesAndFilesToHere"));
+		jlabel.setFont(jlabel.getFont().deriveFont(36f));
+		jlabel.setHorizontalAlignment(SwingConstants.CENTER);
+		dndFilesHere.add(jlabel, BorderLayout.CENTER);
+		jUploadPanel.getJComponent().add(dndFilesHere);
+
+		// The progress panel contains the progress bar, and the upload and stop
+		// buttons.
+		progressPanel = createProgressPanel(jUploadPanel
+				.getPreparationProgressBar(), jUploadPanel
+				.getUploadProgressBar(), jUploadPanel.getUploadButton(),
+				jUploadPanel.getStopButton(), jUploadPanel);
+		jUploadPanel.getJComponent().add(progressPanel);
+		jUploadPanel.getJComponent().addMouseListener(
+				jUploadPanel.getMouseListener());
+
+		progressPanel.setVisible(false); // will appear after 1st file drop
+		progressPanel.setBackground(Color.WHITE);
+
+		// Now, we add the log window.
+		jUploadPanel.showOrHideLogWindow();
+		jUploadPanel.getJComponent().add(jUploadPanel.getJLogWindowPane());
+
+		// And, to finish with: the status bar.
+		statusBar = createStatusBar(jUploadPanel.getStatusLabel(), jUploadPanel);
+		if (null != statusBar) {
+			jUploadPanel.getJComponent().add(statusBar);
+			statusBar.addMouseListener(jUploadPanel.getMouseListener());
+
+			statusBar.setVisible(false);
+			statusBar.setBackground(Color.WHITE);
+			jUploadPanel.getStatusLabel().setText(" ");
+		}
+	}
+
+	/** {@inheritDoc} */
+	public void updateButtonState(int executionStatus) {
+		super.updateButtonState(executionStatus);
+		if (executionStatus == UploadPolicy.EXEC_STATUS_READY) {
+			this.juploadContext.getUploadPanel().getRemoveButton().setVisible(
+					true);
+			this.dndFilesHere.setVisible(false);
+			this.progressPanel.setVisible(true);
+			this.statusBar.setVisible(true);
+			this.juploadContext.getUploadPanel().getFilePanel()
+					.getDropComponent().setVisible(true);
+		} else if (executionStatus == UploadPolicy.EXEC_STATUS_UPLOADING) {
+			this.juploadContext.getUploadPanel().getRemoveButton().setVisible(
+					true);
+			this.dndFilesHere.setVisible(false);
+			this.progressPanel.setVisible(true);
+			this.statusBar.setVisible(true);
+			this.juploadContext.getUploadPanel().getFilePanel()
+					.getDropComponent().setVisible(true);
+		}
+
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CustomizedNbFilesPerRequestUploadPolicy.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CustomizedNbFilesPerRequestUploadPolicy.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/CustomizedNbFilesPerRequestUploadPolicy.java	(revision 3951)
@@ -0,0 +1,52 @@
+//
+// $Id: CustomizedNbFilesPerRequestUploadPolicy.java 441 2008-04-16 07:58:02Z
+// etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-06
+// Creator: etienne_sf
+// Last modified: $Date: 2009-05-14 19:15:38 -0300 (Qui, 14 Mai 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.policies;
+
+import wjhk.jupload2.context.JUploadContext;
+import wjhk.jupload2.exception.JUploadException;
+
+/**
+ * These is a now deprecated specialization of
+ * {@link wjhk.jupload2.policies.DefaultUploadPolicy}. The DefaultUploadPolicy
+ * now reads itself the nbFilesPerRequest applet parameter. <BR>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 755 $
+ * @see #CustomizedNbFilesPerRequestUploadPolicy(JUploadContext)
+ * @deprecated This class is of no use, as it actually behaves exactly as the
+ *             {@link wjhk.jupload2.policies.DefaultUploadPolicy}.
+ */
+@Deprecated
+public class CustomizedNbFilesPerRequestUploadPolicy extends
+        DefaultUploadPolicy {
+
+    /**
+     * @param theContext The applet to whom the UploadPolicy must apply.
+     * @throws JUploadException
+     * @see UploadPolicy
+     */
+    public CustomizedNbFilesPerRequestUploadPolicy(JUploadContext theContext)
+            throws JUploadException {
+        super(theContext);
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/policies/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/policies/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/policies/package.html	(revision 3951)
@@ -0,0 +1,298 @@
+
+<HTML>
+
+<BODY>
+
+<P>This package contains the upload policies: they give you hook entry points, to override the default applet behaviour 
+with a minimum of java code.</P>
+
+This pages describes how to create a new upload policy, to adapt the applet to your needs, without interfering
+with the core applet, that is: with having compatibility with future JUpload versions. Here are other links on this subject:
+<DIR>
+<LI> See {@link wjhk.jupload2.policies.UploadPolicy} for the list of applet parameters</LI>
+<LI><a href="../../../howto-customization.html">howto customize</a> for a presentation of
+the main ways to adapt the applet to your needs.
+</DIR>
+
+
+<H3>Creating a new upload policy: introduction</H3>
+
+Creating a new upload policy, allows you to change the applet behaviour, and still use the core applet function. This 
+insures you that your development will remain compatible with next applet versions.
+<P>You'll find on this page a description of the {@link wjhk.jupload2.policies.UploadPolicy} methods, grouped by categories.</P>
+<P><B>Note:</B> Creating a new upload policy is mandatory, if you want to manage some other kind of {@link wjhk.jupload2.filedata.FileData}. 
+You can then add some kind of 'before upload check', or have a specific applet behaviour, for instance be able to hear 
+sound file before upload.</P>
+
+<h3>Presentation</h3>
+
+<p>To create a new upload policy, you need to create a new java
+class: the easiest way is to inherit from @link wjhk.jupload2.policies.DefaultUploadPolicy}. 
+You can then override methods of the UploadPolicy interface that you need to update for your needs.</p>
+<p>This kind of customization will be compatible within next JUpload
+applet release. If you need other hooks (method within the UploadPolicy
+interface, to allow other customizations), please let me know by posting a message
+on the sourceforge jupload forums (open discussions for instance), or
+post a new Feature Request in the jupload sourceforge project page. For instance, some attributes and methods from 
+DefaultUploadPolicy are protected (not private), so that you can use them in your own upload policies.</p>
+<p>Here is a sample description of the customization that you can do by
+using the creating a new policy, using the UploadPolicy interface. All methods are described in
+the next section of this page.</p>
+<ul>
+    <li>Control files management:
+    <ul>
+        <li>Authorization (or not) to add a file to the list of
+        files to upload, see UploadPolicy#createFileData(File, File). This
+        allows the policy to validate files, before adding them to the
+        list of files that must be displayed. The
+        {@link wjhk.jupload2.policies.UploadPolicy#createFileData(File, File)} checks that the added
+        files are valid pictures.</li>
+        <li>File preparation before upload (for instance to resize
+        a picture, or encode a text file to a specific format)</li>
+    </ul>
+    </li>
+    <li>Display other buttons on the applet (or remove the default
+    buttons), see UploadPolicy.createTopPanel(JButton, JButton, JButton,
+    JPanel)</li>
+    <li>Specific behaviour, on file selection. The
+    wjhk.jupload2.policies.PictureUploadPolicy allows picture
+    management. The UploadPolicy.onSelectFile(FileData) method is called
+    when the user selects a file in the list. This allow the policy to
+    do any action about this file. The
+    PictureUploadPolicy.onSelectFile(FileData) displays a preview
+    pictures on the top part of the applet.</li>
+</ul>
+
+<h3>Note: UploadPolicyFactory</h3>
+
+<p>The JuploadApplet asks the UploadPolicyFactory to create
+(instanciate) the needed UploadPolicy. That is:</p>
+<dir>
+    <li>During initialization of the applet, the
+    UploadPolicyFactory.getUploadPolicy() method is called. This method
+    checks the <i>uploadPolicy</i> parameter. If this uploadPolicy is
+    unknown or not set, the DefaultUploadPolicy is used. If a specific
+    uploadPolicy is found, it can of course read specific parameters
+    from the APPLET tag.</li>
+    <li>Then, UploadPolicyFactory.getUploadPolicy() creates the
+    class implementing the UploadPolicy factory, and returns the
+    reference to this class.</li>
+    <li>The upload policy can not be changed while the applet is
+    running.</li>
+</dir>
+
+<h3>Creation of a new UploadPolicy: detailed steps</h3>
+<p>To create a new UploadPolicy, you'll need to:</p>
+<ul>
+    <li><b>Create a new class, implementing the UploadPolicy
+    interface</b>. The easiest way is to inherit from an existing
+    UploadPolicy. This insure that your new policy will be compatible
+    with next JUpload releases. <br>
+    <i>Note: The upload policies are created by UploadPolicyFactory.
+    <U>Their constructor must:</U>
+    <ul>
+        <li>Be public, to be called by this class,</li>
+        <li>Have one parameter: the current <a href="../context/JUploadContext.html">wjhk.jupload2.context.JUploadContext</a>.</li>
+    </ul>
+    </i></li>
+    <li><b>Override some UploadPolicy methods</b>, to have your
+    specific behaviour.</li>
+    <li>Don't change any other java code, so that your upload
+    policy will work with next JUpload releases. <br>
+    <i>Note: if you need another 'hook', to be able to add specific
+    customization, please add a new Feature Request in sourceforge, I'll receive a notification mail.</i></li>
+</ul>
+
+	
+<H3>Methods to control file management</H3>
+
+<H4>FileData createFileData(File file, File root) throws JUploadExceptionStopAddingFiles</H4>
+<P>This methods creates a new {@link wjhk.jupload2.filedata.FileData} object. It returns null is no file data was created, for instance
+if this file didn't check some specific validation checks. <BR>
+<B>Note:</B> use this method to use any FileData specific to your needs. See {@link wjhk.jupload2.policies.PictureUploadPolicy} for a sample
+of this.
+</P>
+
+<H4>void afterFileDropped(DropTargetDropEvent dropEvent)</H4>
+<P>Specific reaction of the applet, when file are dropped onto it.</P>
+
+
+<H3>Methods to control the applet GUI (display, behaviour)</H3>
+
+This methods are used to control what the {@link wjhk.jupload2.gui.JUploadFileChooser} has to do.
+
+<H4>JPanel createTopPanel(JButton browse, JButton remove, JButton removeAll, JUploadPanel mainPanel)</H4>
+<P>Allows the applet to change the way the top part of the applet is displayed, that is: the place where the 
+Choose, remove, remove all buttons are. <B>If you override this method, you must use the given button if you want
+these functionalities to work</B>. If you don't put the browse button, for instance, the user won't be able to 
+display a file chooser, unless you manage it yourself. See {@link wjhk.jupload2.policies.PictureUploadPolicy}, for a way to use the 
+standard buttons, and add specific ones.</P>
+
+
+<H4>void addComponentsToJUploadPanel(JUploadPanel jUploadPanel)</H4>
+<P>Extension of the createTopPanel() idea. You can place any component of JUpload at any place ... or at no place.
+<B>If you override this method, you'll have to call the {@link wjhk.jupload2.gui.JUploadPanel} getter to get core applet objects.</B> 
+These are: 
+<DIR>
+<LI>Standard buttons: browseButton, removeButton, removeAllButton, stopButton, uploadButton. 
+<LI>Drag'n drop listener: dndListener, to manage files dropped on the applet
+<LI>The log output: jLogWindowPane
+<LI>The progress bar, which indicated the upload progress (from 0 to 100%): progressBar.
+<LI>The status label, where upload speed is indicated:
+<LI>The file panel, that contains the list of files to upload: filePanel.
+</DIR>
+</P>
+
+<H4>JPanel createProgressPanel(JProgressBar progressBar, JButton uploadButton, JButton stopButton, JPanel mainPanel)</H4>
+<P>You probably won't have to override this method. Note that this method allows you to not
+display the stop and upload buttons.	</P>
+
+<H4>JPanel createStatusBar(JLabel statusContent, JPanel mainPanel)</H4>
+<P>This method should not be used any more. Use the showStatusBar applet parameter instead.</P>
+
+<H4>void onFileSelected(FileData fileData)</H4>
+<P>Reaction of the applet, when a file is selected in the file list. For instance, {@link wjhk.jupload2.policies.PictureUploadPolicy} 
+displays the selected picture in the preview component.</P>
+
+<H4>void onFileDoubleClicked(FileData fileData)</H4>
+<P>Reaction of the applet, when a file is double clicked. For instance, {@link wjhk.jupload2.policies.PictureUploadPolicy} opens a dialog
+box, that contain a full screen display of the current picture.	</P>
+
+
+<H3>Methods to control the file chooser</H3>
+
+This methods are used to control what the {@link wjhk.jupload2.gui.JUploadFileChooser} has to do.
+
+<H4>JUploadFileChooser createFileChooser()</H4>
+<P>Allows the applet to change user another JFileChooser. Your specific file chooser should inherit 
+from JUploadFileChooser</P>
+
+<H4>boolean fileFilterAccept(File file)</H4>
+<P>Called by the {@link wjhk.jupload2.gui.JUploadFileFilter}. This method contains the actual response to the {
+@link java.io.FileFilter#accept(File)} method of the FileFilter interface. It allows to control what can be displayed 
+on the file chooser.</P>
+
+<H4>String fileFilterGetDescription()</H4>
+<P>The file filter description, in the file chooser. The default is to display the list of authorized 
+extensions. This can be too large, if many extensions are authorized. You can then put here a more descriptive text.</P>
+
+<H4>Icon fileViewGetIcon(File file)</H4>
+<P>Returns the icon that must be displayed for this file on the file chooser. This method is called asynchroneously,
+so that long calculation won't block the applet. See an example in the {@link wjhk.jupload2.policies.PictureUploadPolicy}. This policy
+returns an icon created from the picture content.</P>
+
+
+<H3>Upload management</H3>
+
+<H4>boolean isUploadReady()</H4>
+<P>Allows a control of the current upload policy, before any upload work starts. <B>You'll probably have to override
+this method if you want to do pre-upload checks on files</B></P>
+
+<H4>void beforeUpload()</H4>
+<P>This method is called just before upload, for instance to allow any 'before upload' work, like computing 
+some global information. See also the FileData.beforeUpload(), that is called for each file.</P>
+
+<H4>boolean checkUploadSuccess(int status, String msg, String body) throws JUploadException</H4>
+<P>You probably won't have to override this method, if you use the stringUploadSuccess and stringUploadError
+applet parameters. If not, this method allows you to check that upload is a success. That is: there is no
+error (for instance, page not found), and the server side application actually accepted the file(s).</P>
+
+<H4>void afterUpload(Exception e, String serverOutput) throws JUploadException</H4>
+<P>Allows the caller to free any resource used during upload. See also the FileData.afterUpload(), that is called 
+for each file.</P>
+
+<H4>String getLastResponseBody()</H4>
+<P>This method is useful only in HTTP upload (not FTP, for instance). It allows any check or update of applet
+variables based on the server return. You probably should not have to override this method.</P>
+
+<H4>String getLastResponseMessage()</H4>
+<P>This method is useful only in HTTP upload (not FTP, for instance). It returns the full HTTP response, with headers. 
+It allows any check or update of applet variables based on the server return. You probably should not have to override
+this method.</P>
+
+<H4>void addHeader(String header)</H4>
+<P>Add a header to the list of all header that must be added to all upload. Useful only when uploading in HTTP mode.
+If you override this method, you'll have to override the onAppendHeader(ByteArrayEncoder) method.</P>
+
+<H4>ByteArrayEncoder onAppendHeader(ByteArrayEncoder sb) throws JUploadIOException</H4>
+<P>Add header on the HTTP request, while this requet is being written to the server. <B>If you override this 
+method, you'll have to call super.onAppendHeader(ByteArrayEncoder) method</B>.</P>
+
+<H4>String getSpecificHeaders()</H4>
+<P>Allows the upload policy to add specific headers. This is used only for HTTP upload.</P>
+
+<H4>String getFormdata()</H4>
+<P>Load data from an HTML form. These data will be set with each file in the upload. See also the
+{@link wjhk.jupload2.filedata.FileData#appendFileProperties(ByteArrayEncoder)} method, for a way to add data specific to one file.</P>
+
+
+<H3>Getters and setters</H3>
+
+<P>The last category of methods is the getters and setters. There is a getter for each applet parameter. Most of applet parameters
+also has a setter. You can override them to add some execution time calculation. For instance, {@link Coppermine#getPostURL()} 
+calls the default getter, than the album id as a new parameter on the URL.</P>
+<P>Here are the other getters:</P>
+
+<H4>void setProperty(String prop, String value) throws JUploadException</H4>
+<P>Allows to set any property. This can be called for any applet parameter. <B>This method can be called from 
+Javascript</B>, to allow runtime control of applet state by the javascript.</P>
+
+<H4>JUploadApplet getApplet()</H4>
+<P>This important getter returns the JUploadApplet. From it, you can get any GUI component.</P>
+
+<H4>String getDateFormat()</H4>
+<P>Returns the current date format, so that all date/time are displayed by using the same format.</P>
+
+<H4>int getSslVerifyCert()</H4>
+<P>For SSL management. Standard code should be good enough.</P>
+
+
+<H3>Message display (debug, info, warning, error...)</H3>
+
+<H4>void displayParameterStatus()</H4>
+<P><B>You should override</B> this method, to display any parameter specific to your upload policy. See 
+{@link wjhk.jupload2.policies.PictureUploadPolicy} for a sample.</P>
+
+<H4>void alert(String key)</H4>
+<P>You probably won't have to override this method. Displays an alert box, based on the key of the translated message.</P>
+
+<H4>void alertStr(String str)</H4>
+<P>You probably won't have to override this method. Displays an alert box.</P>
+
+<H4>void displayInfo(String info)</H4>
+<P>You probably won't have to override this method.. Will be renamed, as it just logged an info message.</P>
+
+<H4>void displayWarn(String warn)</H4>
+<P>You probably won't have to override this method. Will be renamed, as it just logs a warning.</P>
+
+<H4>void displayDebug(String debug, int minDebugLevel)</H4>
+<P>You probably won't have to override this method.. Will be renamed, as it just logs a debug message.</P>
+
+<H4>void displayErr(String err, Exception e)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>void displayErr(Exception e)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>void displayErr(String err)</H4>
+<P>You probably won't have to override this method. Will be renamed.</P>
+
+<H4>String getString(String key)</H4>
+<P>You probably won't have to override this method. Manages text translation.</P>
+
+
+<H3>Miscellaneous methods </H3>
+
+<H4>Cursor setWaitCursor()</H4>
+<P>You can change the applet wait cursor, by overriding this method.</P>
+
+<H4>void setCursor(Cursor cursor)</H4>
+<P>I don't think you'll have to override this one...</P>
+
+<H4>void sendDebugInformation(String reason)</H4>
+<P>send the debug output to the urlToSendErrorTo applet parameter. Allows logging on the server ... if this calls
+succeed, which is not the case when the server has a big trouble.</P>
+
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageHelper.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageHelper.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageHelper.java	(revision 3951)
@@ -0,0 +1,688 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2008 The JUpload Team
+//
+// Created: 12 fevr. 08
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata.helper;
+
+import java.awt.Image;
+import java.awt.geom.AffineTransform;
+import java.awt.image.AffineTransformOp;
+import java.awt.image.BufferedImage;
+import java.awt.image.ImageObserver;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.DefaultFileData;
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.PictureUploadPolicy;
+
+/**
+ * Class that contains various utilities about picture, mainly about picture
+ * transformation.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class ImageHelper implements ImageObserver {
+
+    /**
+     * hasToTransformPicture indicates whether the picture should be
+     * transformed. Null if unknown. This can happen (for instance) if no calcul
+     * where done (during initialization), or after rotating the picture back to
+     * the original orientation. <BR>
+     * <B>Note:</B> this attribute is from the class Boolean (and not a simple
+     * boolean), to allow null value, meaning <I>unknown</I>.
+     */
+    private Boolean hasToTransformPicture = null;
+
+    /**
+     * The {@link PictureFileData} that this helper will have to help.
+     */
+    private PictureFileData pictureFileData;
+
+    /**
+     * Current rotation of the picture: 0 to 3.
+     * 
+     * @see PictureFileData
+     */
+    private int quarterRotation;
+
+    /**
+     * Maximum width for the current transformation
+     */
+    private int maxWidth;
+
+    /**
+     * Maximum height for the current transformation
+     */
+    private int maxHeight;
+
+    /**
+     * Defines the number of pixel for the current picture. Used to update the
+     * progress bar.
+     * 
+     * @see #getBufferedImage(boolean, BufferedImage)
+     * @see #imageUpdate(Image, int, int, int, int, int)
+     */
+    private int nbPixelsTotal = -1;
+
+    /**
+     * Indicates the number of pixels that have been read.
+     * 
+     * @see #nbPixelsTotal
+     * @see #imageUpdate(Image, int, int, int, int, int)
+     */
+    private int nbPixelsRead = 0;
+
+    /**
+     * Width of picture, after rescaling but without rotation. It should be
+     * scale*originalWidth, but, due to rounding number, it can be transformed
+     * to scale*originalWidth-1.
+     * 
+     * @see #initScale()
+     */
+    private int scaledNonRotatedWidth = -1;
+
+    /**
+     * Same as {@link #scaledNonRotatedWidth}
+     */
+    private int scaledNonRotatedHeight = -1;
+
+    /**
+     * The value that has the progress bar when starting to load the picture.
+     * The {@link #imageUpdate(Image, int, int, int, int, int)} method will add
+     * from 0 to 100, to indicate progress with a percentage value of picture
+     * loading.
+     */
+    private int progressBarBaseValue = 0;
+
+    /**
+     * Current scaling factor. If less than 1, means a picture reduction.
+     * 
+     * @see #initScale()
+     */
+    private double scale = 1;
+
+    /**
+     * Width of picture, after re-scaling and rotation. It should be
+     * scale*originalWidth or scale*originalHeight (depending on the rotation).
+     * But, due to rounding number, it can be transformed to
+     * scale*originalWidth-1 or scale*originalHeight-1.
+     * 
+     * @see #initScale()
+     */
+    private int scaledRotatedWidth = -1;
+
+    /**
+     * Same as {@link #scaledRotatedWidth}, for the height.
+     */
+    private int scaledRotatedHeight = -1;
+
+    /**
+     * The current upload policy must be a {@link PictureUploadPolicy}
+     */
+    PictureUploadPolicy uploadPolicy;
+
+    /**
+     * Standard constructor.
+     * 
+     * @param uploadPolicy The current upload policy
+     * @param pictureFileData The picture file data to help
+     * @param targetMaxWidth
+     * @param targetMaxHeight
+     * @param quarterRotation Current quarter rotation (from 0 to 3)
+     * @throws JUploadIOException
+     */
+    public ImageHelper(PictureUploadPolicy uploadPolicy,
+            PictureFileData pictureFileData, int targetMaxWidth,
+            int targetMaxHeight, int quarterRotation) throws JUploadIOException {
+        this.uploadPolicy = uploadPolicy;
+        this.pictureFileData = pictureFileData;
+        this.maxWidth = targetMaxWidth;
+        this.maxHeight = targetMaxHeight;
+        this.quarterRotation = quarterRotation;
+
+        // Pre-calculation: should the current picture be rescaled, to match the
+        // given target size ?
+        initScale();
+    }
+
+    /**
+     * Intialization of scale factor, for the current picture state. The scale
+     * is based on the maximum width and height, the current rotation, and the
+     * picture size.
+     */
+    private void initScale() throws JUploadIOException {
+        double theta = Math.toRadians(90 * this.quarterRotation);
+
+        // The width and height depend on the current rotation :
+        // calculation of the width and height of picture after
+        // rotation.
+        int nonScaledRotatedWidth = this.pictureFileData.getOriginalWidth();
+        int nonScaledRotatedHeight = this.pictureFileData.getOriginalHeight();
+        if (this.quarterRotation % 2 != 0) {
+            // 90 degrees or 270 degrees rotation: width and height are
+            // switched.
+            nonScaledRotatedWidth = this.pictureFileData.getOriginalHeight();
+            nonScaledRotatedHeight = this.pictureFileData.getOriginalWidth();
+        }
+        // Now, we can compare these width and height to the maximum
+        // width and height
+        double scaleWidth = ((this.maxWidth < 0) ? 1 : ((double) this.maxWidth)
+                / nonScaledRotatedWidth);
+        double scaleHeight = ((this.maxHeight < 0) ? 1
+                : ((double) this.maxHeight) / nonScaledRotatedHeight);
+        this.scale = Math.min(scaleWidth, scaleHeight);
+        if (this.scale < 1) {
+            // With number rounding, it can happen that width or size
+            // became one pixel too big. Let's correct it.
+            if ((this.maxWidth > 0 && this.maxWidth < (int) (this.scale
+                    * Math.cos(theta) * nonScaledRotatedWidth))
+                    || (this.maxHeight > 0 && this.maxHeight < (int) (this.scale
+                            * Math.cos(theta) * nonScaledRotatedHeight))) {
+                scaleWidth = ((this.maxWidth < 0) ? 1
+                        : ((double) this.maxWidth - 1)
+                                / (nonScaledRotatedWidth));
+                scaleHeight = ((this.maxHeight < 0) ? 1
+                        : ((double) this.maxHeight - 1)
+                                / (nonScaledRotatedHeight));
+                this.scale = Math.min(scaleWidth, scaleHeight);
+            }
+        }
+
+        // These variables contain the actual width and height after
+        // rescaling, and before rotation.
+        this.scaledRotatedWidth = nonScaledRotatedWidth;
+        this.scaledRotatedHeight = nonScaledRotatedHeight;
+        // Is there any rescaling to do ?
+        // Patch for the first bug, tracked in the sourceforge bug
+        // tracker ! ;-)
+        if (this.scale < 1) {
+            this.scaledRotatedWidth *= this.scale;
+            this.scaledRotatedHeight *= this.scale;
+            this.uploadPolicy.displayDebug("Resizing factor (scale): "
+                    + this.scale, 30);
+        } else {
+            this.uploadPolicy.displayDebug(
+                    "Resizing factor (scale): no resizing (calculated scale was "
+                            + this.scale + ")", 30);
+        }
+        // Due to rounded numbers, the resulting targetWidth or
+        // targetHeight
+        // may be one pixel too big. Let's check that.
+        if (this.scaledRotatedWidth > this.maxWidth) {
+            this.uploadPolicy.displayDebug("Correcting rounded width: "
+                    + this.scaledRotatedWidth + " to " + this.maxWidth, 50);
+            this.scaledRotatedWidth = this.maxWidth;
+        }
+        if (this.scaledRotatedHeight > this.maxHeight) {
+            this.uploadPolicy.displayDebug("Correcting rounded height: "
+                    + this.scaledRotatedHeight + " to " + this.maxHeight, 50);
+            this.scaledRotatedHeight = this.maxHeight;
+        }
+
+        // getBufferedImage will need the two following value:
+        if (this.quarterRotation % 2 == 0) {
+            this.scaledNonRotatedWidth = this.scaledRotatedWidth;
+            this.scaledNonRotatedHeight = this.scaledRotatedHeight;
+        } else {
+            this.scaledNonRotatedWidth = this.scaledRotatedHeight;
+            this.scaledNonRotatedHeight = this.scaledRotatedWidth;
+        }
+    }
+
+    /**
+     * This function indicate if the picture has to be modified. For instance :
+     * a maximum width, height, a target format...
+     * 
+     * @return true if the picture must be transformed. false if the file can be
+     *         directly transmitted.
+     * @throws JUploadException Contains any exception that could be thrown in
+     *             this method
+     */
+    public boolean hasToTransformPicture() throws JUploadException {
+        // Animated gif must be transmit as is, as I can't find a way to
+        // recreate them.
+        if (DefaultFileData.getExtension(this.pictureFileData.getFile())
+                .equalsIgnoreCase("gif")) {
+            // If this is an animated gif, no transformation... I can't succeed
+            // to create a transformed picture file for them.
+            ImageReaderWriterHelper irwh = new ImageReaderWriterHelper(
+                    this.uploadPolicy, this.pictureFileData);
+            int nbImages = irwh.getNumImages(true);
+            irwh.dispose();
+            irwh = null;
+            if (nbImages > 1) {
+                // Too bad. We can not transform it.
+                this.hasToTransformPicture = Boolean.FALSE;
+                this.uploadPolicy
+                        .displayWarn("No transformation for gif picture file, that contain several pictures. (see JUpload documentation for details)");
+            }
+        }
+
+        // Did we already estimate if transformation is needed ?
+        if (this.hasToTransformPicture == null) {
+
+            // First : the easiest test. Should we block metadata ?
+            if (this.hasToTransformPicture == null
+                    && !(this.uploadPolicy).getPictureTransmitMetadata()) {
+                this.hasToTransformPicture = Boolean.TRUE;
+                this.uploadPolicy
+                        .displayDebug(
+                                this.pictureFileData.getFileName()
+                                        + " : hasToTransformPicture=true (pictureTransmitMetadata is false)",
+                                80);
+            }
+            // Second : another easy test. A rotation is needed ?
+            if (this.hasToTransformPicture == null && this.quarterRotation != 0) {
+                this.uploadPolicy
+                        .displayDebug(
+                                this.pictureFileData.getFileName()
+                                        + " : hasToTransformPicture = true (quarterRotation != 0)",
+                                10);
+                this.hasToTransformPicture = Boolean.TRUE;
+            }
+
+            // Third : the picture format is the same ?
+            String targetFormat = this.uploadPolicy
+                    .getImageFileConversionInfo().getTargetFormatOrNull(
+                            this.pictureFileData.getFileExtension());
+            if (this.hasToTransformPicture == null && targetFormat != null) {
+                this.uploadPolicy
+                        .displayDebug(
+                                this.pictureFileData.getFileName()
+                                        + " : hasToTransformPicture = true (targetPictureFormat)",
+                                10);
+                this.hasToTransformPicture = Boolean.TRUE;
+            }
+
+            // Fourth : should we resize the picture ?
+            if (this.hasToTransformPicture == null && this.scale < 1) {
+                this.uploadPolicy.displayDebug(this.pictureFileData
+                        .getFileName()
+                        + " : hasToTransformPicture = true (scale < 1)", 10);
+                this.hasToTransformPicture = Boolean.TRUE;
+            }
+
+            // If we find no reason to transform the picture, then let's let the
+            // picture unmodified.
+            if (this.hasToTransformPicture == null) {
+                this.uploadPolicy.displayDebug(this.pictureFileData
+                        .getFileName()
+                        + " : hasToTransformPicture = false", 10);
+                this.hasToTransformPicture = Boolean.FALSE;
+                this.uploadPolicy.displayDebug(this.pictureFileData
+                        .getFileName()
+                        + " : hasToTransformPicture = false", 10);
+            }
+        }
+
+        return this.hasToTransformPicture.booleanValue();
+    }// end of hasToTransformPicture
+
+    /**
+     * This function resizes the picture, if necessary, according to the
+     * maxWidth and maxHeight, given to the ImageHelper constructor. <BR>
+     * This function should only be called if isPicture is true. Otherwise, an
+     * exception is raised. <BR>
+     * Note (Update given by David Gnedt): the highquality will condition the
+     * call of getScaledInstance, instead of a basic scale Transformation. The
+     * generated picture is of better quality, but this is longer, especially on
+     * 'small' CPU. Time samples, with one picture from my canon EOS20D, on a
+     * PII 500M: <BR>
+     * ~3s for the full screen preview with highquality to false, and a quarter
+     * rotation. 12s to 20s with highquality to true. <BR>
+     * ~5s for the first (small) preview of the picture, with both highquality
+     * to false or true.
+     * 
+     * @param highquality (added by David Gnedt): if set to true, the
+     *            BufferedImage.getScaledInstance() is called. This generates
+     *            better image, but consumes more CPU.
+     * @param sourceBufferedImage The image to resize or rotate or both or no
+     *            tranformation...
+     * @return A BufferedImage which contains the picture according to current
+     *         parameters (resizing, rotation...), or null if this is not a
+     *         picture.
+     * @throws JUploadException Contains any exception thrown from within this
+     *             method.
+     */
+    public BufferedImage getBufferedImage(boolean highquality,
+            BufferedImage sourceBufferedImage) throws JUploadException {
+        long msGetBufferedImage = System.currentTimeMillis();
+        double theta = Math.toRadians(90 * this.quarterRotation);
+
+        BufferedImage returnedBufferedImage = null;
+
+        this.uploadPolicy.displayDebug("getBufferedImage: start", 10);
+
+        try {
+            AffineTransform transform = new AffineTransform();
+
+            if (this.quarterRotation != 0) {
+                double translationX = 0, translationY = 0;
+                this.uploadPolicy.displayDebug("getBufferedImage: quarter: "
+                        + this.quarterRotation, 50);
+
+                // quarterRotation is one of 0, 1, 2, 3 : see addRotation.
+                // If we're here : it's not 0, so it's one of 1, 2 or 3.
+                switch (this.quarterRotation) {
+                    case 1:
+                        translationX = 0;
+                        translationY = -this.scaledRotatedWidth;
+                        break;
+                    case 2:
+                        translationX = -this.scaledRotatedWidth;
+                        translationY = -this.scaledRotatedHeight;
+                        break;
+                    case 3:
+                        translationX = -this.scaledRotatedHeight;
+                        translationY = 0;
+                        break;
+                    default:
+                        this.uploadPolicy
+                                .displayWarn("Invalid quarterRotation : "
+                                        + this.quarterRotation);
+                        this.quarterRotation = 0;
+                        theta = 0;
+                }
+                transform.rotate(theta);
+                transform.translate(translationX, translationY);
+            }
+
+            // If we have to rescale the picture, we first do it:
+            if (this.scale < 1) {
+                if (highquality) {
+                    this.uploadPolicy
+                            .displayDebug(
+                                    "getBufferedImage: Resizing picture(using high quality picture)",
+                                    30);
+
+                    // SCALE_AREA_AVERAGING forces the picture calculation
+                    // algorithm.
+                    // Other parameters give bad picture quality.
+                    Image img = sourceBufferedImage.getScaledInstance(
+                            this.scaledNonRotatedWidth,
+                            this.scaledNonRotatedHeight,
+                            Image.SCALE_AREA_AVERAGING);
+
+                    // the localBufferedImage may be 'unknown'.
+                    int localImageType = sourceBufferedImage.getType();
+                    if (localImageType == BufferedImage.TYPE_CUSTOM) {
+                        localImageType = BufferedImage.TYPE_INT_BGR;
+                    }
+
+                    BufferedImage tempBufferedImage = new BufferedImage(
+                            this.scaledNonRotatedWidth,
+                            this.scaledNonRotatedHeight, localImageType);
+
+                    // drawImage can be long. Let's follow its progress,
+                    // with the applet progress bar.
+                    this.nbPixelsTotal = this.scaledNonRotatedWidth
+                            * this.scaledNonRotatedHeight;
+                    this.nbPixelsRead = 0;
+
+                    // Let's draw the picture: this code do the rescaling.
+                    this.uploadPolicy.displayDebug(
+                            "getBufferedImage: Before drawImage", 50);
+                    tempBufferedImage.getGraphics().drawImage(img, 0, 0, this);
+                    this.uploadPolicy.displayDebug(
+                            "getBufferedImage: After drawImage", 50);
+
+                    tempBufferedImage.flush();
+
+                    img.flush();
+                    img = null;
+                    PictureFileData
+                            .freeMemory("ImageHelper.getBufferedImage()",
+                                    this.uploadPolicy);
+
+                    // tempBufferedImage contains the rescaled picture. It's
+                    // the source image for the next step (rotation).
+                    sourceBufferedImage = tempBufferedImage;
+                    tempBufferedImage = null;
+                } else {
+                    // 'low' quality
+                    //
+                    // The scale method adds scaling before current
+                    // transformation.
+                    this.uploadPolicy
+                            .displayDebug(
+                                    "getBufferedImage: Resizing picture(using standard quality picture)",
+                                    50);
+                    transform.scale(this.scale, this.scale);
+                }
+            }
+
+            if (transform.isIdentity()) {
+                returnedBufferedImage = sourceBufferedImage;
+            } else {
+                AffineTransformOp affineTransformOp = null;
+                // Pictures are Ok.
+                affineTransformOp = new AffineTransformOp(transform,
+                        AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
+                returnedBufferedImage = affineTransformOp
+                        .createCompatibleDestImage(sourceBufferedImage, null);
+                // Checks, after the fact the pictures produces by the Canon
+                // EOS 30D are not properly resized: colors are 'strange'
+                // after resizing.
+                this.uploadPolicy.displayDebug(
+                        "getBufferedImage: returnedBufferedImage.getColorModel(): "
+                                + sourceBufferedImage.getColorModel()
+                                        .toString(), 50);
+                this.uploadPolicy.displayDebug(
+                        "getBufferedImage: returnedBufferedImage.getColorModel(): "
+                                + sourceBufferedImage.getColorModel()
+                                        .toString(), 50);
+                affineTransformOp.filter(sourceBufferedImage,
+                        returnedBufferedImage);
+                affineTransformOp = null;
+
+                returnedBufferedImage.flush();
+            }
+        } catch (Exception e) {
+            throw new JUploadException(e.getClass().getName() + " ("
+                    + this.getClass().getName() + ".getBufferedImage()) : "
+                    + e.getMessage());
+        }
+
+        if (returnedBufferedImage != null
+                && this.uploadPolicy.getDebugLevel() >= 50) {
+            this.uploadPolicy.displayDebug("getBufferedImage: "
+                    + returnedBufferedImage, 50);
+            this.uploadPolicy.displayDebug("getBufferedImage: MinX="
+                    + returnedBufferedImage.getMinX(), 50);
+            this.uploadPolicy.displayDebug("getBufferedImage: MinY="
+                    + returnedBufferedImage.getMinY(), 50);
+        }
+
+        this.uploadPolicy.displayDebug("getBufferedImage: was "
+                + (System.currentTimeMillis() - msGetBufferedImage)
+                + " ms long", 50);
+        PictureFileData.freeMemory("ImageHelper.getBufferedImage()",
+                this.uploadPolicy);
+        return returnedBufferedImage;
+    }
+
+    /**
+     * This method is a work in progress
+     * 
+     * @param highquality
+     * @param sourceBufferedImage
+     * @return The calculated BufferedImage, resized and rotated according to
+     *         the current configuration.
+     * @throws JUploadException
+     */
+    BufferedImage getBufferedImage2(boolean highquality,
+            BufferedImage sourceBufferedImage) throws JUploadException {
+        long msGetBufferedImage = System.currentTimeMillis();
+        BufferedImage dest = null;
+
+        // Scale factor calculation
+        this.uploadPolicy.displayDebug("getBufferedImage: quarter: "
+                + this.quarterRotation, 50);
+
+        // quarterRotation is one of 0, 1, 2, 3 : see addRotation.
+        @SuppressWarnings("unused")
+        int maxWidthBeforeRotation, maxHeigthBeforeRotation, widthBeforeRotation, heigthBeforeRotation, widthAfterRotation, heigthAfterRotation;
+        @SuppressWarnings("unused")
+        double theta = Math.toRadians(90 * this.quarterRotation);
+        switch (this.quarterRotation) {
+            case 0:
+            case 2:
+                maxWidthBeforeRotation = this.uploadPolicy.getMaxWidth();
+                maxHeigthBeforeRotation = this.uploadPolicy.getMaxHeight();
+                widthBeforeRotation = sourceBufferedImage.getWidth();
+                heigthBeforeRotation = sourceBufferedImage.getHeight();
+                widthAfterRotation = sourceBufferedImage.getWidth();
+                heigthAfterRotation = sourceBufferedImage.getHeight();
+                break;
+            case 1:
+            case 3:
+                maxWidthBeforeRotation = this.uploadPolicy.getMaxHeight();
+                maxHeigthBeforeRotation = this.uploadPolicy.getMaxWidth();
+                widthBeforeRotation = sourceBufferedImage.getHeight();
+                heigthBeforeRotation = sourceBufferedImage.getWidth();
+                widthAfterRotation = sourceBufferedImage.getHeight();
+                heigthAfterRotation = sourceBufferedImage.getWidth();
+                break;
+            default:
+                throw new JUploadException("Invalid quarter rotation: <"
+                        + this.quarterRotation + ">");
+        }
+        double scaleWidthBeforeRotation = widthBeforeRotation
+                / maxWidthBeforeRotation;
+        double scaleHeigthBeforeRotation = heigthBeforeRotation
+                / maxHeigthBeforeRotation;
+        double scale = Math.min(scaleWidthBeforeRotation,
+                scaleHeigthBeforeRotation);
+
+        // First: we scale the picture... if necessary.
+        @SuppressWarnings("unused")
+        Image scaledPicture = sourceBufferedImage;
+        if (scale < 1) {
+            int targetWidthBeforeRotation, targetHeigthBeforeRotation;
+            if (scaleWidthBeforeRotation < scaleHeigthBeforeRotation) {
+                // The constraint is on the width.
+                targetWidthBeforeRotation = maxWidthBeforeRotation;
+                targetHeigthBeforeRotation = (int) (heigthBeforeRotation * scale);
+            } else {
+                // The constraint is on the heigth
+                targetHeigthBeforeRotation = maxHeigthBeforeRotation;
+                targetWidthBeforeRotation = (int) (widthBeforeRotation * scale);
+            }
+            int scale_xxx = highquality ? Image.SCALE_SMOOTH : Image.SCALE_FAST;
+            scaledPicture = sourceBufferedImage.getScaledInstance(
+                    targetWidthBeforeRotation, targetHeigthBeforeRotation,
+                    scale_xxx);
+        }// if (scale < 1)
+
+        // Then, rotation of the scaled picture.
+        if (this.quarterRotation != 0) {
+            @SuppressWarnings("unused")
+            AffineTransform rotationTransform;
+            switch (this.quarterRotation) {
+                case 0:
+                case 2:
+                    maxWidthBeforeRotation = this.uploadPolicy.getMaxWidth();
+                    maxHeigthBeforeRotation = this.uploadPolicy.getMaxHeight();
+                    widthBeforeRotation = sourceBufferedImage.getWidth();
+                    heigthBeforeRotation = sourceBufferedImage.getHeight();
+                    widthAfterRotation = sourceBufferedImage.getWidth();
+                    heigthAfterRotation = sourceBufferedImage.getHeight();
+                    break;
+                case 1:
+                case 3:
+                    maxWidthBeforeRotation = this.uploadPolicy.getMaxHeight();
+                    maxHeigthBeforeRotation = this.uploadPolicy.getMaxWidth();
+                    widthBeforeRotation = sourceBufferedImage.getHeight();
+                    heigthBeforeRotation = sourceBufferedImage.getWidth();
+                    widthAfterRotation = sourceBufferedImage.getHeight();
+                    heigthAfterRotation = sourceBufferedImage.getWidth();
+                    break;
+                default:
+                    throw new JUploadException("Invalid quarter rotation: <"
+                            + this.quarterRotation + ">");
+            }
+            // TODO finish this new version
+            // dest = new BufferedImage(widthAfterRotation, heigthAfterRotation,
+            // BufferedImage.TYPE_BYTE_INDEXED,sourceBufferedImage.getColorModel())
+
+            // It's finished !
+            this.uploadPolicy.displayDebug("getBufferedImage: was "
+                    + (System.currentTimeMillis() - msGetBufferedImage)
+                    + " ms long", 50);
+        }
+        return dest;
+    }
+
+    /**
+     * Implementation of the ImageObserver interface. Used to follow the
+     * drawImage progression, and update the applet progress bar.
+     * 
+     * @param img
+     * @param infoflags
+     * @param x
+     * @param y
+     * @param width
+     * @param height
+     * @return Whether or not the work must go on.
+     * 
+     */
+    public boolean imageUpdate(Image img, int infoflags, int x, int y,
+            int width, int height) {
+        if ((infoflags & ImageObserver.WIDTH) == ImageObserver.WIDTH) {
+            this.progressBarBaseValue = this.uploadPolicy.getContext()
+                    .getUploadPanel().getPreparationProgressBar().getValue();
+            this.uploadPolicy.displayDebug(
+                    "  imageUpdate (start of), progressBar geValue: "
+                            + this.progressBarBaseValue, 50);
+            int max = this.uploadPolicy.getContext().getUploadPanel()
+                    .getPreparationProgressBar().getMaximum();
+            this.uploadPolicy
+                    .displayDebug(
+                            "  imageUpdate (start of), progressBar maximum: "
+                                    + max, 50);
+        } else if ((infoflags & ImageObserver.SOMEBITS) == ImageObserver.SOMEBITS) {
+            this.nbPixelsRead += width * height;
+            int percentage = (int) ((long) this.nbPixelsRead * 100 / this.nbPixelsTotal);
+            this.uploadPolicy.getContext().getUploadPanel()
+                    .getPreparationProgressBar().setValue(
+                            this.progressBarBaseValue + percentage);
+            // TODO: drawImage in another thread, to allow repaint of the
+            // progress bar ?
+            // Current status: the progress bar is only updated ... when
+            // draImage returns, that is: when everything is finished. NO
+            // interest.
+            this.uploadPolicy.getContext().getUploadPanel()
+                    .getPreparationProgressBar().repaint();
+        } else if ((infoflags & ImageObserver.ALLBITS) == ImageObserver.ALLBITS) {
+            this.uploadPolicy.displayDebug(
+                    "  imageUpdate, total number of pixels: "
+                            + this.nbPixelsRead + " read", 50);
+        }
+
+        // We want to go on, after these bits
+        return true;
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageReaderWriterHelper.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageReaderWriterHelper.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageReaderWriterHelper.java	(revision 3951)
@@ -0,0 +1,463 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2008 The JUpload Team
+//
+// Created: 12 feb. 08
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata.helper;
+
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.IOException;
+import java.util.Iterator;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.ImageWriteParam;
+import javax.imageio.ImageWriter;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.plugins.jpeg.JPEGImageWriteParam;
+import javax.imageio.stream.FileImageInputStream;
+import javax.imageio.stream.FileImageOutputStream;
+
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.DefaultFileData;
+import wjhk.jupload2.filedata.PictureFileData;
+import wjhk.jupload2.policies.PictureUploadPolicy;
+
+/**
+ * 
+ * This package provides low level methods, for picture management. It is used
+ * by {@link PictureFileData} to simplify its processing.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class ImageReaderWriterHelper {
+
+    /**
+     * File input, from which the original picture should be read.
+     */
+    FileImageInputStream fileImageInputStream = null;
+
+    /**
+     * File output stream for the current transformation.
+     */
+    FileImageOutputStream fileImageOutputStream;
+
+    /**
+     * The {@link PictureFileData} that this helper will have to help.
+     */
+    PictureFileData pictureFileData;
+
+    /**
+     * Current ImageReader. Initialized by {@link #initImageReader()}
+     */
+    ImageReader imageReader = null;
+
+    /**
+     * Current ImageWriter. Initialized by {@link #initImageWriter()}
+     */
+    ImageWriter imageWriter = null;
+
+    /**
+     * Current ImageWriter. Initialized by {@link #initImageWriter()}
+     */
+    ImageWriteParam imageWriterParam = null;
+
+    /**
+     * Contains the target picture format (in lowercase): gif, jpg... It is used
+     * to find an ImageWriter, and to define the target filename.
+     */
+    String targetPictureFormat;
+
+    /**
+     * The current upload policy must be a {@link PictureUploadPolicy}
+     */
+    PictureUploadPolicy uploadPolicy;
+
+    // ////////////////////////////////////////////////////////////////////
+    // //////////////////// CONSTRUCTOR
+    // ////////////////////////////////////////////////////////////////////
+
+    /**
+     * Standard constructor.
+     * 
+     * @param uploadPolicy The current upload policy.
+     * @param pictureFileData The file data to be 'helped'.
+     */
+    public ImageReaderWriterHelper(PictureUploadPolicy uploadPolicy,
+            PictureFileData pictureFileData) {
+        this.uploadPolicy = uploadPolicy;
+        this.pictureFileData = pictureFileData;
+
+        this.targetPictureFormat = uploadPolicy.getImageFileConversionInfo()
+                .getTargetFormat(pictureFileData.getFileExtension());
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // //////////////////// PUBLIC METHODS
+    // ////////////////////////////////////////////////////////////////////
+
+    /**
+     * returns the target picture format (lowercase, may be the same as the file
+     * extension)
+     * 
+     * @return the target picture format (lowercase, may be the same as the file
+     *         extension)
+     */
+    public String getTargetPictureFormat() {
+        return this.targetPictureFormat;
+    }
+
+    /**
+     * Creates a FileImageOutputStream, and assign it as the output to the
+     * imageWriter.
+     * 
+     * @param file The file where the output stream must write.
+     * @throws JUploadIOException Any error...
+     */
+    public void setOutput(File file) throws JUploadIOException {
+        // We first initialize internal variable.
+        initImageWriter();
+
+        try {
+            this.fileImageOutputStream = new FileImageOutputStream(file);
+        } catch (IOException e) {
+            throw new JUploadIOException("ImageReaderWriterHelper.setOutput()",
+                    e);
+        }
+        this.imageWriter.setOutput(this.fileImageOutputStream);
+    }
+
+    /**
+     * Free all reserved resource by this helper. Includes closing of any input
+     * or output stream.
+     * 
+     * @throws JUploadIOException Any IO Exception
+     */
+    public void dispose() throws JUploadIOException {
+        // First: let's free any resource used by ImageWriter.
+        if (this.imageWriter != null) {
+            // An imageWriter was initialized. Let's free it.
+            this.imageWriter.dispose();
+            if (this.fileImageOutputStream != null) {
+                try {
+                    this.fileImageOutputStream.close();
+                } catch (IOException e) {
+                    throw new JUploadIOException(
+                            "ImageReaderWriterHelper.dispose() [fileImageOutputStream]",
+                            e);
+                }
+            }
+            this.imageWriter = null;
+            this.fileImageOutputStream = null;
+        }
+
+        // Then, all about ImageReader
+        if (this.imageReader != null) {
+            // An imageReader was initialized. Let's free it.
+            this.imageReader.dispose();
+            try {
+                this.fileImageInputStream.close();
+            } catch (IOException e) {
+                throw new JUploadIOException(
+                        "ImageReaderWriterHelper.dispose() [fileImageInputStream]",
+                        e);
+            }
+            this.imageReader = null;
+            this.fileImageInputStream = null;
+        }
+    }
+
+    /**
+     * Call to imageReader.getNumImages(boolean). Caution: may be long, for big
+     * files.
+     * 
+     * @param allowSearch
+     * @return The number of image into this file.
+     * @throws JUploadIOException
+     */
+    public int getNumImages(boolean allowSearch) throws JUploadIOException {
+        initImageReader();
+        try {
+            return this.imageReader.getNumImages(allowSearch);
+        } catch (IOException e) {
+            throw new JUploadIOException(
+                    "ImageReaderWriterHelper.getNumImages() [fileImageInputStream]",
+                    e);
+        }
+    }
+
+    /**
+     * Call to ImageIO.read(fileImageInputStream).
+     * 
+     * @return The BufferedImage read
+     * @throws JUploadIOException
+     *
+    public BufferedImage imageIORead() throws JUploadIOException {
+        try {
+            return ImageIO.read(this.pictureFileData.getWorkingSourceFile());
+        } catch (IOException e) {
+            throw new JUploadIOException(
+                    "ImageReaderWriterHelper.ImageIORead()", e);
+        }
+
+    }
+    */
+
+    /**
+     * Read an image, from the pictureFileData.
+     * 
+     * @param imageIndex The index number of the picture, in the file. 0 for the
+     *            first picture (only valid value for picture containing one
+     *            picture)
+     * @return The image corresponding to this index, in the picture file.
+     * @throws JUploadIOException
+     * @throws IndexOutOfBoundsException Occurs when the imageIndex is wrong.
+     */
+    public BufferedImage readImage(int imageIndex) throws JUploadIOException,
+            IndexOutOfBoundsException {
+        initImageReader();
+        try {
+            this.uploadPolicy.displayDebug(
+                    "ImageReaderWriterHelper: reading picture number "
+                            + imageIndex + " of file "
+                            + this.pictureFileData.getFileName(), 30);
+            return this.imageReader.read(imageIndex);
+        } catch (IndexOutOfBoundsException e) {
+            // The IndexOutOfBoundsException is transmitted to the caller. It
+            // indicates that the index is out of bound. It's the good way for
+            // the caller to stop the loop through available pictures.
+            throw e;
+        } catch (IOException e) {
+            throw new JUploadIOException("ImageReaderWriterHelper.readImage("
+                    + imageIndex + ")", e);
+        }
+    }
+
+    /**
+     * Read an image, from the pictureFileData.
+     * 
+     * @param imageIndex The index number of the picture, in the file. 0 for the
+     *            first picture (only valid value for picture containing one
+     *            picture)
+     * @return The full image data for this index
+     * @throws JUploadIOException
+     * @throws IndexOutOfBoundsException Occurs when the imageIndex is wrong.
+     */
+    public IIOImage readAll(int imageIndex) throws JUploadIOException,
+            IndexOutOfBoundsException {
+        initImageReader();
+        try {
+            this.uploadPolicy.displayDebug(
+                    "ImageReaderWriterHelper: reading picture number "
+                            + imageIndex + " of file "
+                            + this.pictureFileData.getFileName(), 30);
+            return this.imageReader.readAll(imageIndex, this.imageReader
+                    .getDefaultReadParam());
+        } catch (IndexOutOfBoundsException e) {
+            // The IndexOutOfBoundsException is transmitted to the caller. It
+            // indicates that the index is out of bound. It's the good way for
+            // the caller to stop the loop through available pictures.
+            throw e;
+        } catch (IOException e) {
+            throw new JUploadIOException("ImageReaderWriterHelper.readAll("
+                    + imageIndex + ")", e);
+        }
+    }
+
+    /**
+     * Load the metadata associated with one picture in the picture file.
+     * 
+     * @param imageIndex
+     * @return The metadata loaded
+     * @throws JUploadIOException Any IOException is encapsulated in this
+     *             exception
+     */
+    public IIOMetadata getImageMetadata(int imageIndex)
+            throws JUploadIOException {
+        // We must have the reader initialized
+        initImageReader();
+
+        // Ok, let's go
+        try {
+            this.uploadPolicy.displayDebug(
+                    "ImageReaderWriterHelper: reading metadata for picture number "
+                            + imageIndex + " of file "
+                            + this.pictureFileData.getFileName(), 30);
+            return this.imageReader.getImageMetadata(imageIndex);
+        } catch (IOException e) {
+            throw new JUploadIOException(
+                    "ImageReaderWriterHelper.getImageMetadata()", e);
+        }
+    }
+
+    /**
+     * Write a picture in the output picture file. Called just before an upload.
+     * 
+     * @param numIndex The index of the image in the transformed picture file.
+     * @param iioImage The image to write.
+     * @param iwp The parameter to use to write this image.
+     * @throws JUploadIOException
+     */
+    public void writeInsert(int numIndex, IIOImage iioImage, ImageWriteParam iwp)
+            throws JUploadIOException {
+        initImageWriter();
+        try {
+            this.imageWriter.writeInsert(numIndex, iioImage, iwp);
+        } catch (IOException e) {
+            throw new JUploadIOException(
+                    "ImageReaderWriterHelper.writeInsert()", e);
+        }
+    }
+
+    /**
+     * Write a picture in the output picture file. Called just before an upload.
+     * 
+     * @param iioImage The image to write.
+     * @throws JUploadIOException
+     */
+    public void write(IIOImage iioImage) throws JUploadIOException {
+        initImageWriter();
+        try {
+            this.imageWriter.write(null, iioImage, this.imageWriterParam);
+        } catch (IOException e) {
+            throw new JUploadIOException("ImageReaderWriterHelper.write()", e);
+        }
+    }
+
+    // ////////////////////////////////////////////////////////////////////
+    // //////////////////// PRIVATE METHODS
+    // ////////////////////////////////////////////////////////////////////
+
+    /**
+     * Initialize the ImageWriter and the ImageWriteParam for the current
+     * picture helper.
+     * 
+     * @throws JUploadIOException
+     */
+    private void initImageWriter() throws JUploadIOException {
+        if (this.imageWriter == null) {
+            // Get the writer (to choose the compression quality)
+            // In the windows world, file extension may be in uppercase, which
+            // is not compatible with the core Java API.
+            Iterator<ImageWriter> iter = ImageIO
+                    .getImageWritersByFormatName(this.targetPictureFormat);
+            if (!iter.hasNext()) {
+                // Too bad: no writer for the selected picture format
+
+                // A particular case: no gif support in JRE 1.5. A JRE upgrade
+                // must be done.
+                if (this.targetPictureFormat.equals("gif")
+                        && System.getProperty("java.version").startsWith("1.5")) {
+                    throw new JUploadIOException(
+                            "gif pictures are not supported in Java 1.5. Please switch to JRE 1.6.");
+                }
+
+                throw new JUploadIOException("No writer for the '"
+                        + this.targetPictureFormat + "' picture format.");
+            } else {
+                this.imageWriter = iter.next();
+                this.imageWriterParam = this.imageWriter.getDefaultWriteParam();
+
+                // For jpeg pictures, we force the compression level.
+                if (this.targetPictureFormat.equalsIgnoreCase("jpg")
+                        || this.targetPictureFormat.equalsIgnoreCase("jpeg")) {
+                    this.imageWriterParam
+                            .setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
+                    // Let's select a good compromise between picture size
+                    // and quality.
+                    this.imageWriterParam
+                            .setCompressionQuality(this.uploadPolicy
+                                    .getPictureCompressionQuality());
+                    // In some case, we need to force the Huffman tables:
+                    ((JPEGImageWriteParam) this.imageWriterParam)
+                            .setOptimizeHuffmanTables(true);
+                }
+
+                //
+                try {
+                    this.uploadPolicy.displayDebug(
+                            "ImageWriter1 (used), CompressionQuality="
+                                    + this.imageWriterParam
+                                            .getCompressionQuality(), 50);
+                } catch (Exception e2) {
+                    // If we come here, compression is not supported for
+                    // this picture format, or parameters are not explicit
+                    // mode, or ... (etc). May trigger several different
+                    // errors. We just ignore them: this par of code is only
+                    // to write some debug info.
+                    this.uploadPolicy.displayWarn(e2.getClass().getName()
+                            + " in ImageReaderWriterHelper.java");
+                }
+            }
+        }
+    }// initImageWriter
+
+    /**
+     * Initialize the ImageReader for the current helper.
+     * 
+     * @throws JUploadIOException
+     */
+    private void initImageReader() throws JUploadIOException {
+        // First: we open a ImageInputStream
+        try {
+            this.fileImageInputStream = new FileImageInputStream(
+                    this.pictureFileData.getWorkingSourceFile());
+        } catch (IOException e) {
+            throw new JUploadIOException(
+                    "ImageReaderWriterHelper.initImageReader()", e);
+        }
+
+        // Then: we create an ImageReader, and assign the ImageInputStream to
+        // it.
+        if (this.imageReader == null) {
+            String ext = DefaultFileData.getExtension(this.pictureFileData
+                    .getFile());
+            Iterator<ImageReader> iterator = ImageIO
+                    .getImageReadersBySuffix(ext);
+            if (iterator.hasNext()) {
+                this.imageReader = iterator.next();
+                this.imageReader.setInput(this.fileImageInputStream);
+                this.uploadPolicy.displayDebug("Foud one reader for " + ext
+                        + " extension", 50);
+            }// while
+
+            // Did we find our reader ?
+            if (this.imageReader == null) {
+                this.uploadPolicy.displayErr("Found no reader for " + ext
+                        + " extension");
+            } else if (this.uploadPolicy.getDebugLevel() >= 50) {
+                // This call may be long, so we do it only if useful.
+                try {
+                    this.uploadPolicy.displayDebug("Nb images in "
+                            + this.pictureFileData.getFileName() + ": "
+                            + this.imageReader.getNumImages(true), 50);
+                } catch (IOException e) {
+                    // We mask the error, was just for debug...
+                }
+            }
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageFileConversionInfo.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageFileConversionInfo.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/helper/ImageFileConversionInfo.java	(revision 3951)
@@ -0,0 +1,187 @@
+package wjhk.jupload2.filedata.helper;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * this class is used to parse the
+ * {@link UploadPolicy#PROP_TARGET_PICTURE_FORMAT} parameter and provide easy
+ * access to the conversions
+ * <ul>
+ * <li>all file extensions are case-insensitive</li>
+ * <li>jpg and jpeg are distinct!</li>
+ * </ul>
+ * expected format example: {@code "png,bmp:jpg;gif:png;"}
+ * 
+ * @see UploadPolicy
+ */
+public class ImageFileConversionInfo {
+
+    private static final String FORMAT_SEPARATOR = ",";
+
+    private static final String RELATION_SEPARATOR = ";";
+
+    private static final String RELATION_ASSIGNMENT = ":";
+
+    /**
+     * will only contain strings in lower-case formats
+     * <ul>
+     * <li>key: source format</li>
+     * <li>value: target format</li>
+     * </ul>
+     */
+    private Map<String, String> formatRelations = new HashMap<String, String>();
+
+    /**
+     * will build a new ImageFileConversionInfo object for the given
+     * conversionList.
+     * 
+     * @param conversionList e.g. {@code "png,bmp:jpg;gif:png;"}, may be empty
+     *            or {@code null}
+     * @throws JUploadException if the conversionList is erroneous
+     */
+    public ImageFileConversionInfo(String conversionList)
+            throws JUploadException {
+        parseConversionList(conversionList);
+    }
+
+    /**
+     * returns the target format (in lowercase) for the given sourceFormat or
+     * {@code null} if no conversion is necessary (or if sourceFormat is {@code
+     * null})
+     * 
+     * @param sourceFormat format of the source file (case does not matter):
+     *            e.g. jpg, JpeG, png, ..
+     * @return the target format (in lowercase) for the given sourceFormat or
+     *         {@code null} if no conversion is necessary (or if sourceFormat is
+     *         {@code null})
+     */
+    public String getTargetFormatOrNull(String sourceFormat) {
+        if (sourceFormat == null) {
+            return null;
+        }
+        String mapValue = this.formatRelations.get(sourceFormat.toLowerCase());
+        return mapValue;
+    }
+
+    /**
+     * returns the target format for the given sourceFormat.
+     * <ul>
+     * <li>the case of the sourceFormat does not matter</li>
+     * <li>the returned format will always be lower-case</li>
+     * <li>if a conversion is necessary the target format will be returned: e.g.
+     * if "bmp" should be converted to a "png": "png" will be returned</li>
+     * <li>if no conversion is necessary, the sourceFormat (in lower-case) will
+     * be returned</li>
+     * <li>if sourceFormat is {@code null}, {@code null} will be returned</li>
+     * </ul>
+     * 
+     * @param sourceFormat format of the source file (case does not matter):
+     *            e.g. jpg, JpeG, png, ..
+     * @return the target format for the given sourceFormat (see details in the
+     *         method description)
+     */
+    public String getTargetFormat(String sourceFormat) {
+        if (sourceFormat == null) {
+            return null;
+        }
+        String targetFormatOrNull = getTargetFormatOrNull(sourceFormat);
+        if (targetFormatOrNull == null) {
+            return sourceFormat.toLowerCase();
+        }
+        return targetFormatOrNull;
+    }
+
+    /**
+     * will parse the conversion list and fill formatRelations with entries.<br />
+     * see description of {@link UploadPolicy} for expected format.
+     * 
+     * @param conversionList the conversion list to parse
+     * @throws JUploadException if problems parsing the conversionList occured
+     */
+    private void parseConversionList(String conversionList)
+            throws JUploadException {
+        if (conversionList == null || conversionList.equals("")) {
+            return;
+        }
+
+        /*
+         * example: conversionList="Png,bmp:JPG;gif:png"
+         */
+
+        /*
+         * if the conversion list does not end with the relation separator, we
+         * add it to keep the parsing logic simpler
+         */
+        if (!conversionList.endsWith(RELATION_SEPARATOR)) {
+            conversionList += RELATION_SEPARATOR;
+        }
+
+        /*
+         * example: conversionList="Png,bmp:JPG;gif:png;"
+         */
+
+        String[] relations = conversionList.split(RELATION_SEPARATOR);
+        for (String relation : relations) {
+            /*
+             * example: relation="Png,bmp:JPG"
+             */
+            String[] assignmentDetails = relation.split(RELATION_ASSIGNMENT);
+            if (assignmentDetails.length != 2) {
+                throw new JUploadException("Invalid format: relation '"
+                        + relation + "' should contain exatly one '"
+                        + RELATION_ASSIGNMENT + "'");
+            }
+            String sourceFormatList = assignmentDetails[0];
+            /*
+             * example: sourceFormatList="Png,bmp"
+             */
+            String targetFormat = assignmentDetails[1].toLowerCase();
+            /*
+             * example: targetFormat="jpg"
+             */
+            String[] sourceFormats = sourceFormatList.split(FORMAT_SEPARATOR);
+            for (String sourceFormat : sourceFormats) {
+                /*
+                 * example: sourceFormat="Png"
+                 */
+                String lcSourceFormat = sourceFormat.toLowerCase();
+                /*
+                 * example: lcSourceFormat="png"
+                 */
+                if (lcSourceFormat.equals(targetFormat)) {
+                    throw new JUploadException("format '" + sourceFormat
+                            + "' is assigned to itself");
+                }
+                String putResult = this.formatRelations.put(lcSourceFormat,
+                        targetFormat);
+                if (putResult != null) {
+                    throw new JUploadException("format '" + lcSourceFormat
+                            + "' is assigned to multiple target formats: '"
+                            + targetFormat + "', '" + putResult + "'");
+                }
+            }
+        }
+    }
+
+    /**
+     * @see java.lang.Object#toString()
+     */
+    @Override
+    public String toString() {
+        StringBuilder sb = new StringBuilder("ImageFileConversionInfo (");
+        for (Map.Entry<String, String> formatRelation : this.formatRelations
+                .entrySet()) {
+            sb.append(formatRelation.getKey());
+            sb.append("-->");
+            sb.append(formatRelation.getValue());
+            sb.append(";");
+        }
+        sb.append(")");
+
+        return sb.toString();
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/PictureFileData.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/PictureFileData.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/PictureFileData.java	(revision 3951)
@@ -0,0 +1,942 @@
+//
+// $Id: PictureFileData.java 287 2007-06-17 09:07:04 +0000 (dim., 17 juin 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-09
+// Creator: etienne_sf
+// Last modified: $Date: 2010-06-21 10:05:43 -0300 (Seg, 21 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata;
+
+import java.awt.Canvas;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Iterator;
+
+import javax.imageio.IIOImage;
+import javax.imageio.ImageIO;
+import javax.imageio.ImageReader;
+import javax.imageio.metadata.IIOMetadata;
+import javax.imageio.stream.FileImageInputStream;
+import javax.swing.ImageIcon;
+import javax.swing.JOptionPane;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.filedata.helper.ImageHelper;
+import wjhk.jupload2.filedata.helper.ImageReaderWriterHelper;
+import wjhk.jupload2.policies.PictureUploadPolicy;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class contains all data about files to upload as a picture. It adds the
+ * following elements to the {@link wjhk.jupload2.filedata.FileData} class :<BR>
+ * <UL>
+ * <LI>Ability to define a target format (to convert pictures to JPG before
+ * upload, for instance)
+ * <LI>Optional definition of a maximal width and/or height.
+ * <LI>Ability to rotate a picture, with {@link #addRotation(int)}
+ * <LI>Ability to store a picture into a BufferedImage. This is actualy a bad
+ * idea within an applet (should run within a java application) : the applet
+ * runs very quickly out of memory. With pictures from my Canon EOS20D (3,5M), I
+ * can only display two pictures. The third one generates an out of memory
+ * error, despite the System.finalize and System.gc I've put everywhere in the
+ * code!
+ * </UL>
+ * 
+ * @author etienne_sf
+ * @version $Revision: 1355 $
+ */
+public class PictureFileData extends DefaultFileData {
+
+	/**
+	 * Indicates if this file is a picture or not. This is bases on the return
+	 * of ImageIO.getImageReadersByFormatName().
+	 */
+	boolean isPicture = false;
+
+	/**
+	 * This picture is precalculated, and stored to avoid to calculate it each
+	 * time the user select this picture again, or each time the use switch from
+	 * an application to another.
+	 */
+	Image offscreenImage = null;
+
+	/**
+	 * quarterRotation contains the current rotation that will be applied to the
+	 * picture. Its value should be one of 0, 1, 2, 3. It is controled by the
+	 * {@link #addRotation(int)} method.
+	 * <UL>
+	 * <LI>0 means no rotation.
+	 * <LI>1 means a rotation of 90ï¿œ clockwise (word = Ok ??).
+	 * <LI>2 means a rotation of 180ï¿œ.
+	 * <LI>3 means a rotation of 900 counterclockwise (word = Ok ??).
+	 * </UL>
+	 */
+	int quarterRotation = 0;
+
+	/**
+	 * Width of the original picture. The width is taken from the first image of
+	 * the file. We expect that all pictures in a file are of the same size (for
+	 * instance, for animated gif). Calculated in the
+	 * {@link #PictureFileData(File, File, PictureUploadPolicy)} constructor.
+	 */
+	int originalWidth = -1;
+
+	/**
+	 * Same as {@link #originalWidth}, for the height of the first image in the
+	 * picture file.
+	 */
+	int originalHeight = -1;
+
+	/**
+	 * transformedPictureFile contains the reference to the temporary file that
+	 * stored the transformed picture, during upload. It is created by
+	 * {@link #getInputStream()} and freed by {@link #afterUpload()}.
+	 */
+	File transformedPictureFile = null;
+
+	/**
+	 * uploadLength contains the uploadLength, which is : <BR>
+	 * - The size of the original file, if no transformation is needed. <BR>
+	 * - The size of the transformed file, if a transformation were made. <BR>
+	 * <BR>
+	 * It is set to -1 whenever its calculation is to be done again (for
+	 * instance, when the user ask for a rotation, which is currently the only
+	 * action that need to recalculate the picture).
+	 */
+	long uploadLength = -1;
+
+	/**
+	 * Contains the reference to a copy of the original picture files.
+	 * Originally created because a SUN bug would prevent picture to be
+	 * correctly resized if the original picture filename contains accents (or
+	 * any non-ASCII characters).
+	 */
+
+	File workingCopyTempFile = null;
+
+	/**
+	 * will be set if in {@link #createTranformedPictureFile(ImageHelper)}, if
+	 * an image-transformation has occured
+	 */
+	String targetPictureFormat;
+
+	/**
+	 * Standard constructor: needs a PictureFileDataPolicy.
+	 * 
+	 * @param file
+	 *            The files which data are to be handled by this instance.
+	 * @param root
+	 *            The root directory, to calculate the relative dir (see
+	 *            {@link #getRelativeDir()}.
+	 * @param uploadPolicy
+	 *            The current upload policy
+	 * @throws JUploadIOException
+	 *             Encapsulation of the IOException, if any would occurs.
+	 */
+	public PictureFileData(File file, File root,
+			PictureUploadPolicy uploadPolicy) throws JUploadIOException {
+		super(file, root, uploadPolicy);
+
+		String fileExtension = getFileExtension();
+
+		// Is it a picture?
+		this.uploadPolicy.displayDebug("Looking for iterator of extension '"
+				+ file + "'", 80);
+		this.isPicture = isFileAPicture(file);
+
+		// Let's log the test result
+		this.uploadPolicy.displayDebug("isPicture=" + this.isPicture + " ("
+				+ file.getName() + "), extension=" + fileExtension, 50);
+
+		// If it's a picture, we override the default mime type:
+		if (this.isPicture) {
+			setMimeTypeByExtension(fileExtension);
+		}
+	}
+
+	/**
+	 * Free any available memory. This method is called very often here, to be
+	 * sure that we don't use too much memory. But we still run out of memory in
+	 * some case.
+	 * 
+	 * @param caller
+	 *            Indicate the method or treatment from which this method is
+	 *            called.
+	 * @param uploadPolicy
+	 *            The current upload policy is not available, to this static
+	 *            method...
+	 */
+	public static void freeMemory(String caller, UploadPolicy uploadPolicy) {
+		Runtime rt = Runtime.getRuntime();
+
+		rt.runFinalization();
+		rt.gc();
+
+		if (uploadPolicy.getDebugLevel() >= 50) {
+			uploadPolicy.displayDebug("freeMemory (after " + caller + ") : "
+					+ rt.freeMemory() + " (maxMemory: " + rt.maxMemory()
+					+ ", totalMemory: " + rt.totalMemory() + ")", 50);
+		}
+	}
+
+	/**
+	 * If this pictures needs transformation, a temporary file is created. This
+	 * can occurs if the original picture is bigger than the maxWidth or
+	 * maxHeight, of if it has to be rotated. This temporary file contains the
+	 * transformed picture. <BR>
+	 * The call to this method is optional, if the caller calls
+	 * {@link #getUploadLength()}. This method calls beforeUpload() if the
+	 * uploadLength is unknown.
+	 */
+	@Override
+	public void beforeUpload() throws JUploadException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.beforeUpload()", 95);
+
+		if (!this.preparedForUpload) {
+			if (this.uploadLength < 0) {
+				try {
+					// Picture management is a big work. Let's try to free some
+					// memory.
+					freeMemory(
+							"Picture manabeforeUpload(): before initTransformedPictureFile",
+							this.uploadPolicy);
+
+					// Get the transformed picture file, if needed.
+					initTransformedPictureFile();
+
+					// More debug output, to understand where the applet
+					// freezes.
+					this.uploadPolicy
+							.displayDebug(
+									this.getClass().getName()
+											+ ".beforeUpload(): after call to initTransformedPictureFile()",
+									100);
+
+				} catch (OutOfMemoryError e) {
+					// Oups ! My EOS 20D has too big pictures to handle more
+					// than
+					// two pictures in a navigator applet !!!!!
+					// :-(
+					//
+					// We don't transform it. We clean the file, if it has been
+					// created.
+					// More debug output, to understand where the applet
+					// freezes.
+					this.uploadPolicy.displayDebug(this.getClass().getName()
+							+ ".beforeUpload(): OutOfMemoryError", 30);
+					deleteTransformedPictureFile();
+					deleteWorkingCopyPictureFile();
+
+					// Let's try to free some memory.
+					freeMemory("beforeUpload(): in OutOfMemoryError",
+							this.uploadPolicy);
+
+					tooBigPicture();
+				}
+
+				// If the transformed picture is correctly created, we'll upload
+				// it.
+				// Else we upload the original file.
+				synchronized (this) {
+					if (this.transformedPictureFile != null) {
+						this.uploadLength = this.transformedPictureFile
+								.length();
+						setMimeTypeByExtension(this.targetPictureFormat);
+					} else {
+						this.uploadLength = getFile().length();
+					}
+				}
+			}
+		}
+
+		// Let's check that everything is Ok
+		// More debug output, to understand where the applet freezes.
+		this.uploadPolicy.displayDebug(this.getClass().getName()
+				+ ".beforeUpload(): before call to super.beforeUpload()", 100);
+
+		super.beforeUpload();
+
+		// Let's check that everything is Ok
+		// More debug output, to understand where the applet freezes.
+		this.uploadPolicy.displayDebug(this.getClass().getName()
+				+ ".beforeUpload(): after call to super.beforeUpload()", 100);
+	}
+
+	/**
+	 * Returns the number of bytes, for this upload. If needed, that is, if
+	 * uploadlength is unknown, {@link #beforeUpload()} is called.
+	 * 
+	 * @return The length of upload. In this class, this is ... the size of the
+	 *         original file, or the transformed file!
+	 */
+	@Override
+	public long getUploadLength() {
+		// Just for debug, to be removed before release.
+
+		if (!this.preparedForUpload) {
+			throw new IllegalStateException("The file " + getFileName()
+					+ " is not prepared for upload");
+		}
+		return this.uploadLength;
+	}
+
+	/**
+	 * This function create an input stream for this file. The caller is
+	 * responsible for closing this input stream. <BR>
+	 * This function assumes that the {@link #getUploadLength()} method has
+	 * already be called : it is responsible for creating the temporary file (if
+	 * needed). If not called, the original file will be sent.
+	 * 
+	 * @return An inputStream
+	 */
+	@Override
+	public synchronized InputStream getInputStream() throws JUploadException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.getInputStream()", 95);
+		if (!this.preparedForUpload) {
+			throw new IllegalStateException("The file " + getFileName()
+					+ " is not prepared for upload");
+		}
+		// Do we have to transform the picture ?
+		if (this.transformedPictureFile != null) {
+			try {
+				return new FileInputStream(this.transformedPictureFile);
+			} catch (FileNotFoundException e) {
+				throw new JUploadIOException(e);
+			}
+		}
+		// Otherwise : we read the file, in the standard way.
+		return super.getInputStream();
+	}
+
+	/**
+	 * Cleaning of the temporary file on the hard drive, if any. <BR>
+	 * <B>Note:</B> if the debugLevel is 100 (or more) this temporary file is
+	 * not removed. This allow control of this created file.
+	 */
+	@Override
+	public void afterUpload() {
+		// Free the temporary file ... if any.
+		deleteTransformedPictureFile();
+		deleteWorkingCopyPictureFile();
+		this.uploadLength = -1;
+
+		super.afterUpload();
+	}
+
+	/**
+	 * This method creates a new Image, from the current picture. The resulting
+	 * width and height will be less or equal than the given maximum width and
+	 * height. The scale is maintained. Thus the width or height may be inferior
+	 * than the given values.
+	 * 
+	 * @param canvas
+	 *            The canvas on which the picture will be displayed.
+	 * @param shadow
+	 *            True if the pictureFileData should store this picture. False
+	 *            if the pictureFileData instance should not store this picture.
+	 *            Store this picture avoid calculating the image each time the
+	 *            user selects it in the file panel.
+	 * @return The rescaled image.
+	 * @throws JUploadException
+	 *             Encapsulation of the Exception, if any would occurs.
+	 */
+	public Image getImage(Canvas canvas, boolean shadow)
+			throws JUploadException {
+		Image localImage = null;
+
+		// ////////////////////////////////////////////////////////////////////////
+		// ////////////// Some preliminary tests.
+		// ////////////////////////////////////////////////////////////////////////
+
+		if (canvas == null) {
+			throw new JUploadException(
+					"canvas null in PictureFileData.getImage");
+		}
+
+		if (shadow && this.offscreenImage != null) {
+			return this.offscreenImage;
+		}
+
+		int canvasWidth = canvas.getWidth();
+		int canvasHeight = canvas.getHeight();
+		if (canvasWidth <= 0 || canvasHeight <= 0) {
+			this.uploadPolicy
+					.displayDebug(
+							"canvas width and/or height null in PictureFileData.getImage()",
+							1);
+			return null;
+		}
+
+		if (!this.isPicture) {
+			this.uploadPolicy
+					.displayWarn("canvas width and/or height null in PictureFileData.getImage(). PictureFileData.getImage will return null");
+			return null;
+		}
+		// ////////////////////////////////////////////////////////////////////////
+		// ////////////// End of preliminary tests: let's work.
+		// ////////////////////////////////////////////////////////////////////////
+
+		try {
+			// First: load the picture.
+			ImageReaderWriterHelper irwh = new ImageReaderWriterHelper(
+					(PictureUploadPolicy) this.uploadPolicy, this);
+			BufferedImage sourceImage = irwh.readImage(0);
+			irwh.dispose();
+			irwh = null;
+			ImageHelper ih = new ImageHelper(
+					(PictureUploadPolicy) this.uploadPolicy, this, canvasWidth,
+					canvasHeight, this.quarterRotation);
+			localImage = ih.getBufferedImage(
+					((PictureUploadPolicy) this.uploadPolicy)
+							.getHighQualityPreview(), sourceImage);
+			// We free memory ASAP.
+			sourceImage.flush();
+			sourceImage = null;
+		} catch (OutOfMemoryError e) {
+			// Too bad
+			localImage = null;
+			tooBigPicture();
+		}
+
+		// We store it, if asked to.
+		if (shadow) {
+			this.offscreenImage = localImage;
+		}
+
+		freeMemory("end of " + this.getClass().getName() + ".getImage()",
+				this.uploadPolicy);
+
+		// The picture is now loaded. We clear the progressBar
+		this.uploadPolicy.getContext().getUploadPanel()
+				.getPreparationProgressBar().setValue(0);
+
+		return localImage;
+	}// getImage
+
+	/**
+	 * This function is used to rotate the picture. The current rotation state
+	 * is kept in the quarterRotation private attribute.
+	 * 
+	 * @param quarter
+	 *            Number of quarters (90 degrees) the picture should rotate. 1
+	 *            means rotating of 90 degrees clockwise. Can be negative.
+	 */
+	public void addRotation(int quarter) {
+		this.quarterRotation += quarter;
+
+		// We'll have to recalculate the upload length, as the resulting file is
+		// different.
+		// If any file has been prepared, they must be deleted
+		deleteWorkingCopyPictureFile();
+		deleteTransformedPictureFile();
+		this.uploadLength = -1;
+
+		// We keep the 'quarter' in the segment [0;4[
+		while (this.quarterRotation < 0) {
+			this.quarterRotation += 4;
+		}
+		while (this.quarterRotation >= 4) {
+			this.quarterRotation -= 4;
+		}
+
+		// We need to change the precalculated picture, if any
+		if (this.offscreenImage != null) {
+			this.offscreenImage.flush();
+			this.offscreenImage = null;
+		}
+	}
+
+	/**
+	 * Indicates if this file is actually a picture or not.
+	 * 
+	 * @return the isPicture flag.
+	 */
+	public boolean isPicture() {
+		return this.isPicture;
+	}
+
+	/** @see FileData#getMimeType() */
+	@Override
+	public String getMimeType() {
+		return this.mimeType;
+	}
+
+	// ///////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////////// private METHODS
+	// ///////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * File.deleteOnExit() is pretty unreliable, especially in applets.
+	 * Therefore the applet provides a callback which is executed during applet
+	 * termination. This method performs the actual cleanup.
+	 */
+	public synchronized void deleteTransformedPictureFile() {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.deleteTransformedPictureFile()",
+				95);
+		// Free the temporary file ... if any.
+		if (null != this.transformedPictureFile
+				&& this.uploadPolicy.getDebugLevel() <= 100) {
+			if (!this.transformedPictureFile.delete()) {
+				this.uploadPolicy.displayWarn("Unable to delete "
+						+ this.transformedPictureFile.getName());
+			}
+			this.transformedPictureFile = null;
+
+		}
+	}
+
+	/**
+	 * Creation of a temporary file, that contains the transformed picture. For
+	 * instance, it can be resized or rotated. This method doesn't throw
+	 * exception when there is an IOException within its procedure. If an
+	 * exception occurs while building the temporary file, the exception is
+	 * caught, a warning is displayed, the temporary file is deleted (if it was
+	 * created), and the upload will go on with the original file. <BR>
+	 * Note: any JUploadException thrown by a method called within
+	 * getTransformedPictureFile() will be thrown within this method.
+	 */
+	void initTransformedPictureFile() throws JUploadException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.initTransformedPictureFile()", 95);
+		int targetMaxWidth;
+		int targetMaxHeight;
+
+		// If the image is rotated, we compare to realMaxWidth and
+		// realMaxHeight, instead of maxWidth and maxHeight. This allows
+		// to have a different picture size for rotated and not rotated
+		// pictures. See the UploadPolicy javadoc for details ... and a
+		// good reason ! ;-)
+		if (this.quarterRotation == 0) {
+			targetMaxWidth = ((PictureUploadPolicy) this.uploadPolicy)
+					.getMaxWidth();
+			targetMaxHeight = ((PictureUploadPolicy) this.uploadPolicy)
+					.getMaxHeight();
+		} else {
+			targetMaxWidth = ((PictureUploadPolicy) this.uploadPolicy)
+					.getRealMaxWidth();
+			targetMaxHeight = ((PictureUploadPolicy) this.uploadPolicy)
+					.getRealMaxHeight();
+		}
+
+		// Some Helper will .. help us !
+		// I like useful comment :-)
+		ImageHelper imageHelper = new ImageHelper(
+				(PictureUploadPolicy) this.uploadPolicy, this, targetMaxWidth,
+				targetMaxHeight, this.quarterRotation);
+
+		// Should transform the file, and do we already created the transformed
+		// file ?
+		synchronized (this) {
+			if (imageHelper.hasToTransformPicture()
+					&& this.transformedPictureFile == null) {
+
+				// We have to create a resized or rotated picture file, and all
+				// needed information.
+				// ...let's do it
+				try {
+					createTranformedPictureFile(imageHelper);
+				} catch (JUploadException e) {
+					// Hum, too bad.
+					// if any file was created, we remove it.
+					deleteTransformedPictureFile();
+					throw e;
+				}
+			}
+		}
+	}// end of initTransformedPictureFile
+
+	/**
+	 * Creates a transformed picture file of the given max width and max height.
+	 * If the {@link #transformedPictureFile} attribute is not set before
+	 * calling this method, it will be set. If set before, the existing
+	 * {@link #transformedPictureFile} is replaced by the newly transformed
+	 * picture file. It is cleared if an error occured. <BR>
+	 * 
+	 * @param imageHelper
+	 *            The {@link ImageHelper} that was initialized with current
+	 *            parameters.
+	 */
+	synchronized void createTranformedPictureFile(ImageHelper imageHelper)
+			throws JUploadException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.createTransformedPictureFile()",
+				95);
+
+		IIOMetadata metadata = null;
+		IIOImage iioImage = null;
+		BufferedImage originalImage = null;
+		BufferedImage transformedImage = null;
+		ImageReaderWriterHelper imageWriterHelper = new ImageReaderWriterHelper(
+				(PictureUploadPolicy) this.uploadPolicy, this);
+		boolean transmitMetadata = ((PictureUploadPolicy) this.uploadPolicy)
+				.getPictureTransmitMetadata();
+
+		// Creation of the transformed picture file.
+		createTransformedTempFile();
+		this.targetPictureFormat = imageWriterHelper.getTargetPictureFormat();
+		imageWriterHelper.setOutput(this.transformedPictureFile);
+
+		// How many picture should we read from the input file.
+		// Default number of pictures is one.
+		int nbPictures = 1;
+		// For gif file, we put a max to MAX_VALUE, and we check the
+		// IndexOutOfBoundsException to identify when we've read all pictures
+		if (getExtension(getFile()).equalsIgnoreCase("gif")) {
+			nbPictures = Integer.MAX_VALUE;
+		}
+		this.uploadPolicy.displayDebug(
+				"Reading image with imageWriterHelper.readImage(i)", 50);
+		// Now, we have to read each picture from the original file, apply
+		// the calculated transformation, and write each transformed picture
+		// to the writer.
+		// As indicated in javadoc for ImageReader.getNumImages(), we go
+		// through pictures, until we get an IndexOutOfBoundsException.
+		try {
+			for (int i = 0; i < nbPictures; i += 1) {
+				originalImage = imageWriterHelper.readImage(i);
+				transformedImage = imageHelper.getBufferedImage(true,
+						originalImage);
+
+				// If necessary, we load the metadata for the current
+				// picture
+				if (transmitMetadata) {
+					metadata = imageWriterHelper.getImageMetadata(i);
+				}
+
+				iioImage = new IIOImage(transformedImage, null, metadata);
+				imageWriterHelper.write(iioImage);
+
+				// Let's clear picture, to force getBufferedImage to read a new
+				// one,
+				// in the next loop.
+				if (originalImage != null) {
+					originalImage.flush();
+					originalImage = null;
+				}
+			}// for
+		} catch (IndexOutOfBoundsException e) {
+			// Was sent by imageWriterHelper.readImage(i)
+			// Ok, no more picture to read. We just want to go out of
+			// the loop. No error.
+			this.uploadPolicy.displayDebug(
+					"IndexOutOfBoundsException catched: end of reading for file "
+							+ getFileName(), 10);
+		}
+
+		if (originalImage != null) {
+			originalImage.flush();
+			originalImage = null;
+		}
+
+		// Let's free any used resource.
+		imageWriterHelper.dispose();
+
+	}
+
+	/**
+	 * This method is called when an OutOfMemoryError occurs. This can easily
+	 * happen within the navigator, with big pictures: I've put a lot of
+	 * freeMemory calls within the code, but they don't seem to work very well.
+	 * When running from eclipse, the memory is freed Ok !
+	 */
+	void tooBigPicture() {
+		String msg = this.uploadPolicy.getLocalizedString("tooBigPicture",
+				getFileName());
+		this.uploadPolicy.displayWarn(msg);
+		JOptionPane.showMessageDialog(null, msg, "Warning",
+				JOptionPane.WARNING_MESSAGE);
+	}
+
+	/**
+	 * This methods set the {@link DefaultFileData#mimeType} to the image mime
+	 * type, that should be associate with the picture.
+	 */
+	void setMimeTypeByExtension(String fileExtension) {
+		String ext = fileExtension.toLowerCase();
+		if (ext.equals("jpg")) {
+			ext = "jpeg";
+		}
+		this.mimeType = "image/" + ext;
+	}
+
+	/**
+	 * If {@link #transformedPictureFile} is null, create a new temporary file,
+	 * and assign it to {@link #transformedPictureFile}. Otherwise, no action.
+	 * 
+	 * @throws IOException
+	 */
+	synchronized void createTransformedTempFile() throws JUploadIOException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.createTransformedTempFile()", 95);
+
+		if (this.transformedPictureFile == null) {
+			try {
+				this.transformedPictureFile = File.createTempFile("jupload_",
+						".tmp");
+			} catch (IOException e) {
+				throw new JUploadIOException(
+						"PictureFileData.createTransformedTempFile()", e);
+			}
+			this.uploadPolicy.getContext().registerUnload(this,
+					"deleteTransformedPictureFile");
+			this.uploadPolicy.displayDebug("Using transformed temp file "
+					+ this.transformedPictureFile.getAbsolutePath() + " for "
+					+ getFileName(), 30);
+		}
+	}
+
+	/**
+	 * This method loads the picture width and height of the picture. It's
+	 * called by the current instance when necessary.
+	 * 
+	 * @throws JUploadIOException
+	 * @see #getOriginalHeight()
+	 * @see #getOriginalWidth()
+	 */
+	void initWidthAndHeight() throws JUploadIOException {
+		// Is it a picture?
+		if (this.isPicture
+				&& (this.originalHeight < 0 || this.originalWidth < 0)) {
+			// Ok: it's a picture and is original width and height have not been
+			// loaded yet.
+			// In the windows world, file extension may be in upper case, which
+			// is not compatible with the core Java API.
+			Iterator<ImageReader> iter = ImageIO
+					.getImageReadersByFormatName(getFileExtension()
+							.toLowerCase());
+			if (iter.hasNext()) {
+				// It's a picture: we store its original width and height, for
+				// further calculation (rescaling and rotation).
+				try {
+					FileImageInputStream fiis = new FileImageInputStream(
+							getFile());
+					ImageReader ir = iter.next();
+					ir.setInput(fiis);
+					this.originalHeight = ir.getHeight(0);
+					this.originalWidth = ir.getWidth(0);
+					ir.dispose();
+					fiis.close();
+				} catch (IOException e) {
+					throw new JUploadIOException("PictureFileData()", e);
+				}
+			}
+		}
+	}
+
+	/**
+	 * If {@link #workingCopyTempFile} is null, create a new temporary file, and
+	 * assign it to {@link #transformedPictureFile}. Otherwise, no action.
+	 * 
+	 * @throws IOException
+	 */
+	synchronized void createWorkingCopyTempFile() throws IOException {
+		this.uploadPolicy.displayDebug(this.hashCode()
+				+ "|Entering PictureFileData.createWorkingCopyTempFile()", 95);
+		if (this.workingCopyTempFile == null) {
+			// The temporary file must have the correct extension, so that
+			// native Java method works on it.
+			this.workingCopyTempFile = File.createTempFile("jupload_", ".tmp."
+					+ DefaultFileData.getExtension(getFile()));
+			this.uploadPolicy.getContext().registerUnload(this,
+					"deleteWorkingCopyPictureFile");
+			this.uploadPolicy.displayDebug("Using working copy temp file "
+					+ this.workingCopyTempFile.getAbsolutePath() + " for "
+					+ getFileName(), 30);
+		}
+	}
+
+	/**
+	 * File.deleteOnExit() is pretty unreliable, especially in applets.
+	 * Therefore the applet provides a callback which is executed during applet
+	 * termination. This method performs the actual cleanup.
+	 */
+	public synchronized void deleteWorkingCopyPictureFile() {
+		// for debug : if the debugLevel is enough, we keep the temporary
+		// file (for check).
+		if (null != this.workingCopyTempFile
+				&& this.uploadPolicy.getDebugLevel() <= 100) {
+			if (!this.workingCopyTempFile.delete()) {
+				this.uploadPolicy.displayWarn("Unable to delete "
+						+ this.workingCopyTempFile.getName());
+			}
+			this.workingCopyTempFile = null;
+
+		}
+	}
+
+	/**
+	 * Get the file that contains the original picture. This is used as a
+	 * workaround for the following JVM bug: once in the navigator, it can't
+	 * transform picture read from a file whose name contains non-ASCII
+	 * characters, like French accents.
+	 * 
+	 * @return The file that contains the original picture, as the source for
+	 *         picture transformation
+	 * @throws JUploadIOException
+	 */
+	public synchronized File getWorkingSourceFile() throws JUploadIOException {
+
+		if (this.workingCopyTempFile == null) {
+			this.uploadPolicy.displayDebug(
+					"[getWorkingSourceFile] Creating a copy of "
+							+ getFileName() + " as a source working target.",
+					30);
+			FileInputStream is = null;
+			FileOutputStream os = null;
+			try {
+				createWorkingCopyTempFile();
+
+				is = new FileInputStream(getFile());
+				os = new FileOutputStream(this.workingCopyTempFile);
+				byte b[] = new byte[1024];
+				int l;
+				while ((l = is.read(b)) > 0) {
+					os.write(b, 0, l);
+				}
+			} catch (IOException e) {
+				throw new JUploadIOException(
+						"ImageReaderWriterHelper.getWorkingSourceFile()", e);
+			} finally {
+				if (is != null) {
+					try {
+						is.close();
+					} catch (IOException e) {
+						this.uploadPolicy
+								.displayWarn(e.getClass().getName()
+										+ " while trying to close FileInputStream, in PictureUploadPolicy.copyOriginalToWorkingCopyTempFile.");
+					} finally {
+						is = null;
+					}
+				}
+				if (os != null) {
+					try {
+						os.close();
+					} catch (IOException e) {
+						this.uploadPolicy
+								.displayWarn(e.getClass().getName()
+										+ " while trying to close FileOutputStream, in PictureUploadPolicy.copyOriginalToWorkingCopyTempFile.");
+					} finally {
+						os = null;
+					}
+				}
+			}
+		}
+		return this.workingCopyTempFile;
+	}// getWorkingSourceFile()
+
+	/**
+	 * @return the originalWidth of the picture
+	 * @throws JUploadIOException
+	 */
+	public int getOriginalWidth() throws JUploadIOException {
+		initWidthAndHeight();
+		return this.originalWidth;
+	}
+
+	/**
+	 * @return the originalHeight of the picture
+	 * @throws JUploadIOException
+	 */
+	public int getOriginalHeight() throws JUploadIOException {
+		initWidthAndHeight();
+		return this.originalHeight;
+	}
+
+	// ////////////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// static methods
+	// ////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Returns an ImageIcon for the given file, resized according to the given
+	 * dimensions. If the original file contains a pictures smaller than these
+	 * width and height, the picture is returned as is (nor resized).
+	 * 
+	 * @param pictureFile
+	 *            The file, containing a picture, from which the user wants to
+	 *            extract a static picture.
+	 * @param maxWidth
+	 *            The maximum allowed width for the static picture to generate.
+	 * @param maxHeight
+	 *            The maximum allowed height for the static picture to generate.
+	 * @return The created static picture, or null if the file is null.
+	 * @throws JUploadException
+	 *             If the ImageIcon can not be loaded.
+	 */
+	public static ImageIcon getImageIcon(File pictureFile, int maxWidth,
+			int maxHeight) throws JUploadException {
+		ImageIcon thumbnail = null;
+
+		if (pictureFile != null) {
+			ImageIcon tmpIcon;
+			try {
+				tmpIcon = new ImageIcon(ImageIO.read(pictureFile));
+			} catch (IOException e) {
+				throw new JUploadIOException(
+						"An error occured while loading the image icon for "
+								+ pictureFile.getAbsolutePath(), e);
+			}
+			if (tmpIcon != null) {
+				// Let's calculate the asked icon.
+				double scaleWidth = ((double) maxWidth)
+						/ tmpIcon.getIconWidth();
+				double scaleHeight = ((double) maxHeight)
+						/ tmpIcon.getIconHeight();
+				double scale = Math.min(scaleWidth, scaleHeight);
+
+				if (scale < 1) {
+					thumbnail = new ImageIcon(tmpIcon.getImage()
+							.getScaledInstance(
+									(int) (scale * tmpIcon.getIconWidth()),
+									(int) (scale * tmpIcon.getIconHeight()),
+									Image.SCALE_FAST));
+				} else { // no need to miniaturize
+					thumbnail = tmpIcon;
+				}
+			}
+		}
+		return thumbnail;
+	}
+
+	/**
+	 * Indicates whether a file is a picture or not. The information is based on
+	 * the fact the an ImageRead is found, or not, for this file. This test uses
+	 * the core Java API. As in the windows world, file extension may be in
+	 * uppercase, the test is based on the lowercase value for the given file
+	 * extension.
+	 * 
+	 * @param file
+	 * @return true if the file can be opened as a picture, false otherwise.
+	 */
+	public static boolean isFileAPicture(File file) {
+		// In the windows world, file extension may be in uppercase, which is
+		// not compatible with the core Java API.
+		Iterator<ImageReader> iter = ImageIO
+				.getImageReadersByFormatName(DefaultFileData.getExtension(file)
+						.toLowerCase());
+		return iter.hasNext();
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/FileData.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/FileData.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/FileData.java	(revision 3951)
@@ -0,0 +1,211 @@
+//
+// $Id: FileData.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-11-20
+// Creator: etienne_sf
+// Last modified: $Date: 2010-06-28 08:35:55 -0300 (Seg, 28 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata;
+
+import java.io.File;
+import java.io.InputStream;
+import java.util.Date;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.FileUploadThread;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+
+/**
+ * This class contains all data and methods for a file to upload. The current
+ * {@link wjhk.jupload2.policies.UploadPolicy} contains the necessary parameters
+ * to personalize the way files must be handled. <BR>
+ * The JUpload package provides a default implementation of this class in
+ * {@link DefaultFileData}. This default implementation contains all necessary
+ * methods to allow upload. You can override it to add new file behaviour. For
+ * instance, you could add a XMLFileData, that would check that XML is valid
+ * before upload. See the <a href="package-summary.html">package summary</a> for
+ * more details about that. <BR>
+ * This class is the interface that all FileData must implement. The
+ * {@link DefaultFileData} class contains the default implementation for this
+ * interface. The {@link PictureFileData} contains another implementation of
+ * this interface, adapted to manage pictures (rotation, resizing...). <BR>
+ * The instance of FileData is created by the
+ * {@link UploadPolicy#createFileData(File, File)} method. This method can be
+ * overrided in a new upoad policy, to create an instance of another FileData.
+ * See {@link PictureFileData} for an example about FileData customization.
+ * 
+ * @author etienne_sf
+ */
+
+public interface FileData {
+
+	/**
+	 * Called during the upload, by the {@link FileUploadThread}. The FileData
+	 * instance should then call the
+	 * {@link ByteArrayEncoder#appendTextProperty(String, String, int)} method
+	 * to add each file property to the current upload.
+	 * 
+	 * @param bae
+	 *            The byte encoder, where the properties must be added
+	 * @param index
+	 *            Index of the file concerned by this value. -1 if this is a
+	 *            global parameter.
+	 * @throws JUploadIOException
+	 *             Encapsulation of the IOException, if any would occurs.
+	 * @see ByteArrayEncoder#appendTextProperty(String, String, int)
+	 */
+	public void appendFileProperties(ByteArrayEncoder bae, int index)
+			throws JUploadIOException;
+
+	/**
+	 * Prepare the fileData to upload. For instance, picture data can be resized
+	 * before upload (see {@link PictureFileData}. This method is called before
+	 * the upload of this file. If no exception is thrown, then the file is
+	 * correctly prepared.
+	 * 
+	 * @see FileUploadThread
+	 * @throws JUploadException
+	 *             Encapsulation of the Exception, if any error would occurs.
+	 */
+	public void beforeUpload() throws JUploadException;
+
+	/**
+	 * Get size of upload, which may be different from the actual file length.
+	 * This call is valid only after a call to {@link #beforeUpload()} and
+	 * before the call to {@link #afterUpload()}.
+	 * 
+	 * @return The length of upload. In this class, this is the size of the
+	 *         file, as it isn't transformed for upload. This size may change if
+	 *         encoding is necessary (needs a new FileData class), or if picture
+	 *         is to be resized or rotated.
+	 * @see PictureFileData
+	 */
+	public long getUploadLength();
+
+	/**
+	 * This function is called after upload, whether it is successful or not. It
+	 * allows fileData to free any resource created for the upload. For
+	 * instance, {@link PictureFileData#afterUpload()} removes the temporary
+	 * file, if any was created.
+	 */
+	public void afterUpload();
+
+	/**
+	 * This function creates an InputStream from this file. The
+	 * {@link FileUploadThread} class then reads bytes from it and transfers
+	 * them to the webserver. The caller is responsible for closing this stream.<BR>
+	 * This method may only be called when {@link #isPreparedForUpload()}
+	 * returns true.
+	 * 
+	 * @throws JUploadException
+	 *             Encapsulation of the Exception, if any would occurs.
+	 * @throws IllegalStateException
+	 *             When the upload is not prepared (before a call to
+	 *             {@link #beforeUpload()} or after a call to
+	 *             {@link #afterUpload()}
+	 * @return An InputStream, representing this instance.
+	 */
+	public InputStream getInputStream() throws JUploadException;
+
+	/**
+	 * Get the original filename. This is the name of the file, into the local
+	 * hardrive
+	 * 
+	 * @return The original filename
+	 */
+	public String getFileName();
+
+	/**
+	 * @return The extension for the original file.
+	 */
+	public String getFileExtension();
+
+	/**
+	 * @return The length of the original file.
+	 */
+	public long getFileLength();
+
+	/**
+	 * @return The original file date.
+	 */
+	public Date getLastModified();
+
+	/**
+	 * Get the directory of the file.
+	 * 
+	 * @return The directory where this file is stored.
+	 */
+	public String getDirectory();
+
+	/**
+	 * Retrieves the MD5 sum of the file.<BR>
+	 * Since 5.0.0, this method is is in DefaultFileData, and is calculated
+	 * depending on the sendMD5Sum applet parameter, during the file preparation
+	 * file.
+	 * 
+	 * @return The corresponding MD5 sum.
+	 * @throws JUploadException 
+	 * @see #beforeUpload()
+	 */
+	public String getMD5() throws JUploadException;
+
+	/**
+	 * This function return the FileData content type.
+	 * 
+	 * @return The mimeType for the file.
+	 */
+	public String getMimeType();
+
+	/**
+	 * Indicate if this file can be read. Take care of the File.canRead()
+	 * methods, that seems to be wrong from time to time.
+	 * 
+	 * @return indicates whether the file can be read or not.
+	 */
+	public boolean canRead();
+
+	/**
+	 * Standard getter, for the file described by the FileData instance.
+	 * 
+	 * @return the File instance associated with this row.
+	 */
+	public File getFile();
+
+	/**
+	 * Retrieves the path of this file relative to it's root dir
+	 * 
+	 * @return This instance's relative path or an empty string if it was not
+	 *         created using a root parameter.
+	 */
+	public String getRelativeDir();
+
+	/**
+	 * Indicates whether the file can be uploaded or not. This boolean should be
+	 * set to true in the call to {@link #beforeUpload()}, and the to false in
+	 * the call to {@link #afterUpload()}.
+	 * 
+	 * @return True if the file is ready for upload.
+	 * @throws IllegalStateException
+	 *             When the upload is not prepared (before a call to
+	 *             {@link #beforeUpload()} or after a call to
+	 *             {@link #afterUpload()}
+	 */
+	public boolean isPreparedForUpload();
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/AudioFileData.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/AudioFileData.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/AudioFileData.java	(revision 3951)
@@ -0,0 +1,61 @@
+//
+// $Id: AudioFileData.java 822 2009-07-02 14:49:12Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2007-01-19
+// Creator: etienne_sf
+// Last modified: $Date: 2009-07-02 11:49:12 -0300 (Qui, 02 Jul 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata;
+
+import java.io.File;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This class contains all data for files to upload an audio file. It adds the
+ * following elements to the {@link wjhk.jupload2.filedata.FileData} class :<BR>
+ * <UL>
+ * <LI>Pre-earing of audio files
+ * <LI>To be completed
+ * </UL>
+ * <BR>
+ * <BR>
+ * The audio functionalities are taken from the entagged sourceforge project.
+ * The entagged-audioformats.jar is used to generate the sound, within the
+ * applet. To keep the applet jar file small, the entagged jar file is not
+ * embedded into the jupload jar. It is loaded independantly. <BR>
+ * <BR>
+ * To be completed
+ * 
+ * @author etienne_sf
+ * @version $Revision: 822 $
+ */
+
+public class AudioFileData extends DefaultFileData {
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param file The files which data are to be handled by this instance.
+     * @param root The root directory, to calculate the relative dir (see
+     *            {@link #getRelativeDir()}.
+     * @param uploadPolicy The current upload policy
+     */
+    public AudioFileData(File file, File root, UploadPolicy uploadPolicy) {
+        super(file, root, uploadPolicy);
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/DefaultFileData.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/DefaultFileData.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/DefaultFileData.java	(revision 3951)
@@ -0,0 +1,440 @@
+//
+// $Id: DefaultFileData.java 267 2007-06-08 13:42:02 +0000 (ven., 08 juin 2007)
+// felfert $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-04-21
+// Creator: etienne_sf
+// Last modified: $Date: 2010-06-28 10:20:25 -0300 (Seg, 28 Jun 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.filedata;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.IOException;
+import java.io.InputStream;
+import java.security.MessageDigest;
+import java.security.NoSuchAlgorithmException;
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+import wjhk.jupload2.exception.JUploadException;
+import wjhk.jupload2.exception.JUploadExceptionTooBigFile;
+import wjhk.jupload2.exception.JUploadIOException;
+import wjhk.jupload2.policies.DefaultUploadPolicy;
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.helper.ByteArrayEncoder;
+
+/**
+ * This class contains all data and methods for a file to upload. The current
+ * {@link wjhk.jupload2.policies.UploadPolicy} contains the necessary parameters
+ * to personalize the way files must be handled. <BR>
+ * <BR>
+ * This class is the default FileData implementation. It gives the default
+ * behaviour, and is used by {@link DefaultUploadPolicy}. It provides standard
+ * control on the files choosen for upload.
+ * 
+ * @see FileData
+ * @author etienne_sf
+ */
+public class DefaultFileData implements FileData {
+
+	/**
+	 * The current upload policy.
+	 */
+	UploadPolicy uploadPolicy;
+
+	/**
+	 * Indicates whether the file is prepared for upload or not.
+	 * 
+	 * @see FileData#isPreparedForUpload()
+	 */
+	boolean preparedForUpload = false;
+
+	private final static int BUFLEN = 4096;
+
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// Protected attributes
+	// /////////////////////////////////////////////////////
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * Mime type of the file. It will be written in the upload HTTP request.
+	 */
+	protected String mimeType = "application/octet-stream";
+
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////
+	// /////////////////////// Private attributes
+	// ////////////////////////////////////////////////////////
+	// ///////////////////////////////////////////////////////////////////////////////////////////////////////
+
+	/**
+	 * file is the file about which this FileData contains data.
+	 */
+	protected File file;
+
+	/**
+	 * Cached file size
+	 */
+	protected long fileSize;
+
+	/**
+	 * Cached file directory
+	 */
+	protected String fileDir;
+
+	/**
+	 * cached root of this file
+	 */
+	protected String fileRoot = "";
+
+	/**
+	 * Cached file modification time.
+	 */
+	protected Date fileModified;
+
+	/**
+	 * The md5sum for the prepared file. Calculated in the
+	 * {@link #beforeUpload()}, and cleared in the {@link #afterUpload()}.
+	 */
+	protected String md5sum = null;
+
+	/**
+	 * Indicates whether the applet can read this file or not.
+	 */
+	protected Boolean canRead = null;
+
+	/**
+	 * Standard constructor
+	 * 
+	 * @param file
+	 *            The file whose data this instance will give.
+	 * @param root
+	 *            The directory root, to be able to calculate the result of
+	 *            {@link #getRelativeDir()}
+	 * @param uploadPolicy
+	 *            The current upload policy.
+	 */
+	public DefaultFileData(File file, File root, UploadPolicy uploadPolicy) {
+		this.file = file;
+		this.uploadPolicy = uploadPolicy;
+		this.fileSize = this.file.length();
+		this.fileDir = this.file.getAbsoluteFile().getParent();
+		this.fileModified = new Date(this.file.lastModified());
+		if (null != root) {
+			this.fileRoot = root.getAbsolutePath();
+			uploadPolicy.displayDebug("Creation of the DefaultFileData for "
+					+ file.getAbsolutePath() + "(root: "
+					+ root.getAbsolutePath() + ")", 10);
+		} else {
+			uploadPolicy.displayDebug("Creation of the DefaultFileData for "
+					+ file.getAbsolutePath() + "(root: null)", 10);
+		}
+
+		// Let
+		this.mimeType = this.uploadPolicy.getContext().getMimeType(
+				getFileExtension());
+	}
+
+	/** {@inheritDoc} */
+	public void appendFileProperties(ByteArrayEncoder bae, int index)
+			throws JUploadIOException {
+		bae.appendTextProperty("mimetype", getMimeType(), index);
+		bae.appendTextProperty("pathinfo", getDirectory(), index);
+		bae.appendTextProperty("relpathinfo", getRelativeDir(), index);
+		// To add the file date/time, we first have to format this date.
+		SimpleDateFormat dateformat = new SimpleDateFormat(this.uploadPolicy
+				.getDateFormat());
+		String uploadFileModificationDate = dateformat
+				.format(getLastModified());
+		bae.appendTextProperty("filemodificationdate",
+				uploadFileModificationDate, index);
+	}
+
+	/** {@inheritDoc} */
+	public synchronized void beforeUpload() throws JUploadException {
+		if (this.preparedForUpload) {
+			// Maybe an upload was stopped. Let's log a resume, and resume the
+			// job.
+			this.uploadPolicy.displayWarn("The file " + getFileName()
+					+ " is already prepared for upload");
+		} else {
+			// The file is now prepared for upload.
+			this.preparedForUpload = true;
+
+			// Should we calculate the MD5Sum for this file ?
+			if (this.uploadPolicy.getSendMD5Sum()) {
+				calculateMD5Sum();
+			}
+
+			// Default : we check that the file is smaller than the maximum
+			// upload size.
+			if (getUploadLength() > this.uploadPolicy.getMaxFileSize()) {
+				throw new JUploadExceptionTooBigFile(getFileName(),
+						getUploadLength(), this.uploadPolicy);
+			}
+		}
+	}
+
+	/** {@inheritDoc} */
+	public long getUploadLength() {
+		if (!this.preparedForUpload) {
+			throw new IllegalStateException("The file " + getFileName()
+					+ " is not prepared for upload");
+		}
+		return this.fileSize;
+	}
+
+	/** {@inheritDoc} */
+	public synchronized void afterUpload() {
+		if (!this.preparedForUpload) {
+			throw new IllegalStateException("The file " + getFileName()
+					+ " is not prepared for upload");
+		}
+		// Let's free resources or temporary calculation in DefaultFileData
+		this.md5sum = null;
+
+		// Then, we change the preparation status.
+		this.preparedForUpload = false;
+	}
+
+	/** {@inheritDoc} */
+	public synchronized InputStream getInputStream() throws JUploadException {
+		if (!this.preparedForUpload) {
+			throw new IllegalStateException("The file " + getFileName()
+					+ " is not prepared for upload");
+		}
+		// Standard FileData : we read the file.
+		try {
+			return new FileInputStream(this.file);
+		} catch (FileNotFoundException e) {
+			throw new JUploadIOException(e);
+		}
+	}
+
+	/** {@inheritDoc} */
+	public String getFileName() {
+		return this.file.getName();
+	}
+
+	/** {@inheritDoc} */
+	public String getFileExtension() {
+		return getExtension(this.file);
+	}
+
+	/** {@inheritDoc} */
+	public long getFileLength() {
+		return this.fileSize;
+	}
+
+	/** {@inheritDoc} */
+	public Date getLastModified() {
+		return this.fileModified;
+	}
+
+	/** {@inheritDoc} */
+	public String getDirectory() {
+		return this.fileDir;
+	}
+
+	/** {@inheritDoc} */
+	public String getMD5() throws JUploadException {
+		if (this.md5sum == null) {
+			throw new JUploadException("The MD5Sum has not been calculated!");
+		}
+		return this.md5sum;
+	}
+
+	/**
+	 * Calculate the MD5Sum for the transformed file, or the original if no
+	 * transformation should be done on the file, before upload.
+	 * 
+	 * @throws JUploadException
+	 */
+	public void calculateMD5Sum() throws JUploadException {
+		StringBuffer ret = new StringBuffer();
+		MessageDigest digest = null;
+		byte md5Buffer[] = new byte[BUFLEN];
+		int nbBytes;
+
+		// Calculation of the MD5 sum. Now done before upload, to prepare the
+		// file head.
+		// This makes the file being parsed two times: once before upload, and
+		// once for the actual upload
+		InputStream md5InputStream = getInputStream();
+		try {
+			digest = MessageDigest.getInstance("MD5");
+			while ((nbBytes = md5InputStream.read(md5Buffer, 0, BUFLEN)) > 0) {
+				digest.update(md5Buffer, 0, nbBytes);
+			}
+		} catch (IOException e) {
+			throw new JUploadIOException(e);
+		} catch (NoSuchAlgorithmException e) {
+			throw new JUploadException(e);
+		} finally {
+			try {
+				md5InputStream.close();
+			} catch (IOException e) {
+				throw new JUploadIOException(e);
+			}
+		}
+
+		// Now properly format the md5 sum.
+		byte md5sum[] = new byte[32];
+		if (digest != null)
+			md5sum = digest.digest();
+		for (int i = 0; i < md5sum.length; i++) {
+			ret.append(Integer.toHexString((md5sum[i] >> 4) & 0x0f));
+			ret.append(Integer.toHexString(md5sum[i] & 0x0f));
+		}
+
+		this.md5sum = ret.toString();
+	}
+
+	/** {@inheritDoc} */
+	public String getMimeType() {
+		return this.mimeType;
+	}
+
+	/** {@inheritDoc} */
+	public boolean canRead() {
+		// The commented line below doesn't seems to work.
+		// return this.file.canRead();
+
+		// The canRead status is read once. This is done in this method, so that
+		// it's available for all subclasses. If it were in the constructor, we
+		// would have to initialize {@link #canRead} in all subclasses.
+
+		// Let's store the status 'readible' only once. It's
+		if (this.canRead == null) {
+			try {
+				InputStream is = new FileInputStream(this.file);
+				is.close();
+				this.canRead = Boolean.valueOf(true);
+			} catch (IOException e) {
+				// Can't read the file!
+				this.canRead = Boolean.valueOf(false);
+			}
+		}
+
+		return this.canRead.booleanValue();
+	}
+
+	/** {@inheritDoc} */
+	public File getFile() {
+		return this.file;
+	}
+
+	/** {@inheritDoc} */
+	public String getRelativeDir() {
+		if (null != this.fileRoot && (!this.fileRoot.equals(""))
+				&& (this.fileDir.startsWith(this.fileRoot))) {
+			int skip = this.fileRoot.length();
+			if (!this.fileRoot.endsWith(File.separator))
+				skip++;
+			if ((skip >= 0) && (skip < this.fileDir.length()))
+				return this.fileDir.substring(skip);
+		}
+		return "";
+	}
+
+	// ////////////////////////////////////////////////////////
+	// UTILITIES
+	// ////////////////////////////////////////////////////////
+	/**
+	 * Returns the extension of the given file. To be clear: <I>jpg</I> is the
+	 * extension for the file named <I>picture.jpg</I>.
+	 * 
+	 * @param file
+	 *            the file whose the extension is wanted!
+	 * @return The extension, without the point, for the given file.
+	 */
+	public static String getExtension(File file) {
+		String name = file.getName();
+		return name.substring(name.lastIndexOf('.') + 1);
+	}
+
+	/**
+	 * Return the 'biggest' common ancestror of the given file array. For
+	 * instance, the root for the files /usr/bin/toto and /usr/titi is /usr.
+	 * 
+	 * @param fileArray
+	 * @return The common root for the given files.
+	 */
+	public static File getRoot(File[] fileArray) {
+		// Let's find the common root for the dropped files.
+		// If one file has been dropped (the minimum), the path of its parent
+		// should be the root.
+		File root = fileArray[0];
+		if (root.isDirectory()) {
+			root = root.getParentFile();
+		}
+		// Let's find the higher root level.
+		while (root != null && !root.isDirectory()) {
+			// We have a file. Let's take it's folder.
+			root = root.getParentFile();
+		}
+
+		if (root != null) {
+			// root is the root for the first file. We add all directories,
+			// and higher until the root. This will allow to find the
+			// 'bigger' directory, which is the common root for all dropped
+			// files.
+			// If several files are being added, we take the common root for
+			// them.
+			String pathRoot = root.getAbsolutePath() + File.separator;
+			String pathCurrentFileParentPath;
+			File pathCurrentFileParent;
+
+			// We start with the second item in the list, as we already
+			// extracted the first.
+			for (int i = 1; i < fileArray.length && root != null; i += 1) {
+				// Let's check that all files in l are parents of the current
+				// file.
+				pathCurrentFileParent = fileArray[i];
+				pathCurrentFileParentPath = pathCurrentFileParent
+						.getAbsolutePath()
+						+ File.separator;
+
+				// We loop through the parent of the file, until we find a
+				// common root.
+				while (pathCurrentFileParent != null
+						&& !pathRoot.startsWith(pathCurrentFileParentPath)) {
+					pathCurrentFileParent = pathCurrentFileParent
+							.getParentFile();
+					pathCurrentFileParentPath = pathCurrentFileParent
+							.getAbsolutePath()
+							+ File.separator;
+				}
+
+				// Let's store the new found root (which may actually be the
+				// same as the last one)
+				root = pathCurrentFileParent;
+				pathRoot = pathCurrentFileParentPath;
+			}// for
+
+			// pathRoot contains the path for the found root.
+			root = new File(pathRoot);
+		}
+
+		return root;
+	}
+
+	/** {@inheritDoc} */
+	public boolean isPreparedForUpload() {
+		return this.preparedForUpload;
+	}
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/filedata/package.html	(revision 3951)
@@ -0,0 +1,79 @@
+
+<HTML>
+
+<BODY>
+
+<P>This package allows you to change the file relative behaviour: this page describes how to override the 
+default behaviour, to fullfill your needs (for instance add data compression, preload check, new data 
+about files in the upload to the server..</P>
+
+
+<H3>What is FileData for ?</H3>
+
+The <a href="FileData.html">FileData</a> interface provides an easy way to add new file type capabilities to the applet. 
+The main entry points allow you to:
+<DIR>
+<LI>Change the file behaviour for the upload. For instance: additional checks, compression before upload, new file properties 
+to be sent to the server.
+<LI>New GUI capabilities: for instance an <a href="AudioFileData.html">AudioFileData</a> has been started, to allow the user to 
+hear the sound in the files he selected.   
+</DIR>
+
+<H3>HowTo create a new FileData instance</H3>
+   
+The core/default implementation is contained in <a href="DefaultFileData.html">DefaultFileData</a>. This class provides a default
+implementation to all FileData interface methods. The easiest way to create a new FileData instance, is to inherit from this default
+implementation, and just override the method you're interested in. Doing this minimizes your work, and insures you the minimum risk
+of incompatibility with next versions.<BR>
+Once you've created your new XxxFileData class, you'll have to create objects of this class. This is done by creating a new 
+{@link wjhk.jupload2.policies.UploadPolicy}, and override the 
+{@link wjhk.jupload2.policies.UploadPolicy#createFileData(java.io.File, java.io.File)} method.
+
+<H3>Description of FileData methods</H3>
+
+<H4>Methods with impact on upload behaviour or content</H4>
+
+<TABLE>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#appendFileProperties(ByteArrayEncoder, int)}</TD>
+		<TD>Add properties like the filename, or the directory to the upload (useless in FTP mode)</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#beforeUpload()} </TD>
+		<TD>Allows the FileData to do any necessary work before the upload of the file begin. For instance, in 
+		PictureFileData, the picture can here be resized, according to the upload policies values.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#getUploadLength()} </TD>
+		<TD>Returns the actual number of bytes that will be uploaded. Will be different from the file length, if the 
+		file must transformed before upload. For instance: picture resizing, or before upload compression.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#afterUpload()}</TD>
+		<TD>Called after the end of the upload. Allows to clear any resource, like temporary files.</TD>
+	</TR>
+	<TR>
+		<TD>{@link wjhk.jupload2.filedata.FileData#getInputStream()}</TD>
+		<TD>Returns an InputStream, that'll contain all bytes to upload.</TD>
+	</TR>
+</TABLE>
+
+<H4>Methods for general file information</H4>
+
+You probably won't have to override these methods.
+
+<DIR>
+<LI>{@link wjhk.jupload2.filedata.FileData#getFileExtension()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getFileLength()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getLastModified()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getDirectory()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getMimeType()}
+<LI>{@link wjhk.jupload2.filedata.FileData#canRead()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getFile()}
+<LI>{@link wjhk.jupload2.filedata.FileData#getRelativeDir()}: Returns the directory, relative to the current selection. Especially useful when 
+dropping entire directories on the applet. 
+</DIR>
+ 
+</BODY>
+</HTML>
+ 
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionTooBigFile.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionTooBigFile.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionTooBigFile.java	(revision 3951)
@@ -0,0 +1,48 @@
+//
+// $Id: JUploadExceptionTooBigFile.java 918 2010-01-08 22:21:44Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: ?
+// Creator: William JinHua Kwong
+// Last modified: $Date: 2010-01-08 20:21:44 -0200 (Sex, 08 Jan 2010) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+import wjhk.jupload2.gui.filepanel.SizeRenderer;
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This exception indicates, that the file that is to be uploaded is too big.
+ * Note: the file to upload may be smaller than the file selected by the user.
+ * For instance, a picture may be reduced before upload.
+ */
+public class JUploadExceptionTooBigFile extends JUploadException {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 4842380093113396023L;
+
+    /**
+     * Creates a new instance.
+     * 
+     * @param filename The filename for the file in error
+     * @param uploadLength The length of this file
+     * @param uploadPolicy The current upload policy.
+     */
+    public JUploadExceptionTooBigFile(String filename, long uploadLength,
+            UploadPolicy uploadPolicy) {
+        super(uploadPolicy.getLocalizedString("errFileTooBig", filename,
+                SizeRenderer.formatFileSize(uploadLength, uploadPolicy)));
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadInterrupted.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadInterrupted.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadInterrupted.java	(revision 3951)
@@ -0,0 +1,57 @@
+//
+// $Id: JUploadException.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2008-04-09
+// Creator: etienne_sf
+// Last modified: $Date: 2008-11-28 11:45:19 +0100 (ven., 28 nov. 2008) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+import wjhk.jupload2.policies.UploadPolicy;
+import wjhk.jupload2.upload.DefaultFileUploadThread;
+
+/**
+ * This class is thrown in the {@link DefaultFileUploadThread}, when it detects
+ * that the user clicked on the stop button. Using an exception allows to
+ * interrupt the whole process. It's up to each method to close/free any
+ * resource.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class JUploadInterrupted extends Exception {
+
+    /**
+     * A default serial UID.
+     */
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * The standard constructor for this class.
+     * 
+     * @param detectedInMethod The full name (with class) of the method that
+     *            creates this exception. Used to log all needed information.
+     * @param uploadPolicy The current upload policy, used to log a message.
+     */
+    public JUploadInterrupted(String detectedInMethod, UploadPolicy uploadPolicy) {
+        super("Upload stopped by the user");
+        uploadPolicy.displayInfo(getMessage() + " (interruption detected in: "
+                + detectedInMethod + ")");
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadIOException.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadIOException.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadIOException.java	(revision 3951)
@@ -0,0 +1,65 @@
+//
+// $Id: JUploadIOException.java 887 2009-11-06 21:07:21Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-11-20
+// Creator: etienne_sf
+// Last modified: $Date: 2009-11-06 19:07:21 -0200 (Sex, 06 Nov 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+/**
+ * This class should be used for all implementations of FileData or UploadPolicy
+ * that want to throw an IO exception, and need to be conform with the interface
+ * definition.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 887 $
+ */
+
+public class JUploadIOException extends JUploadException {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 4202340617039827612L;
+
+    /**
+     * Constructs a new exception with the specified detail message.
+     * 
+     * @param msg The message for this instance.
+     */
+    public JUploadIOException(String msg) {
+        super(msg);
+    }
+
+    /**
+     * Constructs a new exception with the specified cause.
+     * 
+     * @param cause The cause for this instance.
+     */
+    public JUploadIOException(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception with the specified detail message and cause.
+     * 
+     * @param msg The message for this instance.
+     * @param cause The cause for this instance.
+     */
+    public JUploadIOException(String msg, Exception cause) {
+        super(msg, cause);
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadEOFException.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadEOFException.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadEOFException.java	(revision 3951)
@@ -0,0 +1,66 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2010 The JUpload Team
+//
+// Created: 12 févr. 2010
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * This error is thrown, when the socket used to read bytes from the server is
+ * closed. Previously, the applet would throw an 'unexpected EOF' error, in this
+ * case.
+ * 
+ * @author etienne_sf
+ */
+@SuppressWarnings("serial")
+public class JUploadEOFException extends JUploadIOException {
+
+    UploadPolicy uploadPolicy;
+
+    String actionInError = null;
+
+    /**
+     * @param uploadPolicy
+     * @param actionInError
+     */
+    public JUploadEOFException(UploadPolicy uploadPolicy, String actionInError) {
+        super("Unexpected and of communication with the server");
+        this.uploadPolicy = uploadPolicy;
+        this.actionInError = actionInError;
+    }
+
+    /**
+     * @return The error messsage. When debug level is 30 or more, the
+     *         actionInError is added to the error message.
+     * 
+     */
+    public String getMessage() {
+        if (this.uploadPolicy.getDebugLevel() >= 30) {
+            return super.getMessage();
+        } else {
+            return super.getMessage() + " (" + this.actionInError + ")";
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailed.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailed.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailed.java	(revision 3951)
@@ -0,0 +1,64 @@
+//
+// $Id: JUploadExceptionUploadFailed.java 887 2009-11-06 21:07:21Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-09-15
+// Creator: etienne_sf
+// Last modified: $Date: 2009-11-06 19:07:21 -0200 (Sex, 06 Nov 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+/**
+ * This exception occurs when an upload failed. It can be generated if the
+ * server response to the upload doesn't match the
+ * {@link wjhk.jupload2.policies.UploadPolicy#PROP_STRING_UPLOAD_SUCCESS}
+ * regular expression.
+ * 
+ * @author etienne_sf
+ * @author $Revision: 887 $
+ */
+public class JUploadExceptionUploadFailed extends JUploadException {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -9031106357048838553L;
+
+    /**
+     * Constructs a new exception with the specified detail message.
+     * 
+     * @param msg The message for this instance.
+     */
+    public JUploadExceptionUploadFailed(String msg) {
+        super(msg);
+    }
+
+    /**
+     * Constructs a new exception with the specified cause.
+     * 
+     * @param cause The cause for this instance.
+     */
+    public JUploadExceptionUploadFailed(Exception cause) {
+        super(cause);
+    }
+
+    /**
+     * Constructs a new exception with the specified detail message and cause.
+     * 
+     * @param msg The message for this instance.
+     * @param cause The cause for this instance.
+     */
+    public JUploadExceptionUploadFailed(String msg, Throwable cause) {
+        super(msg, cause);
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadException.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadException.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadException.java	(revision 3951)
@@ -0,0 +1,113 @@
+//
+// $Id: JUploadException.java 95 2007-05-02 03:27:05Z
+// /C=DE/ST=Baden-Wuerttemberg/O=ISDN4Linux/OU=Fritz
+// Elfert/CN=svn-felfert@isdn4linux.de/emailAddress=fritz@fritz-elfert.de $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-05-09
+// Creator: etienne_sf
+// Last modified: $Date: 2009-11-06 19:07:21 -0200 (Sex, 06 Nov 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+/**
+ * A new kind of exceptions. Currently : no other specialization than its name.
+ * 
+ * @author etienne_sf
+ * @version $Revision: 887 $
+ */
+public class JUploadException extends Exception {
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = -6386378085666411905L;
+
+    private String location = null;
+
+    /**
+     * Creates a new instance with a specified message.
+     * 
+     * @param message The message to be associated with this instance.
+     */
+    public JUploadException(String message) {
+        super(message);
+        StackTraceElement[] trace = super.getStackTrace();
+        if (trace.length > 0) {
+            StackTraceElement se = trace[0];
+            this.location = se.getClassName() + "." + se.getMethodName()
+                    + " in " + se.getFileName() + ", line "
+                    + se.getLineNumber();
+        }
+    }
+
+    /**
+     * Creates a new instance with a specified original exception.
+     * 
+     * @param ex The exception that was originally thrown.
+     */
+    public JUploadException(Exception ex) {
+        super(ex);
+        StackTraceElement[] trace = ex.getStackTrace();
+        if (trace.length > 0) {
+            StackTraceElement se = trace[0];
+            this.location = se.getClassName() + "." + se.getMethodName()
+                    + " in " + se.getFileName() + ", line "
+                    + se.getLineNumber();
+        }
+    }
+
+    /**
+     * Creates a new instance with a specified message and original exception.
+     * 
+     * @param message The message to be associated with this instance.
+     * @param ex The exception that was originally thrown.
+     */
+    public JUploadException(String message, Throwable ex) {
+        super(message, ex);
+        StackTraceElement[] trace = ex.getStackTrace();
+        if (trace.length > 0) {
+            StackTraceElement se = trace[0];
+            this.location = se.getClassName() + "." + se.getMethodName()
+                    + " in " + se.getFileName() + ", line "
+                    + se.getLineNumber();
+        }
+    }
+
+    /**
+     * Retrieves the human readable location of this exception (Class.method,
+     * filename, linenumber)
+     * 
+     * @return The location where this exception was thrown.
+     */
+    public String getLocation() {
+        return (null == this.location) ? "unknown location" : this.location;
+    }
+
+    /**
+     * Returns JUploadExceptionClassName:CauseClassName. For instance:<BR>
+     * wjhk.jupload2.exception.JUploadIOException:FileNotFoundException <BR>
+     * or<BR>
+     * wjhk.jupload2.exception.JUploadIOException (if there is no cause given to
+     * the JUploadException constructor).
+     * 
+     * @return The class name(s) that can be displayed in an error message.
+     */
+    public String getClassNameAndClause() {
+        if (getCause() == null) {
+            return this.getClass().getName();
+        } else {
+            return this.getClass().getName() + ":"
+                    + this.getCause().getClass().getName();
+        }
+    }
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionStopAddingFiles.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionStopAddingFiles.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionStopAddingFiles.java	(revision 3951)
@@ -0,0 +1,56 @@
+//
+// $Id$
+//
+// jupload - A file upload applet.
+//
+// Copyright 2008 The JUpload Team
+//
+// Created: 20 mars 08
+// Creator: etienne_sf
+// Last modified: $Date$
+//
+// This program is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// This program is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software
+// Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+import java.io.File;
+
+import wjhk.jupload2.policies.UploadPolicy;
+
+/**
+ * 
+ * This exception is a trick, to stop adding files to the file list, when too
+ * many files don't match the allowed extension (see
+ * <I>wjhk.jupload2.gui.FilePanelDataModel2#addFile(File, File)</I>), or any
+ * other control of the current upload policy (see
+ * {@link UploadPolicy#createFileData(File, File)}.
+ * 
+ * @author etienne_sf
+ * 
+ */
+public class JUploadExceptionStopAddingFiles extends JUploadException {
+
+    /** A generated serialVersionUID, to avoid warning during compilation */
+    private static final long serialVersionUID = 4395228400366722178L;
+
+    /**
+     * @param message
+     */
+    public JUploadExceptionStopAddingFiles(String message) {
+        super(message);
+        // No action.
+    }
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailedSuccessNotFound.java
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailedSuccessNotFound.java	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/JUploadExceptionUploadFailedSuccessNotFound.java	(revision 3951)
@@ -0,0 +1,52 @@
+//
+// $Id: JUploadExceptionUploadFailed.java 887 2009-11-06 21:07:21Z etienne_sf $
+//
+// jupload - A file upload applet.
+// Copyright 2007 The JUpload Team
+//
+// Created: 2006-09-15
+// Creator: etienne_sf
+// Last modified: $Date: 2009-11-06 22:07:21 +0100 (ven., 06 nov. 2009) $
+//
+// This program is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free Software
+// Foundation; either version 2 of the License, or (at your option) any later
+// version. This program is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
+// details. You should have received a copy of the GNU General Public License
+// along with this program; if not, write to the Free Software Foundation, Inc.,
+// 675 Mass Ave, Cambridge, MA 02139, USA.
+
+package wjhk.jupload2.exception;
+
+/**
+ * @author etienne_sf
+ * 
+ */
+public class JUploadExceptionUploadFailedSuccessNotFound extends
+		JUploadExceptionUploadFailed {
+
+	/** */
+	private static final long serialVersionUID = -5899077547982544361L;
+
+	/** @param msg */
+	public JUploadExceptionUploadFailedSuccessNotFound(String msg) {
+		super(msg);
+	}
+
+	/** @param cause */
+	public JUploadExceptionUploadFailedSuccessNotFound(Exception cause) {
+		super(cause);
+	}
+
+	/**
+	 * @param msg
+	 * @param cause
+	 */
+	public JUploadExceptionUploadFailedSuccessNotFound(String msg,
+			Throwable cause) {
+		super(msg, cause);
+	}
+
+}
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/exception/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/exception/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/exception/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+Some application specific exceptions.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/src/main/java/wjhk/jupload2/package.html
===================================================================
--- 3thparty/jupload/src/main/java/wjhk/jupload2/package.html	(revision 3951)
+++ 3thparty/jupload/src/main/java/wjhk/jupload2/package.html	(revision 3951)
@@ -0,0 +1,9 @@
+
+<HTML>
+
+<BODY>
+
+The applet itself.
+
+</BODY>
+</HTML>
Index: 3thparty/jupload/src/main/resources/lang/lang_pt.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_pt.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_pt.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Portugese
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_da.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_da.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_da.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Danish
+contributor = Jeppe Bundsgaard
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = danish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = S\u00f8g ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter mod uret
+buttonRotateRight = Roter med uret
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Uploader filer %1$s
+infoUploaded = Filen/filerne %1$s er uploadet. Venter p\u00e5 serversvar ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d filer uploadet
+errDuringUpload = Upload stoppede med fejl
+errHttpResponse = Serverens HTTP-svar m\u00f8der ikke succeskriterierne. Uploaden fejlede.
+questionSendMailOnError = En fejl opstod under upload. Vil du sende al relevant information til webmasteren?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Mappe
+colModified = \u00c6ndret
+colReadable = L\u00e6sbar?
+errForbiddenExtension = Ulovlig fil endelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = En fejl opstod under log-h\u00e5ndteringen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6lg venligst et album f\u00f8rst.
+coppermineUploadOk = Billederne er blevet lagt op p\u00e5 serveren i det valgte album.\n\nKlik p\u00e5 Ok nu for at associere navne og kommentarer til disse billeder.\n\nGlem ikke at klikke p\u00e5 \u2018Udf\u00f8r \u00e6ndringer\u2019-knappen for at gemme dine \u00e6ndringer p\u00e5 serveren!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Billedet '%1$s' er for stort. Det bliver uploadet u\u00e6ndret (ingen rotation, st\u00f8rrelses\u00e6ndring...).
+notAPicture = Filen med navnet '%1$s' er ikke et billede. Det er ikke tilf\u00f8jet til listen af filer der skal uploades.
+
+#PictureDialog
+buttonClose = Luk
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_tr.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_tr.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_tr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Turkish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = turkish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = G\u00f6zat...
+buttonRemoveSelected = Se\u00e7ileni \u00c7\u0131kar
+buttonRemoveAll = Hepsini \u00c7\u0131kar
+buttonRotateLeft = Sola \u00c7evir
+buttonRotateRight = Sa\u011fa \u00c7evir
+buttonUpload = G\u00f6nder
+buttonStop = DURDUR
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d Dosya Haz\u0131rlan\u0131yor
+infoUploading = Dosyalar g\u00f6nderiliyor %1$s
+infoUploaded = %1$s Dosya g\u00f6nderildi. Sunucudan yan\u0131t bekleniyor
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+#MISSING  nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = G\u00f6nderim hata verip sona erdi.
+errHttpResponse = Sunucu HTTP cevab\u0131 kriterlere uymad\u0131. G\u00f6nderim ba\u015far\u0131s\u0131z.
+questionSendMailOnError = G\u00f6nderim s\u0131ras\u0131nda hatayla kar\u015f\u0131la\u015f\u0131ld\u0131. Bu durumla ilgili bilgileri webmaster\u2019a g\u00f6ndermek istermisiniz?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ad
+colSize = Boyut
+colDirectory = Dizin
+colModified = De\u011fi\u015ftirilme
+colReadable = Okunabilir mi?
+errForbiddenExtension = Yasak olan uzant\u0131.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0130\u015flem kay\u0131t y\u00f6netiminde bir sorun olu\u015ftu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = L\u00fctfen \u00f6nce bir alb\u00fcm se\u00e7iniz.
+coppermineUploadOk = Resimler sunucuda se\u00e7ili alb\u00fcme ba\u015far\u0131yla g\u00f6nderildi. \n\n Yapaca\u011f\u0131n\u0131z de\u011fi\u015fiklikleri kaydetmek i\u00e7in \u2018De\u011fi\u015fiklikleri Kaydet\u2019e t\u0131klamay\u0131 unutmay\u0131n\u0131z!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = '%1$s' adl\u0131 g\u00f6r\u00fcnt\u00fc dosyas\u0131 \u00e7ok b\u00fcy\u00fck. Herhangi bir de\u011fi\u015fiklik yapmadan (d\u00f6nd\u00fcrme, boyut de\u011fi\u015ftirme vb.) g\u00f6nderilecek.
+notAPicture = '%1$s' adl\u0131 dosya bir g\u00f6r\u00fcnt\u00fc dosyas\u0131 de\u011fildir. Bu dosya, g\u00f6nderilecek dosyalar listesine eklenmedi.
+
+#PictureDialog
+buttonClose = Kapat
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_ar_SA.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_ar_SA.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_ar_SA.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/src/main/resources/lang/lang_ru.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_ru.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_ru.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Russian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = russian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041e\u0431\u0437\u043e\u0440 ...
+buttonRemoveSelected = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+buttonRemoveAll = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435
+buttonRotateLeft = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043b\u0435\u0432\u043e
+buttonRotateRight = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e
+buttonUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+buttonStop = \u0421\u0422\u041e\u041f
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 %1$s
+infoUploaded = \u0424\u0430\u0439\u043b(\u044b) %1$s \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d(\u044b). \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: %1$d
+errDuringUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438
+errHttpResponse = \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c.
+questionSendMailOnError = \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432\u0435\u0431\u043c\u0430\u0441\u0442\u0435\u0440\u0443?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u044f
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u0418\u0437\u043c\u0435\u043d\u0435\u043d
+colReadable = \u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d?
+errForbiddenExtension = \u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u043b\u044c\u0431\u043e\u043c.
+coppermineUploadOk = \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u044c\u0431\u043e\u043c.\n\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ok, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u044d\u0442\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c.\n\n\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f' \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0430. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432...).
+notAPicture = \u0424\u0430\u0439\u043b '%1$s' \u043d\u0435 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430. \u041e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u043a\u0440\u044b\u0442\u044c
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_sv.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_sv.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_sv.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Swedish
+contributor = Erik Lindahl erik@fisensmosse.se
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = swedish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bl\u00e4ddra...
+buttonRemoveSelected = Ta bort markerad
+buttonRemoveAll = Ta bort alla
+buttonRotateLeft = Rotera v\u00e4nster
+buttonRotateRight = Rotera h\u00f6ger
+buttonUpload = Ladda upp
+buttonStop = STOPPA
+messageLogWindowCopiedToClipboard = Ett avlusningsmeddelande har kopierats till urklipp.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. och %3$d sek.
+timefmt_ms = %1$d min. och %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ok\u00e4nd
+status_msg = %1$d%% klart, \u00f6verf\u00f6ringshastighet: %2$s, ETA: %3$s
+menuitem_paste = Klistra in
+
+#JUploadExceptionTooBigFile
+errFileTooBig = '%1$s' \u00e4r f\u00f6r stor (%2$s)
+
+#FileUploadThread
+preparingFile = F\u00f6rbereder fil %1$d/%2$d
+infoUploading = Laddar upp filer %1$s
+infoUploaded = %1$s fil(er) uppladdade. V\u00e4ntar p\u00e5 att servern ska svara...
+infoAborted = Avbr\u00f6ts efter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) uppladdade
+errDuringUpload = Stannade med fel.
+errHttpResponse = Uppladdningen misslyckades: ov\u00e4ntat HTTP-svar
+questionSendMailOnError = Ett fel uppstod. Vill du s\u00e4nda ett mejl med felet till ansvarig?
+
+#DialogUploadRetry
+dialogUploadRetryText = Ett fel uppstod under uppladdningen av filerna till servern. Vill du f\u00f6rs\u00f6ka igen?\n\nUppladdningen kommer att \u00e5terstarta automatiskt om %1$d  sekunder.
+dialogUploadRetryTitle = F\u00f6rs\u00f6ka att ladda upp igen?
+buttonDetails = Detaljer
+buttonYes = Ja
+buttonNo = Nej
+
+#FileUploadManagerThread
+errorDuringUpload = F\u00f6ljande fel uppstod under uppladdningen:\n%1$s\n\nVill du forts\u00e4tta med aktuell uppladdning?
+
+#FilePanelDataModel
+colName = Namn
+colSize = Storlek
+colDirectory = Mapp
+colModified = Senast \u00e4ndrad
+colReadable = L\u00e4sbar?
+errForbiddenExtension = Ogiltig filnamns\u00e4ndelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ett fel uppstod med logghanteringen.
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e4lj ett album f\u00f6rst.
+coppermineUploadOk = Bilden har blivit \u00f6verf\u00f6rd och sparad i \n\nKlicka p\u00e5 OK f\u00f6r att namnge och kommentera bilderna.\n\nGl\u00f6m inte att verkst\u00e4lla namn\u00e4ndringar f\u00f6r att de ska sparas p\u00e5 servern.
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Dra mappar och filer hit
+
+#PictureFileData
+tooBigPicture = Bilden '%1$s' \u00e4r f\u00f6r stor. Den kommer att laddas upp of\u00f6r\u00e4ndrad (rotation, storlek...).
+notAPicture = Filen '%1$s' \u00e4r ingen bild. Den kommer inte att laddas upp.
+
+#PictureDialog
+buttonClose = St\u00e4ng
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Godk\u00e4nn
+
+#InteractiveTrustManager
+itm_title_pass = Ange %1$s l\u00f6senord
+itm_prompt_pass = %1$s l\u00f6senord:
+itm_cert_alert = Varning g\u00e4llande SSL-certifikat
+itm_cert_details = Certifikatdetaljer:
+itm_cert_subject = \u00c4mne:
+itm_cert_issuer = Utf\u00e4rdat av:
+itm_cert_nbefore = Inte f\u00f6re:
+itm_cert_nafter = Inte efter:
+itm_cert_serial = Serienummer:
+itm_cert_fprint = %1$s fingeravtryck:
+itm_cert_C = Land:
+itm_cert_CN = Gemensamt namn:
+itm_cert_L = Plats:
+itm_cert_ST = Region:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisationsnummer:
+itm_reasons = Anledning:
+itm_reason_cnmatch = Certifikatet matchar inte servern (%1$s).
+itm_reason_itrust = Certifikatutf\u00e4rdaren \u00e4r inte trov\u00e4rdig.
+itm_reason_expired = Certifikatet har g\u00e5tt ut.
+itm_reason_notyet = Certifikatet \u00e4r inte giltigt.
+itm_fail_verify = Certifikatet fr\u00e5n servern kunde inte verifieras.
+itm_accept_prompt = Vill du acceptera certifikatet?
+itm_accept_always = Alltid
+itm_accept_now = Bara f\u00f6r den h\u00e4r sessionen
+itm_accept_no = Nej
+itm_new_tstore = Ny TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_bg.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_bg.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_bg.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Bulgarian
+contributor = \u0418\u043b\u0438\u0430\u043d \u0425\u0440\u0438\u0441\u0442\u043e\u0434\u043e\u0440\u043e\u0432 (zulix@zulix.net)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = bulgarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041f\u0440\u0435\u0433\u043b\u0435\u0434 ...
+buttonRemoveSelected = \u0418\u0437\u0442\u0440\u0438\u0439 \u0438\u0437\u0431\u0440\u0430\u043d\u043e\u0442\u043e
+buttonRemoveAll = \u0418\u0437\u0440\u0438\u0439 \u0432\u0441\u0438\u0447\u043a\u043e
+buttonRotateLeft = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u043b\u044f\u0432\u043e
+buttonRotateRight = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u0434\u044f\u0441\u043d\u043e
+buttonUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435
+buttonStop = \u0421\u0422\u041e\u041f
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u0413\u0431/\u0441
+speedunit_mb_per_second = \u041c\u0431/\u0441
+speedunit_kb_per_second = \u041a\u0431/\u0441
+speedunit_b_per_second = \u0431/\u0441
+timefmt_hms = %1$d\u0447, %2$d \u043c\u0438\u043d. \u0438 %3$d \u0441\u0435\u043a.
+timefmt_ms = %1$d \u043c\u0438\u043d. \u0438 %2$d \u0441\u0435\u043a.
+timefmt_s = %1$d \u0441\u0435\u043a\u0443\u043d\u0434\u0438
+timefmt_unknown = \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e
+status_msg = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e %1$d%% \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438, \u0422\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u0441\u0442\u0430\u0442\u0443\u0441: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0413\u043e\u043b\u0435\u043c\u0438\u043d\u0430\u0442\u0430 \u043d\u0430 \u0445\u0430\u0439\u043b\u0430 '%1$s' \u0435 \u043c\u043d\u043e\u0433\u043e \u0433\u043e\u043b\u044f\u043c\u0430 (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u041a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u0435 %1$s
+infoUploaded = %1$s \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0432\u0430\u043d\u0435. \u0427\u0430\u043a\u0430\u043d\u0435 \u043e\u0442\u0433\u043e\u0432\u043e\u0440 \u043e\u0442 \u0441\u044a\u0440\u0432\u0430\u0440\u0430 ...
+infoAborted = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0435\u043d\u043e \u0441\u043b\u0435\u0434 %1$d \u0424\u0430\u0439\u043b(\u0430).
+nbUploadedFiles = %1$d \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0435\u043d\u0438
+errDuringUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u0441\u043f\u0440\u044f \u0437\u0430\u0440\u0430\u0434\u0438 \u0433\u0440\u0435\u0448\u043a\u0438
+errHttpResponse = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u043e\u043f\u0430\u0434\u043d\u0430: \u043d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0438 HTTP \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u0438
+questionSendMailOnError = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u043a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u0438\u0442\u0435 \u0446\u044f\u043b\u0430\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0443\u0435\u0431\u043c\u0430\u0441\u0442\u044a\u0440\u0430?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u0435
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u041f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u043e
+colReadable = \u0427\u0435\u0442\u043b\u0438\u0432\u043e?
+errForbiddenExtension = \u0417\u0430\u0431\u0440\u0430\u043d\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438\u0435.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041c\u043e\u043b\u044f, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0430\u043b\u0431\u0443\u043c.
+coppermineUploadOk = \u0421\u043d\u0438\u043c\u043a\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u0440\u0435\u0434\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430, \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f \u0430\u043b\u0431\u0443\u043c. .\n\n\u041a\u043b\u0438\u043a\u043d\u0435\u0442\u0430 \u043d\u0430 Ok \u0441\u0435\u0433\u0430 \u0437\u0430 \u0434\u0430 \u0441\u0435 \u0430\u0441\u043e\u0446\u0438\u0438\u0440\u0430\u0442 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u0438 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0437\u0438 \u0441\u043d\u0438\u043c\u043a\u0438.\n\n\u041d\u0435 \u0437\u0430\u0431\u0440\u0430\u0432\u044f\u0439\u0442\u0435 \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443'Apply modification button' , \u0437\u0430 \u0434\u0430 \u0437\u0430\u043f\u0430\u0437\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0421\u043d\u0438\u043c\u043a\u0430\u0442\u0430 '%1$s' \u0435 \u043f\u0440\u0435\u043a\u0430\u043b\u0435\u043d\u043e \u0433\u043e\u043b\u044f\u043c\u0430. \u0422\u0447 \u0449\u0435 \u0431\u044a\u0434\u0435 \u043a\u0430\u0447\u0435\u043d\u0430 \u043d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u0430 (\u043d\u044f\u043c\u0430 \u0432\u044a\u0440\u0442\u0435\u043d\u0435, \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 ...).
+notAPicture = \u0418\u043c\u0435\u0442\u043e\u043d\u0430 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u043d\u0435 \u0435 \u0441\u043d\u0438\u043c\u043a\u0430. \u0422\u043e\u0432\u0430 \u043d\u0435 \u0435 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\u043e \u043a\u044a\u043c \u0441\u043f\u0438\u0441\u044a\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u0435.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u0442\u0432\u043e\u0440\u0438
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438
+
+#InteractiveTrustManager
+itm_title_pass = \u041d\u0430\u043f\u0438\u0448\u0438 %1$s \u043f\u0430\u0440\u043e\u043b\u0430
+itm_prompt_pass = %1$s \u043f\u0430\u0440\u043e\u043b\u0430:
+itm_cert_alert = SSL \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435
+itm_cert_details = \u0414\u0435\u0442\u0430\u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430:
+itm_cert_subject = \u0422\u0435\u043c\u0430:
+itm_cert_issuer = \u0415\u043c\u0438\u0442\u0435\u043d\u0442:
+itm_cert_nbefore = \u041d\u0435, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430:
+itm_cert_nafter = \u041d\u0435 \u0441\u043b\u0435\u0434:
+itm_cert_serial = \u0421\u0435\u0440\u0438\u0435\u043d:
+itm_cert_fprint = %1$s \u041e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u043a:
+itm_cert_C = \u0414\u044a\u0440\u0436\u0430\u0432\u0430:
+itm_cert_CN = \u041e\u0431\u0449\u043e\u043f\u0440\u0438\u0435\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435:
+itm_cert_L = \u041c\u0435\u0441\u0442\u043d\u043e\u0441\u0442:
+itm_cert_ST = \u0429\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0438\u043d\u0446\u0438\u044f:
+itm_cert_O = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f:
+itm_cert_OU = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u043e \u0437\u0432\u0435\u043d\u043e:
+itm_reasons = \u041f\u0440\u0438\u0447\u0438\u043d\u0430(\u0438):
+itm_reason_cnmatch = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u043e\u0431\u0449\u043e\u0442\u043e \u0438\u043c\u0435 \u043d\u0435 \u0441\u044a\u0432\u043f\u0430\u0434\u0430 \u0441 \u0438\u043c\u0435\u0442\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0430 (%1$s).
+itm_reason_itrust = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u0435\u043d.
+itm_reason_expired = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0435 \u0441 \u0438\u0437\u0442\u0435\u043a\u044a\u043b \u0441\u0440\u043e\u043a.
+itm_reason_notyet = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0432\u0441\u0435 \u043e\u0449\u0435 \u043d\u0435 \u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d.
+itm_fail_verify = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 \u0441\u044a\u0440\u0432\u044a\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d.
+itm_accept_prompt = \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043f\u0440\u0438\u0435\u043c\u0435\u0442\u0435 \u0442\u043e\u0437\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442?
+itm_accept_always = \u0412\u0438\u043d\u0430\u0433\u0438
+itm_accept_now = \u0421\u0430\u043c\u043e \u0437\u0430 \u0442\u0430\u0437\u0438 \u0441\u0435\u0441\u0438\u044f
+itm_accept_no = \u041d\u0435
+itm_new_tstore = \u041d\u043e\u0432\u0430 TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_de.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_de.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_de.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = German
+contributor = Fritz Elfert <felfert@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = german
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Durchsuchen ...
+buttonRemoveSelected = Ausgew\u00e4hlte entfernen
+buttonRemoveAll = Alle entfernen
+buttonRotateLeft = Gegen den Uhrzeigersinn drehen
+buttonRotateRight = Im Uhrzeigersinn drehen
+buttonUpload = Hochladen
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d Std., %2$d Min. und %3$d Sec.
+timefmt_ms = %1$d Min. und %2$d Sek.
+timefmt_s = %1$d Sekunden
+timefmt_unknown = unbekannt
+status_msg = JUpload %1$d%% abgeschlossen, Transferrate: %2$s, Verbleibend: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Die Datei '%1$s' ist zu gro\u00df (%2$s)
+
+#FileUploadThread
+preparingFile = Datei vorbereiten:  %1$d/%2$d
+infoUploading = \u00dcbertrage Datei: %1$s
+infoUploaded = %1$s Datei(en) hochgeladen. Warte auf Server Antwort ...
+infoAborted = Upload nach %1$d Dateien(en) abgebrochen.
+nbUploadedFiles = %1$d Datei(en) hochgeladen
+errDuringUpload = Upload-Vorgang wegen eines Fehlers gestoppt
+errHttpResponse = Die HTTP Antwort erf\u00fcllt nicht die Kriterien. Vorgang fehlgeschlagen.
+questionSendMailOnError = Es ist ein Fehler aufgetreten. Soll das\nFehlerprotokoll an den Webmaster gesendet werden?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Gr\u00f6\u00dfe
+colDirectory = Verzeichnis
+colModified = Ge\u00e4ndert
+colReadable = Lesbar?
+errForbiddenExtension = Keine erlaubte Dateiendung.
+
+#DefaultUploadPolicy
+errDuringLogManagement = W\u00e4hrend des Log Managements ist ein Fehler aufgetreten
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bitte zuerst ein Album ausw\u00e4hlen.
+coppermineUploadOk = Die Dateien wurden erfolgreich in das ausgew\u00e4hlte Album hochgeladen. \n\nBitte auf OK klicken um zu den Dateien Name und Beschreibung hinzuzuf\u00fcgen.\n\nNach der Eingabe auf '\u00c4nderungen \u00dcbernehmen' klicken, um die Informationen zu speichern !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Das Bild '%1$s' ist zu gro\u00df und wird ohne \u00c4nderungen hochgeladen (ohne Drehung, Gr\u00f6\u00dfen\u00e4nderung...).
+notAPicture = Die Datei '%1$s' ist kein Bild. Sie wird nicht der Liste der hochzuladenden Dateien hinzugef\u00fcgt.
+
+#PictureDialog
+buttonClose = Schlie\u00dfen
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Best\u00e4tigen
+
+#InteractiveTrustManager
+itm_title_pass = %1$s Password eingeben
+itm_prompt_pass = %1$s Passwort:
+itm_cert_alert = SSL Zertificats-Warnung
+itm_cert_details = Zertifikats-Details:
+itm_cert_subject = Inhaber:
+itm_cert_issuer = Aussteller:
+itm_cert_nbefore = G\u00fcltig ab:
+itm_cert_nafter = G\u00fcltig bis:
+itm_cert_serial = Seriennr.:
+itm_cert_fprint = %1$s Fingerabdruck:
+itm_cert_C = Land:
+itm_cert_CN = Allgemeiner Name:
+itm_cert_L = Stadt:
+itm_cert_ST = Staat oder Provinz:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations-Abteilung:
+itm_reasons = Gr\u00fcnde:
+itm_reason_cnmatch = Der allgemaine Name passt nicht zum Hostnamen (%1$s).
+itm_reason_itrust = Dem Aussteller des Zertifikats wird nicht vertraut.
+itm_reason_expired = Das Zertifikat ist abgelaufen.
+itm_reason_notyet = Das Zertifikat ist noch nicht g\u00fcltig.
+itm_fail_verify = Das Zertifikat des Servers konnte nicht \u00fcberpr\u00fcft werden.
+itm_accept_prompt = Wollen Sie dieses Zertifikat annehmen?
+itm_accept_always = Immer
+itm_accept_now = Nur f\u00fcr diese Sitzung
+itm_accept_no = Nein
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_ja.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_ja.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_ja.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Japanese
+contributor = Takashi Yukawa: takashi_922 at yahoo dot co dot jp
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = japanese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f..
+buttonRemoveSelected = \u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664
+buttonRemoveAll = \u3059\u3079\u3066\u524a\u9664
+buttonRotateLeft = \u5de6\u3078\u56de\u8ee2
+buttonRotateRight = \u53f3\u3078\u56de\u8ee2
+buttonUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
+buttonStop = \u505c\u6b62
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d \u306e\u6e96\u5099\u4e2d
+infoUploading = %1$s \u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d
+infoUploaded = %1$s \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002\u30b5\u30fc\u30d0\u304b\u3089\u306e\u5fdc\u7b54\u3092\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u7d42\u4e86
+errDuringUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u30a8\u30e9\u30fc\u3067\u505c\u6b62\u3057\u307e\u3057\u305f\u3002
+errHttpResponse = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5931\u6557: \u4e0d\u6b63\u306a HTTP \u30ec\u30b9\u30dd\u30f3\u30b9
+questionSendMailOnError = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30a8\u30e9\u30fc\u60c5\u5831\u3092WEB\u7ba1\u7406\u8005\u3078\u9001\u4fe1\u3057\u307e\u3059\u304b?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u524d
+colSize = \u30b5\u30a4\u30ba
+colDirectory = \u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240
+colModified = \u66f4\u65b0\u65e5\u6642
+colReadable = \u8aad\u8fbc\u53ef?
+errForbiddenExtension = \u4f7f\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u3067\u3059\u3002
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u30ed\u30b0\u7ba1\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u6700\u521d\u306b\u30a2\u30eb\u30d0\u30e0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+coppermineUploadOk = \u9078\u629e\u3057\u305f\u30a2\u30eb\u30d0\u30e0\u306b\u3001\u753b\u50cf\u304c\u6b63\u3057\u304f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u3002\n\nOk \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u753b\u50cf\u306b\u540d\u524d\u3084\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n'Apply modification button' \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30b5\u30fc\u30d0\u306e\u60c5\u5831\u3082\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = '%1$s' \u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u3059\u304e\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306f\u5909\u66f4\u3055\u308c\u305a\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3059 (\u56de\u8ee2, \u30b5\u30a4\u30ba\u5909\u66f4\u306a\u3069\u306a\u3057)\u3002
+notAPicture = '%1$s' \u306f\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30ea\u30b9\u30c8\u306b\u306f\u8ffd\u52a0\u3055\u308c\u307e\u305b\u3093\u3002
+
+#PictureDialog
+buttonClose = \u9589\u3058\u308b
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_zh_TW.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_zh_TW.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_zh_TW.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/src/main/resources/lang/lang_he.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_he.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_he.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hebrew
+contributor = liorda@gmail.com
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hebrew
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u05e2\u05d9\u05d5\u05df...
+buttonRemoveSelected = \u05d4\u05e1\u05e8 \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05de\u05e1\u05d5\u05de\u05e0\u05d9\u05dd
+buttonRemoveAll = \u05d4\u05e1\u05e8 \u05d4\u05db\u05dc
+buttonRotateLeft = \u05e1\u05d5\u05d1\u05d1 \u05e9\u05de\u05d0\u05dc\u05d4
+buttonRotateRight = \u05e1\u05d5\u05d1\u05d1 \u05d9\u05de\u05d9\u05e0\u05d4
+buttonUpload = \u05d4\u05e2\u05dc\u05d4
+buttonStop = \u05e2\u05e6\u05d5\u05e8
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_mb_per_second = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_kb_per_second = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_b_per_second = \u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+timefmt_hms = %1$d\u05e9, %2$d \u05d3\u05e7\u05d5\u05ea \u05d5-  %3$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_ms = %1$d \u05d3\u05e7\u05d5\u05ea -\u05d5  %2$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_s = %1$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_unknown = \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2
+status_msg = JUpload %1$d%% \u05d4\u05d5\u05e9\u05dc\u05de\u05d5, \u05e7\u05e6\u05d1 \u05d4\u05e2\u05d1\u05e8\u05d4: %2$s, \u05e0\u05d5\u05ea\u05e8: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u05d2\u05d5\u05d3\u05dc \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d2\u05d3\u05d5\u05dc \u05de\u05d3\u05d9 (%2$s)
+
+#FileUploadThread
+preparingFile = \u05de\u05db\u05d9\u05df \u05e7\u05d5\u05d1\u05e5 %1$d/%2$d
+infoUploading = \u05de\u05e2\u05dc\u05d4 \u05e7\u05d1\u05e6\u05d9\u05dd %1$s
+infoUploaded = %1$s \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5. \u05de\u05de\u05ea\u05d9\u05df \u05dc\u05ea\u05d2\u05d5\u05d1\u05ea \u05d4\u05e9\u05e8\u05ea...
+infoAborted = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05dc\u05d0\u05d7\u05e8 %1$d \u05e7\u05d1\u05e6\u05d9\u05dd.
+nbUploadedFiles = %1$d \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5
+errDuringUpload = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05e2\u05dd \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea
+errHttpResponse = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4: \u05ea\u05d2\u05d5\u05d1\u05ea HTTP \u05dc\u05d0-\u05e6\u05e4\u05d5\u05d9\u05d4
+questionSendMailOnError = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05d4\u05d4\u05e2\u05dc\u05d0\u05d4. \u05d4\u05d0\u05dd \u05ea\u05e8\u05e6\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05db\u05dc \u05d4\u05de\u05d9\u05d3\u05e2 \u05d4\u05e8\u05dc\u05d5\u05d5\u05e0\u05d8\u05d9 \u05dc\u05de\u05e0\u05d4\u05dc \u05d4\u05d0\u05ea\u05e8?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u05e9\u05dd
+colSize = \u05d2\u05d5\u05d3\u05dc
+colDirectory = \u05e1\u05e4\u05e8\u05d9\u05d4
+colModified = \u05ea\u05d0\u05e8\u05d9\u05da \u05e9\u05d9\u05e0\u05d5\u05d9
+colReadable = \u05e0\u05d9\u05ea\u05df \u05dc\u05e7\u05e8\u05d9\u05d0\u05d4?
+errForbiddenExtension = \u05e1\u05d9\u05d5\u05de\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05e1\u05d5\u05e8\u05d4.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05e0\u05d9\u05d4\u05d5\u05dc \u05d4\u05d9\u05d5\u05de\u05df
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u05d0\u05e0\u05d0, \u05d1\u05d7\u05e8 \u05d0\u05dc\u05d1\u05d5\u05dd \u05ea\u05d7\u05d9\u05dc\u05d4.
+coppermineUploadOk = \u05d4\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d4\u05d5\u05e2\u05dc\u05d5 \u05dc\u05e9\u05e8\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4, \u05dc\u05d0\u05dc\u05d1\u05d5\u05dd \u05d4\u05e0\u05d1\u05d7\u05e8.\n\n\u05dc\u05d7\u05e5 \u05e2\u05dc OK \u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05d9\u05d9\u05da \u05e9\u05de\u05d5\u05ea \u05d5\u05d4\u05e2\u05e8\u05d5\u05ea \u05dc\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05d5.\n\n\u05d0\u05dc \u05ea\u05e9\u05db\u05d7 \u05dc\u05dc\u05d7\u05d5\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 '\u05d4\u05d7\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd' \u05db\u05d3\u05d9 \u05dc\u05e9\u05de\u05d5\u05e8 \u05d0\u05ea \u05d4\u05db\u05dc \u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05dc\u05e9\u05e8\u05ea!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 '%1$s' \u05d2\u05d3\u05d5\u05dc\u05d4 \u05de\u05d3\u05d9. \u05d4\u05d9\u05d0 \u05ea\u05d5\u05e2\u05dc\u05d4 \u05dc\u05dc\u05d0 \u05db\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9 (\u05e1\u05d9\u05d1\u05d5\u05d1, \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc...).
+notAPicture = \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d0\u05d9\u05e0\u05d5 \u05ea\u05de\u05d5\u05e0\u05d4. \u05d4\u05d5\u05d0 \u05dc\u05d0 \u05d9\u05ea\u05d5\u05d5\u05e1\u05e3 \u05dc\u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05dc\u05e9\u05dc\u05d9\u05d7\u05d4.
+
+#PictureDialog
+buttonClose = \u05e1\u05d2\u05d5\u05e8
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = \u05d1\u05d9\u05d8
+unitGigabytes = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8
+unitMegabytes = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8
+unitKilobytes = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8
+
+#sendDebugInformation
+Confirm = \u05d0\u05d9\u05e9\u05d5\u05e8
+
+#InteractiveTrustManager
+itm_title_pass = \u05d4\u05db\u05e0\u05e1 \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s
+itm_prompt_pass = \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05ea\u05e2\u05d5\u05d3\u05d4 \u05d6\u05d5?
+itm_accept_always = \u05ea\u05de\u05d9\u05d3
+itm_accept_now = \u05e8\u05e7 \u05e2\u05d1\u05d5\u05e8 \u05d4\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea
+itm_accept_no = \u05dc\u05d0
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_ar.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_ar.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_ar.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/src/main/resources/lang/lang_en.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_en.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_en.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = English
+contributor = No maintainer (same content as lang.properties)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_eo.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_eo.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_eo.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Esperanto
+contributor = Chuck Smith
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = esperanto
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Foliumi ...
+buttonRemoveSelected = Forigu Elektita(j)
+buttonRemoveAll = Forigu \u0109iujn
+buttonRotateLeft = Turnigu maldekstren
+buttonRotateRight = Turnigu dekstren
+buttonUpload = Al\u015duti
+buttonStop = HALTI
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. kaj %3$d sek.
+timefmt_ms = %1$d min. kaj %2$d sek.
+timefmt_s = %1$d sekundoj
+timefmt_unknown = nekonata
+status_msg = JUpload %1$d%% finita, transferrapideco: %2$s, restas: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparante dosierojn %1$d/%2$d
+infoUploading = Al\u015dutante dosierojn %1$s
+infoUploaded = Dosiero(j) %1$s al\u015dutita(j). Atendante servilan respondon ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d dosieroj al\u015dutitaj
+errDuringUpload = Al\u015dutado haltita pro eraroj
+errHttpResponse = La HTTP-respondo de la servilo ne ta\u016dgas. La al\u015duto malsukcesis.
+questionSendMailOnError = Eraro okazis al\u015dutante.  \u0109u vi volas sendi \u0109iujn rilatajn informojn al la retestro?
+
+#DialogUploadRetry
+dialogUploadRetryText = Eraro okazis dum al\u015duto de la dosieroj al la servilo. \u0108u vi volas reprovi al\u015duti la dosierojn?\n\nLa al\u015duto a\u016dtomate rekomencos post %1$d sekundoj.
+dialogUploadRetryTitle = Reprovi la al\u015duton?
+buttonDetails = Detaloj
+buttonYes = Jes
+buttonNo = Ne
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nomo
+colSize = Grandeco
+colDirectory = Dosierujo
+colModified = \u015can\u011dita
+colReadable = Legebla?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Eraro okazis dum log-administrado
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bonvolu unue elekti fotoalbumon.
+coppermineUploadOk = La fotoj bone al\u015duti\u011dis al la servilo en la elektita fotoalbumo.\n\nKlaku sur Bone nun por asociigi nomojn kaj komentojn al tiujn fotojn.\n\nNe forgesu klaki sur la 'Butono de Aktivigu \u015dan\u011don' por konservi viajn \u015dan\u011dojn al la servilo!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Bildo '%1$s' tro grandas. \u011di al\u015duti\u011dos ne\u015dan\u011dite (sen turno, \u015dan\u011deco de grandeco ktp).
+notAPicture = La dosiero nomata '%1$s' ne estas bildo. \u011di ne aldoni\u011das al la al\u015dutota dosieraro.
+
+#PictureDialog
+buttonClose = Fermi
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Konfirmi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_cs.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_cs.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_cs.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Czech
+contributor = Vladan Zajda
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = czech
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Proch\u00e1zet ...
+buttonRemoveSelected = Odstranit ozna\u010den\u00e9
+buttonRemoveAll = Odstranit v\u0161e
+buttonRotateLeft = Oto\u010dit vlevo
+buttonRotateRight = Oto\u010dit vpravo
+buttonUpload = P\u0159en\u00e9st
+buttonStop = UKON\u010cIT
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Soubor %1$s je p\u0159\u00edli\u0161 velik\u00fd (%2 byt\u016f)
+
+#FileUploadThread
+preparingFile = P\u0159ipravuji soubor %1$d/%2$d
+infoUploading = P\u0159en\u00e1\u0161\u00edm soubory %1$s
+infoUploaded = %1$s soubor(\u016f) p\u0159eneseno. \u010cek\u00e1m na odpov\u011b\u010f serveru ...
+infoAborted = P\u0159enos byl p\u0159eru\u0161en po %1$d souborech.
+nbUploadedFiles = %1$d soubor(\u016f) p\u0159eneseno
+errDuringUpload = P\u0159enos byl ukon\u010den s chybami
+errHttpResponse = P\u0159enos byl ukon\u010den: neo\u010dek\u00e1van\u00e1 odpov\u011b\u010f HTTP
+questionSendMailOnError = Nastala chyba p\u0159i p\u0159enosu. P\u0159ejete si odeslat detailn\u00ed informace spr\u00e1vci serveru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zev
+colSize = Velikost
+colDirectory = Adres\u00e1\u0159
+colModified = Modifikov\u00e1no
+colReadable = \u010citeln\u00fd?
+errForbiddenExtension = Zak\u00a0zan\u00a0 souborov\u00a0 pr\u00a1pona.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Nastala chyba p\u0159i zpracov\u00e1n\u00ed logu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Nejprve pros\u00edm vyberte album.
+coppermineUploadOk = Obr\u00e1zky byly \u00fasp\u011b\u0161n\u011b p\u0159eneseny do vybran\u00e9ho alba na serveru.\n\nNyn\u00ed klikn\u011bte OK abyste mohli p\u0159i\u0159adit n\u00e1zvy a koment\u00e1\u0159e k obr\u00e1zk\u016fm.\n\nNezapome\u0148te kliknout na tla\u010d\u00edtko 'Ulo\u017eit \u00fapravy', aby do\u0161lo k ulo\u017een\u00ed \u00faprav na serveru !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zek '%1$s' je p\u0159\u00edli\u0161 velk\u00fd. Bude p\u0159enesen neupraven\u00fd (bez oto\u010den\u00ed, zm\u011bny velikosti...).
+notAPicture = Soubor s n\u00e1zvem '%1$s' nen\u00ed obr\u00e1zek. Nebyl tedy vlo\u017een do seznamu soubor\u016f k p\u0159enesen\u00ed.
+
+#PictureDialog
+buttonClose = Zav\u0159\u00edt
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdit
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_pt_BR.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_pt_BR.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_pt_BR.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Brasilian (Protugese)
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = brazilian_portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_fr.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_fr.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_fr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = French
+contributor = Etienne <etienne_sf@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = french
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Parcourir...
+buttonRemoveSelected = Suppr s\u00e9lectionn\u00e9s
+buttonRemoveAll = Suppr tous
+buttonRotateLeft = Tourner gauche
+buttonRotateRight = Tourner droite
+buttonUpload = Envoyer
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Les messages de debug ont \u00e9t\u00e9 copi\u00e9s dans le presse-papier.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Go/s
+speedunit_mb_per_second = Mo/s
+speedunit_kb_per_second = Ko/s
+speedunit_b_per_second = o/s
+timefmt_hms = %1$d h., %2$d min. et %3$d sec.
+timefmt_ms = %1$d min. et %2$d sec.
+timefmt_s = %1$d secondes
+timefmt_unknown = inconnu
+status_msg = JUpload %1$d%% effectu\u00e9, debit: %2$s, dur\u00e9e restante: %3$s
+menuitem_paste = Coller
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Le fichier '%1$s' est trop gros (%2$s)
+
+#FileUploadThread
+preparingFile = Pr\u00e9paration du fichier %1$d/%2$d
+infoUploading = Upload du(des) fichier(s) %1$s en cours
+infoUploaded = Fichier(s) %1$s upload\u00e9. En attente de la r\u00e9ponse du serveur ...
+infoAborted = Upload interrompu apr\u00e8s %1$d fichier(s).
+nbUploadedFiles = %1$d fichier(s) upload\u00e9(s)
+errDuringUpload = Upload arr\u00eat\u00e9 avec erreur
+errHttpResponse = La r\u00e9ponse HTTP du serveur ne correspond pas aux crit\u00e8res de succ\u00e8s. L'upload a \u00e9chou\u00e9.
+questionSendMailOnError = Une erreur s'est produite durant l'upload. Voulez-vous envoyer un mail au webmaster, lui donnant toutes les informations disponibles ?
+
+#DialogUploadRetry
+dialogUploadRetryText = Une erreur s'est produite lors de l'envoi (upload) des fichiers vers le serveur. Voulez-vous r\u00e9ssayer l'upload de ces fichiers ?\n\nL'upload sera automatiquement r\u00e9-ex\u00e9cut\u00e9s dans %1$d secondes.
+dialogUploadRetryTitle = R\u00e9-essayer l'upload ?
+buttonDetails = D\u00e9tails
+buttonYes = Oui
+buttonNo = Non
+
+#FileUploadManagerThread
+errorDuringUpload = L'erreur suivante est survenue durant l'upload :\n%1$s\n\nVoulez-vous continuer cet upload vers le serveur ?
+
+#FilePanelDataModel
+colName = Nom
+colSize = Taille
+colDirectory = R\u00e9pertoire
+colModified = Modifi\u00e9 le
+colReadable = Lisible?
+errForbiddenExtension = Extention de fichier interdite
+
+#DefaultUploadPolicy
+errDuringLogManagement = Une erreur est survenue durant la gestion des logs
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Choisissez d'abord un album.
+coppermineUploadOk = Les images ont \u00e9t\u00e9 charg\u00e9es sur le serveur, dans l'album s\u00e9lectionn\u00e9.\n\nCliquez sur Ok pour aller mettre des noms et commentaires \u00e0 ces images.\n\nN'oubliez pas ensuite de cliquer sur le bouton 'Appliquer les modifications' pour envoyer vos commentaires sur le serveur!
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Glissez-d\u00e9posez des r\u00e9pertoires ou fichiers ici
+
+#PictureFileData
+tooBigPicture = L'image '%1$s' est trop grosse. Elle sera envoy\u00e9e sans modification (rotation...)
+notAPicture = Le fichier '%1$s' n'est pas une image. Il n'est pas ajout\u00e9 \u00e0 la liste des fichiers \u00e0 transf\u00e9rer.
+
+#PictureDialog
+buttonClose = Fermer
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = o
+unitGigabytes = Go
+unitMegabytes = Mo
+unitKilobytes = ko
+
+#sendDebugInformation
+Confirm = Confirmez
+
+#InteractiveTrustManager
+itm_title_pass = Entrez mot de passe pour %1$s
+itm_prompt_pass = Mot de passe pour %1$s:
+itm_cert_alert = Alerte pour le SSL Certificate
+itm_cert_details = D\u00e9tails du certificat:
+itm_cert_subject = Sujet:
+itm_cert_issuer = Emetteur:
+itm_cert_nbefore = Pas avant:
+itm_cert_nafter = Pas apr\u00e8s:
+itm_cert_serial = Num\u00e9ro de s\u00e9rie:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Pays:
+itm_cert_CN = Nom commun:
+itm_cert_L = Localit\u00e9:
+itm_cert_ST = Etat ou province:
+itm_cert_O = Organisation:
+itm_cert_OU = Unit\u00e9 d'Organisation:
+itm_reasons = Raison(s):
+itm_reason_cnmatch = Le nom commun du certificate ne correspond pas au nom de domaine (%1$s).
+itm_reason_itrust = L'\u00e9metteur du Certificat n'est pas de confiance.
+itm_reason_expired = Le certificat aas expir\u00e9.
+itm_reason_notyet = Le certificate n'est pas encore valide.
+itm_fail_verify = Le certificat present\u00e9 par le serveur ne peut pas \u00eatre verifi\u00e9.
+itm_accept_prompt = Voulez-vous accepter ce certificat ?
+itm_accept_always = Toujours
+itm_accept_now = Uniquement pour cette session
+itm_accept_no = Non
+itm_new_tstore = Nouveau magasin
+itm_tstore = Magasin
Index: 3thparty/jupload/src/main/resources/lang/lang_es.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_es.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_es.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Spanish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = spanish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Examinar ...
+buttonRemoveSelected = Eliminar seleccionados
+buttonRemoveAll = Eliminar todos
+buttonRotateLeft = Girar izqda
+buttonRotateRight = Girar drcha
+buttonUpload = Subir
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando fichero %1$d/%2$d
+infoUploading = Subiendo ficheros %1$s
+infoUploaded = %1$s fichero(s) subidos. Esperando la respuesta del servidor...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d ficheros subidos
+errDuringUpload = La carga se detuvo con errores
+errHttpResponse = La respuesta del servidor HTTP no cumple los requisitos. La carga ha fallado.
+questionSendMailOnError = Ocurri\u00f3 un error durante la carga. \u00bfDesea enviar la informaci\u00f3n relevante al webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nombre
+colSize = Tama\u00f1o
+colDirectory = Carpeta
+colModified = Modificado
+colReadable = \u00bfLegible?
+errForbiddenExtension = Extensi\u00a2n de archivo prohibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ocurri\u00f3 un error durante la gesti\u00f3n del log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, seleccione antes un \u00e1lbum.
+coppermineUploadOk = Las im\u00e1genes han sido subidas correctamente al servidor y colocadas en el \u00e1lbum seleccionado.\n\nPulse sobre OK para a\u00f1adir nombres y comentarios a estas im\u00e1genes.\n\nNo olvide pulsar sobre el bot\u00f3n 'Aplicar cambios' para guardar los cambios en el servidor.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = La imagen '%1$s' es demasiado grande. Ser\u00e1 subida sin cambios (rotaciones, cambio de tama\u00f1o...).
+notAPicture = El fichero denominado '%1$s' no es una imagen. No se a\u00f1adir\u00e1 a la lista de ficheros para subir.
+
+#PictureDialog
+buttonClose = Cerrar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_hr.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_hr.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_hr.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Croatian
+contributor = Bruno Simic
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = croatian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Pretra\u017ei...
+buttonRemoveSelected = Obri\u0161i izbor
+buttonRemoveAll = Obri\u0161i sve
+buttonRotateLeft = Rotiraj lijevo
+buttonRotateRight = Rotiraj desno
+buttonUpload = Po\u0161alji
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Datoteka %1$s je prevelika (%2$s)
+
+#FileUploadThread
+preparingFile = Pripremam datoteku %1$d/%2$d
+infoUploading = \u0160aljem datoteku %1$s
+infoUploaded = Datoteka %1$s poslana. \u010cekam informacije sa servera ...
+infoAborted = Slanje prekinuto nakon %1$d. datoteke.
+nbUploadedFiles = %1$d datoteka poslano
+errDuringUpload = Slanje prekinuto sa gre\u0161kom
+errHttpResponse = Slanje neuspje\u0161no: nepoznati HTTP odgovor
+questionSendMailOnError = Gre\u0161ka priliko slanja datoteka. Da li do informacije o gre\u0161ki po\u0161aljem webmasteru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Veli\u010dina
+colDirectory = Direktorij
+colModified = Promjenjeno
+colReadable = \u010citljivo?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Gre\u0161ka u log zapisu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Molimo prvo izaberite album.
+coppermineUploadOk = Slike uspje\u0161no poslane na server u izabrani album.\n\nKliknite OK za pridru\u017eenje imena i komentara tim slikama.\n\nNe zaboravite potvrditi promjene klikom na 'Primijeni izmjene'. Samo nakon toga \u0107e promjene biti pohranjene na server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Datoteka '%1$s' je prevelika i biti \u0107e poslana nepromijenjena (bez rotacije, promjene veli\u010dine...).
+notAPicture = '%1$s' nije u grafi\u010dkom formatu i ne\u0107e biti dodana u listu za slanje.
+
+#PictureDialog
+buttonClose = Zatvori
+
+#DateRenderer
+dateformat = dd.MM.yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_nl.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_nl.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_nl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Dutch
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = dutch
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bladeren ...
+buttonRemoveSelected = Selectie verwijderen
+buttonRemoveAll = Alles verwijderen
+buttonRotateLeft = Roteer linksom
+buttonRotateRight = Roteer rechtsom
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Bestand klaarmaken %1$d/%2$d
+infoUploading = Bestanden uploaden %1$s
+infoUploaded = Bestand(en) %1$s geuploaded. Wachten op server ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d bestanden geuploaded
+errDuringUpload = Upload afgebroken met fouten
+errHttpResponse = Verkeerde HTTP reactie van de server. Upload mislukt.
+questionSendMailOnError = Er is een fout opgetreden tijdens de upload. Wilt u een mail met alle relevante informatie naar de webmaster versturen?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Naam
+colSize = Bestandsgrootte
+colDirectory = Map
+colModified = Gewijzigd
+colReadable = Leesbaar?
+errForbiddenExtension = Verboden bestandstype.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Er is een fout opgetreden tijdens logboek beheer
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Selecteer eerst een album.
+coppermineUploadOk = De afbeeldingen zijn succesvol geplaatst op de server, in het geslecteerde album. \n\nKlik OK om bestandsnamen en opmerkingen te koppelen aan deze afbeeldingen.\n\nVergeet niet om op de knop \u2018Wijzigingen toepassen\u2019 te drukken!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Afbeelding '%1$s' is te groot. Het zal ongewijzigd geupload worden (geen rotatie, formaatwijziging...).
+notAPicture = Bestand '%1$s' is geen afbeelding. Het bestand is niet toegevoegd aan de lijst van uploads.
+
+#PictureDialog
+buttonClose = Sluiten
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_pl.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_pl.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_pl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Polish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = polish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Przegl\u0105daj ...
+buttonRemoveSelected = Usu\u0144 zaznaczone
+buttonRemoveAll = Usu\u0144 wszystkie
+buttonRotateLeft = Obr\u00f3\u0107 w lewo
+buttonRotateRight = Obr\u00f3\u0107 w prawo
+buttonUpload = Prze\u015blij
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Uruchamianie transferu %1$d/%2$d
+infoUploading = Przesy\u0142anie plik\u00f3w %1$s
+infoUploaded = Plik(i) %1$s przes\u0142ane. Oczekiwanie na odpowied\u017a serwera ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d pliki przes\u0142ane
+errDuringUpload = Przesy\u0142anie przerwane z powodu b\u0142\u0119d\u00f3w
+errHttpResponse = Nie oczekiwana odpowied\u017a serwera HTTP. Przesy\u0142anie przerwane.
+questionSendMailOnError = W czasie przesy\u0142ania pojawi\u0142 si\u0119 b\u0142\u0105d. Czy chcesz przes\u0142a\u0107 do administratora informacje dotycz\u0105ce okoliczno\u015bci awarii?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nazwa
+colSize = Wielko\u015b\u0107
+colDirectory = Katalog
+colModified = Czas
+colReadable = Dost\u0119pny?
+errForbiddenExtension = Ulovlig filending.
+
+#DefaultUploadPolicy
+errDuringLogManagement = B\u0142\u0105d w czasie zarz\u0105dzania logiem
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosz\u0119 najpierw wybra\u0107 album..
+coppermineUploadOk = Zdj\u0119cia z wybranego albumu zosta\u0142y pomy\u015blnie przes\u0142ane na serwer. \n\nNaci\u015bnij przycisk Ok aby doda\u0107 nazwy i komentarze do tych zdj\u0119\u0107. \n\nNie zapomnij nacisn\u0105\u0107 przycisku 'Zapisz modyfikacj\u0119' aby zachowa\u0107 zmiany na serwerze !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Zdj\u0119cie '%1$s' jest za du\u017ce. Zostanie przes\u0142ane bez zmian (bez obracania, zmiany rozmiaru ...).
+notAPicture = Plik o nazwie '%1$s' nie jest zdj\u0119ciem. Nie zostanie dodany do listy plik\u00f3w do przes\u0142ania.
+
+#PictureDialog
+buttonClose = Zamknij
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_it.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_it.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_it.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Italian
+contributor = Manuele Grueff mgrueff@atipica.it
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = italian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Sfoglia...
+buttonRemoveSelected = Rimuovi selezionati
+buttonRemoveAll = Rimuovi tutto
+buttonRotateLeft = Ruota a sinistra
+buttonRotateRight = Ruota a destra
+buttonUpload = Carica
+buttonStop = FERMA
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d ore, %2$d min. e %3$d sec.
+timefmt_ms = %1$d min. e %2$d sec.
+timefmt_s = %1$d secondi
+timefmt_unknown = sconosciuto
+status_msg = JUpload %1$d%% eseguito, Velocit&#225;: %2$s, Tempo rimanente: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = La lunghezza del file '%1$s' &#232; eccessiva (%2$s)
+
+#FileUploadThread
+preparingFile = Preparazione file %1$d/%2$d
+infoUploading = Caricamento dei file %1$s
+infoUploaded = File %1$s pubblicato/i. In attesa della risposta del server ...
+infoAborted = Upload interrotto dopo %1$d file.
+nbUploadedFiles = %1$d file pubblicati
+errDuringUpload = Upload bloccato per errori
+errHttpResponse = La risposta del server HTTP ha segnalato un errore. L'upload &#232; fallito.
+questionSendMailOnError = Si &#232; verificato un errore durante l'upload. Vuoi segnalarlo al tuo webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Dimensioni
+colDirectory = Cartella
+colModified = Ultima modifica
+colReadable = Leggibile?
+errForbiddenExtension = Estensione file non consentita.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Si &#232; verificato un errore durante il log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Per favore scegli prima un album.
+coppermineUploadOk = Le immagini sono state caricate correttamente nel server, nell'album selezionato\n\nClicca su Ok per associare nomi e commenti alle immagini.\n\nNon dimenticare di cliccare sul bottone 'Apply modification' per salvare le tue modifiche sul server!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = L'immagine '%1$s' &#232; troppo grande. Sar&#225; caricato senza modifiche (rotazione, ridimensionamento...).
+notAPicture = Il file chiamato '%1$s' non &#232; un'immagine. Non &#232; stato aggiunto alla lista dei files caricati.
+
+#PictureDialog
+buttonClose = Chiudi
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = Gb
+unitMegabytes = Mb
+unitKilobytes = Kb
+
+#sendDebugInformation
+Confirm = Conferma
+
+#InteractiveTrustManager
+itm_title_pass = Inserisci %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = Avviso certificato SSL
+itm_cert_details = Dettagli del certificato:
+itm_cert_subject = Soggetto:
+itm_cert_issuer = Autorit\u00e0 che lo rilascia:
+itm_cert_nbefore = Valido a partire da:
+itm_cert_nafter = Valido fino a:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Nazione (C):
+itm_cert_CN = Common name (CN):
+itm_cert_L = Localit&#225; (L):
+itm_cert_ST = Stato o provincia (ST):
+itm_cert_O = Organizzazione (O):
+itm_cert_OU = Unit\u00e0 organizzazionale (OU):
+itm_reasons = Ragioni:
+itm_reason_cnmatch = Il common name del certificato non corrisponde allo hostname (%1$s).
+itm_reason_itrust = L'autorit\u00e0 che ha rilasciato il certificato non &#232; affidabile.
+itm_reason_expired = Il certificato &#232; scaduto.
+itm_reason_notyet = Il certificato non &#232; ancora valido.
+itm_fail_verify = Non &#232; stato possibile verificare Il certificato fornito dal server.
+itm_accept_prompt = Volete accettare questo certificato?
+itm_accept_always = Sempre
+itm_accept_now = Solo per questa sessione
+itm_accept_no = No
+itm_new_tstore = Nuovo TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_hu.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_hu.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_hu.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hungarian
+contributor = R\u00e9zs\u00f3 G\u00e1bor <gabor.rezso@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hungarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Tall\u00f3z ...
+buttonRemoveSelected = Kiv\u00e1lasztott elt\u00e1vol\u00edt\u00e1sa
+buttonRemoveAll = Mind elt\u00e1vol\u00edt\u00e1sa
+buttonRotateLeft = Forgat balra
+buttonRotateRight = Forgat Jobbra
+buttonUpload = Felt\u00f6lt
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d \u00f3ra, %2$d perc \u00e9s %3$d m\u00e1sodperc.
+timefmt_ms = %1$d perc \u00e9s %2$d m\u00e1sodperc.
+timefmt_s = %1$d m\u00e1sodperc
+timefmt_unknown = ismeretlen
+status_msg = JUpload %1$d%% k\u00e9sz, \u00c1tvitel: %2$s, H\u00e1tral\u00e9v\u0151 id\u0151: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = A '%1$s' m\u00e9ret\u0171 k\u00e9p nagyobb mint a megengedett (%2$s)
+
+#FileUploadThread
+preparingFile = El\u0151k\u00e9sz\u00edt\u00e9s %1$d/%2$d
+infoUploading = K\u00e9pek felt\u00f6lt\u00e9se %1$s
+infoUploaded = %1$s k\u00e9p felt\u00f6ltve. V\u00e1rakoz\u00e1s szerver v\u00e1laszra ...
+infoAborted = Felt\u00f6lt\u00e9s %1$d f\u00e1jl ut\u00e1n megszak\u00edtva.
+nbUploadedFiles = %1$d k\u00e9p felt\u00f6ltve
+errDuringUpload = A felt\u00f6lt\u00e9s hiba miatt le\u00e1llt
+errHttpResponse = A felt\u00f6lt\u00e9s sikertelen: v\u00e1ratlan HTTP hiba
+questionSendMailOnError = A felt\u00f6lt\u00e9s sor\u00e1n hiba t\u00f6rt\u00e9nt. Elk\u00fcldj\u00fck a hibajelent\u00e9st a webmesternek?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e9v
+colSize = M\u00e9ret
+colDirectory = K\u00f6nyvt\u00e1r
+colModified = M\u00f3dos\u00edtva
+colReadable = Olvashat\u00f3?
+errForbiddenExtension = Tiltott kiterjeszt\u00e9s.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Hiba t\u00f6rt\u00e9nt a napl\u00f3z\u00e1s k\u00f6zben
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = El\u0151sz\u00f6r v\u00e1lassz albumot.
+coppermineUploadOk = A k\u00e9pek felt\u00f6lt\u00e9se a megfelel\u0151 albumba sikeres volt.\n\nklikk az OK gombra a nevek be\u00e1ll\u00edt\u00e1s\u00e1hoz.\n\nNe felejts az alkalmaz gombra kattintani az adatok ment\u00e9s\u00e9hez !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = A '%1$s' k\u00e9p m\u00e9rete t\u00fal nagyi. Ez a k\u00e9p m\u00f3dos\u00edt\u00e1s n\u00e9lk\u00fcl ker\u00fcl felt\u00f6lt\u00e9sre(nincs forgat\u00e9s, \u00e1tm\u00e9retez\u00e9s).
+notAPicture = A '%1$s' f\u00e1jl nem k\u00e9p t\u00edpus\u00fa. \u00cdgy nem ker\u00fcl a felt\u00f6lt\u00e9sre v\u00e1r\u00f3 list\u00e1ba.
+
+#PictureDialog
+buttonClose = Bez\u00e1r
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Add meg %1$s jelsz\u00f3t
+itm_prompt_pass = %1$s jelsz\u00f3:
+itm_cert_alert = SSL Bizony\u00edtv\u00e1ny figyelmeztet\u00e9s
+itm_cert_details = Bizony\u00edtv\u00e1ny adatai:
+itm_cert_subject = T\u00e1rgy:
+itm_cert_issuer = Kibocs\u00e1t\u00f3:
+itm_cert_nbefore = Nem kor\u00e1bban:
+itm_cert_nafter = Nem k\u00e9s\u0151bb:
+itm_cert_serial = Sorozatsz\u00e1m:
+itm_cert_fprint = %1$s ujjlenyomat :
+itm_cert_C = Orsz\u00e1g:
+itm_cert_CN = N\u00e9v:
+itm_cert_L = Sz\u00e1rmaz\u00e1s:
+itm_cert_ST = Megye:
+itm_cert_O = Szervezet:
+itm_cert_OU = Szervezeti egys\u00e9g:
+itm_reasons = Ok:
+itm_reason_cnmatch = A bizony\u00edtv\u00e1ny neve nem egyezik a szerver c\u00edm\u00e9vel (%1$s).
+itm_reason_itrust = A bizony\u00edtv\u00e1ny kibocs\u00e1t\u00f3 nem megb\u00edzhat\u00f3.
+itm_reason_expired = A bizony\u00edtv\u00e1ny lej\u00e1rt.
+itm_reason_notyet = A bizony\u00edtv\u00e1ny m\u00e9g nem \u00e9rv\u00e9nyes.
+itm_fail_verify = A bizony\u00edtv\u00e1ny, nem ellen\u0151r\u00edzhet\u0151.
+itm_accept_prompt = Elfogadod a bizony\u00edtv\u00e1nyt?
+itm_accept_always = mindig
+itm_accept_now = csak a jelenlegi munkaf\u00e1zisban
+itm_accept_no = Nem
+itm_new_tstore = \u00daj BizalomT\u00e1r
+itm_tstore = BizalomT\u00e1r
Index: 3thparty/jupload/src/main/resources/lang/lang_no.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_no.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_no.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Norwegian
+contributor = Unkown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = norwegian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bla gjennom ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter venstre
+buttonRotateRight = Roter h\u00f8yre
+buttonUpload = Last opp
+buttonStop = STOPP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d tim., %2$d min. and %3$d sek.
+timefmt_ms = %1$d min. and %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ukjent
+status_msg = JUpload %1$d%% ferdig, overf\u00f8ringshastighet: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Filen '%1$s' er for stor (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Laster opp filer %1$s
+infoUploaded = %1$s fil(er) lastet opp. Venter p\u00e5 serverrespons ...
+infoAborted = Opplasting avbrutt etter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) lastet opp
+errDuringUpload = Opplastingen stoppet med feil
+errHttpResponse = Opplastingen feilet: uventet HTTP respons
+questionSendMailOnError = Det skjedde en feil under opplasting. \u00d8nsker du \u00e5 sende all relevant informasjon til webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Katalog
+colModified = Endret
+colReadable = Lesbar?
+errForbiddenExtension = Ugyldig filetternavn.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Det skjedde en feil under loggbehandlingen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6r vennlig og velg et album f\u00f8rst
+coppermineUploadOk = Bildene har blitt korrekt lastet opp til serveren, i det valgte albumet.\n\nKlikk OK n\u00e5 for \u00e5 fullf\u00f8re opplastingen.\n\nIkke glem \u00e5 lagre eventuelle endringer du har gjort.
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Bilde '%1$s' er for stort. Bildet vil bli lastet opp uten endringer (ingen rotering eller endring av st\u00f8rrelse ...).
+notAPicture = Filen '%1$s' er ikke en gyldig bildefil. Den er ikke lagt til i listen over filer som skal lastes opp.
+
+#PictureDialog
+buttonClose = Lukk
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Bekreft
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_sk.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_sk.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_sk.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovak
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovak
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = H\u013eada\u0165 ...
+buttonRemoveSelected = Odstr\u00e1ni\u0165 Vybran\u00e9
+buttonRemoveAll = Odstr\u00e1ni\u0165 V\u0161etky
+buttonRotateLeft = Oto\u010di\u0165 v\u013eavo
+buttonRotateRight = Oto\u010di\u0165 vpravo
+buttonUpload = Odosla\u0165
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. a %3$d sec.
+timefmt_ms = %1$d min. a %2$d sec.
+timefmt_s = %1$d sek\u00fand
+timefmt_unknown = nezn\u00e1my
+status_msg = JUpload %1$d%% hotovo, R\u00fdchlos\u0165 prenosu: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ve\u013ekos\u0165 s\u00faboru pre '%1$s' je prive\u013ek\u00e1 (%2$s)
+
+#FileUploadThread
+preparingFile = Pripravujem s\u00fabor %1$d/%2$d
+infoUploading = Odosielam s\u00fabory %1$s
+infoUploaded = %1$s s\u00fabor(y/ov) odoslan\u00fdch. \u010cak\u00e1 sa na odpove\u010f servera ...
+infoAborted = Odosielanie zru\u0161en\u00e9 po %1$d S\u00fabore(och).
+nbUploadedFiles = %1$d s\u00fabor(y/ov) odoslan\u00fdch
+errDuringUpload = Odosielanie zastaven\u00e9 chybami
+errHttpResponse = Odosielanie ne\u00faspe\u0161n\u00e9: neo\u010dak\u00e1van\u00e1 HTTP odpove\u010f
+questionSendMailOnError = Po\u010das odosielania sa vyskytla chyba. Chcete zasla\u0165 potrebn\u00e9 inform\u00e1cie spr\u00e1vcovi str\u00e1nok?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zov
+colSize = Ve\u013ekos\u0165
+colDirectory = Adres\u00e1r
+colModified = Zmenen\u00e9
+colReadable = \u010citate\u013en\u00e9?
+errForbiddenExtension = Nepovolen\u00e1 koncovka s\u00faboru.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Pros\u00edm, vyberte najsk\u00f4r album.
+coppermineUploadOk = Obr\u00e1zky boli v poriadku nahrat\u00e9 na server, do vybran\u00e9ho albumu.\n\nKliknite na OK, pre doplnenie n\u00e1zvov a koment\u00e1rov k t\u00fdmto obr\u00e1zkom.\n\nNezabudnite klikn\u00fa\u0165 na tla\u010didlo 'Vykona\u0165 zmeny' pre ulo\u017eenie va\u0161ich zmien na server !
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zok '%1$s' je pr\u00edli\u0161 ve\u013ek\u00fd. Bude odoslan\u00fd bez zmien (bez oto\u010den\u00ed, zmeny rozmerov...).
+notAPicture = S\u00fabor s n\u00e1zvom '%1$s' nie je obr\u00e1zok. Nie je preto pridan\u00fd do zoznamu s\u00faborov na odoslanie.
+
+#PictureDialog
+buttonClose = Zatvori\u0165
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi\u0165
+
+#InteractiveTrustManager
+itm_title_pass = Vlo\u017ei\u0165 %1$s heslo
+itm_prompt_pass = %1$s heslo:
+itm_cert_alert = Upozornenie SSL Certifik\u00e1tu
+itm_cert_details = Detaily certifik\u00e1tu:
+itm_cert_subject = Predmet:
+itm_cert_issuer = Vydavate\u013e:
+itm_cert_nbefore = Platn\u00fd od:
+itm_cert_nafter = Platn\u00fd do:
+itm_cert_serial = S\u00e9riov\u00e9 \u010d\u00edslo:
+itm_cert_fprint = %1$s Otla\u010dok prsta:
+itm_cert_C = Krajina:
+itm_cert_CN = \u0160tandardn\u00fd n\u00e1zov:
+itm_cert_L = Lokalita:
+itm_cert_ST = \u0160t\u00e1t \u010di provincia:
+itm_cert_O = Organiz\u00e1cia:
+itm_cert_OU = Organizational unit:
+itm_reasons = D\u00f4vod(y):
+itm_reason_cnmatch = \u0160tandardn\u00fd n\u00e1zov certifik\u00e1tu nezodpoved\u00e1 n\u00e1zvu hostu (%1$s).
+itm_reason_itrust = Vydavate\u013e certifik\u00e1tu nie je d\u00f4veryhodn\u00fd.
+itm_reason_expired = Platnos\u0165 certifik\u00e1tu vypr\u0161ala.
+itm_reason_notyet = Certifik\u00e1t e\u0161te nie je platn\u00fd.
+itm_fail_verify = Certifik\u00e1t prijat\u00fd od serveru nebolo mo\u017en\u00e9 overi\u0165.
+itm_accept_prompt = Chcete prija\u0165 tento certifik\u00e1t?
+itm_accept_always = V\u017edy
+itm_accept_now = Iba pre tentokr\u00e1t
+itm_accept_no = Nie
+itm_new_tstore = Nov\u00fd TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_sl.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_sl.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_sl.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovenian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovenian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = I\u0161\u010di ...
+buttonRemoveSelected = Odstrani ozna\u010dene
+buttonRemoveAll = Odstrani vse
+buttonRotateLeft = Zasukaj levo
+buttonRotateRight = Zasukaj desno
+buttonUpload = Nalo\u017ei
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Datoteka v pripravi %1$d/%2$d
+infoUploading = Nalaganje datotek %1$s
+infoUploaded = Datoteke %1$s so nalo\u017eene. \u010cakam na odziv stre\u017enika ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d datoteke so nalo\u017eene
+errDuringUpload = Nalaganje zaustavljeno zaradi napake
+errHttpResponse = HTTP odgovor stre\u017enika ne ustreza kriterijem. Nalaganje se ni posre\u010dilo.
+questionSendMailOnError = Med nalaganjem je pri\u0161lo do napake. \u017delite to informacijo poslati skrbniku strani?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Velikost
+colDirectory = Mapa
+colModified = Spremenjeno
+colReadable = Berljivo?
+errForbiddenExtension = Napa\u010dna kon\u010dnica datoteke.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Med prijavo je pri\u0161lo do napake
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosim, najprej izberi album.
+coppermineUploadOk = Slike so se pravilno nalo\u017eile v izbrani album.\n\nKlikni OK za objavo imen in komentarjev k slikam.\n\nNe pozabi klikniti na gumb 'Upo\u0161tevaj spremembo'. Le tako bodo spremembe shranjene na stre\u017eniku!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Slika '%1$s' je prevelika. Nalo\u017eena bo brez sprememb (brez zasuka, spremembe velikosti ...).
+notAPicture = Datoteka z imenom '%1$s' ni slika in ni vklju\u010dena na seznam datotek za nalaganje.
+
+#PictureDialog
+buttonClose = Zapri
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = English (default language file)
+contributor = Core translation file (no contributor)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+dialogUploadRetryTitle = Retry the upload?
+buttonDetails = Details
+buttonYes = Yes
+buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#SuperSimpleUploadPolicy
+dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_ro.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_ro.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_ro.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Romanian (idem to Moldova)
+contributor = Adrian (nickname: ady1503) (mail: gallery@butnarumd.com)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = romanian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = R\u0103sfoire ...
+buttonRemoveSelected = \u00cenl\u0103tura\u0163i selectat
+buttonRemoveAll = Elimin\u0103 Tot
+buttonRotateLeft = Rotire st\u00eenga
+buttonRotateRight = Rotire dreapta
+buttonUpload = \u00cencarc\u0103
+buttonStop = OPRE\u015eTE
+messageLogWindowCopiedToClipboard = Mesaje de depanare au fost copiate \u00een clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d secunde
+timefmt_unknown = ne\u015ftiut
+status_msg = JUpload %1$d%% a terminat, rat\u0103 de transfer: %2$s, ETA: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Lungimea de fi\u015fier pentru '%1$s' este prea mare (%2$s)
+
+#FileUploadThread
+preparingFile = Pregatirea de fi\u015fier %1$d/%2$d
+infoUploading = \u00cenc\u0103rcare de fi\u015fiere %1$s
+infoUploaded = %1$s fi\u015fier(e) \u00eenc\u0103rcate. \u00cen a\u015fteptare pentru r\u0103spunsul serverului ...
+infoAborted = \u00cenc\u0103rcare oprit\u0103 dup\u0103 %1$d Fi\u015fier(e).
+nbUploadedFiles = %1$d fi\u015fier(e) \u00eenc\u0103rcate
+errDuringUpload = \u00cenc\u0103rcare oprit\u0103 cu erori
+errHttpResponse = \u00cenc\u0103rcare e\u015fuat\u0103: r\u0103spuns nea\u015fteptat HTTP
+questionSendMailOnError = A ap\u0103rut o eroare \u00een timpul \u00eenc\u0103rc\u0103rii. Vrei s\u0103 trimit\u0103 toate informa\u0163iile relevante pentru webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = A ap\u0103rut urm\u0103toarea eroare \u00een timpul \u00eenc\u0103rc\u0103rii:\n%1$s\n\nVrei s\u0103 mergi mai departe cu \u00eenc\u0103rcare curent\u0103?
+
+#FilePanelDataModel
+colName = Nume
+colSize = Volum
+colDirectory = Director
+colModified = Modificat
+colReadable = Poate fi citit?
+errForbiddenExtension = Interzis\u0103 extensiunea de fi\u015fier.
+
+#DefaultUploadPolicy
+errDuringLogManagement = O eroare a ap\u0103rut \u00een timpul de gestionare a \u00eenregistr\u0103rii
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u0103 rug\u0103m, alege\u0163i un album prima dat\u0103.
+coppermineUploadOk = Fotografiile au fost corect \u00eenc\u0103rcate pe server, \u00een albumul selectat.\n\nFace\u0163i clic pe OK acum pentru a asocia numele \u015fi comentariile la aceste imagini.\n\nNu uita\u0163i s\u0103 face\u0163i clic pe butonul 'Apply modification button' pentru a salva modific\u0103rile dvs. de pe server!
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = Imaginea '%1$s' este prea mare. Acesta va fi \u00eenc\u0103rcat\u0103 neschimbat\u0103 (f\u0103r\u0103 rota\u0163ie, redimensionare ...).
+notAPicture = Fi\u015fier numit '%1$s' nu este o imagine. El nu se adaug\u0103 la lista de fi\u015fiere care urmeaz\u0103 s\u0103 fie \u00eenc\u0103rcate.
+
+#PictureDialog
+buttonClose = \u00cenchide
+
+#DateRenderer
+dateformat = hh:mm dd-MM-yyyy aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = Confirma\u0163i
+
+#InteractiveTrustManager
+itm_title_pass = Introduce\u0163i %1$s parola
+itm_prompt_pass = %1$s parola:
+itm_cert_alert = SSL Certificat alert\u0103
+itm_cert_details = Detaliile certificatului:
+itm_cert_subject = Subiect:
+itm_cert_issuer = Emitentul:
+itm_cert_nbefore = Nu \u00eenainte de:
+itm_cert_nafter = Nu dup\u0103:
+itm_cert_serial = Serie:
+itm_cert_fprint = %1$s Amprent\u0103 digital\u0103:
+itm_cert_C = \u0162ar\u0103:
+itm_cert_CN = Nume comun:
+itm_cert_L = Localitatea:
+itm_cert_ST = Statul sau provincia:
+itm_cert_O = Organiza\u0163ia:
+itm_cert_OU = Unitate organiza\u0163ional\u0103:
+itm_reasons = Motiv(e):
+itm_reason_cnmatch = Certificatul cu denumirea comun\u0103 nu se potrive\u015fte cu numele de host (%1$s).
+itm_reason_itrust = Emitentului Certificatul nu este de \u00eencredere.
+itm_reason_expired = Certificatul este expirat.
+itm_reason_notyet = Certificatul nu este \u00eenc\u0103 valabil.
+itm_fail_verify = Certificatul, prezentat de server nu a putut fi verificat.
+itm_accept_prompt = Dori\u0163i s\u0103 accepta\u0163i acest certificat?
+itm_accept_always = \u00centotdeauna
+itm_accept_now = Numai pentru aceast\u0103 sesiune
+itm_accept_no = Nu
+itm_new_tstore = Nou TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/src/main/resources/lang/lang_zh.properties
===================================================================
--- 3thparty/jupload/src/main/resources/lang/lang_zh.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/lang/lang_zh.properties	(revision 3951)
@@ -0,0 +1,157 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/main/lang.utf-16/ directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the ./wwwroot/translation/build_translation.xml ant script.
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+#MISSING  menuitem_paste = Paste
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#SuperSimpleUploadPolicy
+#MISSING  dragDirectoriesAndFilesToHere = Drag directories an files to here
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/src/main/resources/conf/svn.properties
===================================================================
--- 3thparty/jupload/src/main/resources/conf/svn.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/conf/svn.properties	(revision 3951)
@@ -0,0 +1,17 @@
+
+# JUpload version
+jupload.version = ${pom.version}
+
+# Date of the compilation
+jupload.buildTimestamp = ${timestamp}
+
+#Build number. Allows to identify each build. Reset to 1, after a clean
+jupload.buildNumber = ${buildNumber}
+
+#Last revision commited. This compilation may contain other uncommitted changes.
+jupload.svn.revision = ${svn.revision}
+
+#Date of the last src directory commit. 
+#Caution: file by file commit doesn't change this date.
+jupload.lastSrcDirModificationDate = A source modification date
+		
Index: 3thparty/jupload/src/main/resources/conf/default_daemon.properties
===================================================================
--- 3thparty/jupload/src/main/resources/conf/default_daemon.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/conf/default_daemon.properties	(revision 3951)
@@ -0,0 +1,6 @@
+#
+# This file contains default values for the daemon JUpload. These default values override the
+# default values defined in UploadPolicy, due to the specific needs of a standalone application
+#
+
+readCookieFromNavigator = false
Index: 3thparty/jupload/src/main/resources/conf/mimetypes.properties
===================================================================
--- 3thparty/jupload/src/main/resources/conf/mimetypes.properties	(revision 3951)
+++ 3thparty/jupload/src/main/resources/conf/mimetypes.properties	(revision 3951)
@@ -0,0 +1,226 @@
+#
+#This mime type list comes from the following site:
+# http://www.mimetype.org/
+#
+# Thanks to them!
+#
+# etienne_sf, 12 march 2010: add of Office 2007 support (thanks to jsibby)
+stl=application/SLA
+step=application/STEP
+stp=application/STEP
+dwg=application/acad
+ez=application/andrew-inset
+ccad=application/clariscad
+drw=application/drafting
+tsp=application/dsptype
+dxf=application/dxf
+xls=application/excel
+unv=application/i-deas
+jar=application/java-archive
+hqx=application/mac-binhex40
+cpt=application/mac-compactpro
+pot=application/mspowerpoint
+pps=application/mspowerpoint
+ppt=application/mspowerpoint
+ppz=application/mspowerpoint
+doc=application/msword
+bin=application/octet-stream
+class=application/octet-stream
+dms=application/octet-stream
+exe=application/octet-stream
+lha=application/octet-stream
+lzh=application/octet-stream
+oda=application/oda
+ogg=application/ogg
+ogm=application/ogg
+pdf=application/pdf
+pgp=application/pgp
+ai=application/postscript
+eps=application/postscript
+ps=application/postscript
+prt=application/pro_eng
+rtf=application/rtf
+set=application/set
+smi=application/smil
+smil=application/smil
+sol=application/solids
+vda=application/vda
+mif=application/vnd.mif
+xlc=application/vnd.ms-excel
+xll=application/vnd.ms-excel
+xlm=application/vnd.ms-excel
+xls=application/vnd.ms-excel
+xlw=application/vnd.ms-excel
+cod=application/vnd.rim.cod
+arj=application/x-arj-compressed
+bcpio=application/x-bcpio
+vcd=application/x-cdlink
+pgn=application/x-chess-pgn
+cpio=application/x-cpio
+csh=application/x-csh
+deb=application/x-debian-package
+dcr=application/x-director
+dir=application/x-director
+dxr=application/x-director
+dvi=application/x-dvi
+pre=application/x-freelance
+spl=application/x-futuresplash
+gtar=application/x-gtar
+gz=application/x-gunzip
+gz=application/x-gzip
+hdf=application/x-hdf
+ipx=application/x-ipix
+ips=application/x-ipscript
+js=application/x-javascript
+skd=application/x-koan
+skm=application/x-koan
+skp=application/x-koan
+skt=application/x-koan
+latex=application/x-latex
+lsp=application/x-lisp
+scm=application/x-lotusscreencam
+mif=application/x-mif
+bat=application/x-msdos-program
+com=application/x-msdos-program
+exe=application/x-msdos-program
+cdf=application/x-netcdf
+nc=application/x-netcdf
+pl=application/x-perl
+pm=application/x-perl
+rar=application/x-rar-compressed
+sh=application/x-sh
+shar=application/x-shar
+swf=application/x-shockwave-flash
+sit=application/x-stuffit
+sv4cpio=application/x-sv4cpio
+sv4crc=application/x-sv4crc
+tar.gz=application/x-tar-gz
+tgz=application/x-tar-gz
+tar=application/x-tar
+tcl=application/x-tcl
+tex=application/x-tex
+texi=application/x-texinfo
+texinfo=application/x-texinfo
+man=application/x-troff-man
+me=application/x-troff-me
+ms=application/x-troff-ms
+roff=application/x-troff
+t=application/x-troff
+tr=application/x-troff
+ustar=application/x-ustar
+src=application/x-wais-source
+zip=application/x-zip-compressed
+zip=application/zip
+tsi=audio/TSP-audio
+au=audio/basic
+snd=audio/basic
+kar=audio/midi
+mid=audio/midi
+midi=audio/midi
+mp2=audio/mpeg
+mp3=audio/mpeg
+mpga=audio/mpeg
+au=audio/ulaw
+aif=audio/x-aiff
+aifc=audio/x-aiff
+aiff=audio/x-aiff
+m3u=audio/x-mpegurl
+wax=audio/x-ms-wax
+wma=audio/x-ms-wma
+rpm=audio/x-pn-realaudio-plugin
+ram=audio/x-pn-realaudio
+rm=audio/x-pn-realaudio
+ra=audio/x-realaudio
+wav=audio/x-wav
+pdb=chemical/x-pdb
+xyz=chemical/x-pdb
+ras=image/cmu-raster
+gif=image/gif
+ief=image/ief
+jpe=image/jpeg
+jpeg=image/jpeg
+jpg=image/jpeg
+png=image/png
+tif tiff=image/tiff
+tif=image/tiff
+tiff=image/tiff
+ras=image/x-cmu-raster
+pnm=image/x-portable-anymap
+pbm=image/x-portable-bitmap
+pgm=image/x-portable-graymap
+ppm=image/x-portable-pixmap
+rgb=image/x-rgb
+xbm=image/x-xbitmap
+xpm=image/x-xpixmap
+xwd=image/x-xwindowdump
+iges=model/iges
+igs=model/iges
+mesh=model/mesh
+msh=model/mesh
+silo=model/mesh
+vrml=model/vrml
+wrl=model/vrml
+css=text/css
+htm=text/html
+html htm=text/html
+html=text/html
+asc txt=text/plain
+asc=text/plain
+c=text/plain
+cc=text/plain
+f90=text/plain
+f=text/plain
+h=text/plain
+hh=text/plain
+m=text/plain
+txt=text/plain
+rtx=text/richtext
+rtf=text/rtf
+sgm=text/sgml
+sgml=text/sgml
+tsv=text/tab-separated-values
+jad=text/vnd.sun.j2me.app-descriptor
+etx=text/x-setext
+xml=text/xml
+dl=video/dl
+fli=video/fli
+flv=video/flv
+gl=video/gl
+mp2=video/mpeg
+mpe=video/mpeg
+mpeg=video/mpeg
+mpg=video/mpeg
+mov=video/quicktime
+qt=video/quicktime
+viv=video/vnd.vivo
+vivo=video/vnd.vivo
+fli=video/x-fli
+asf=video/x-ms-asf
+asx=video/x-ms-asx
+wmv=video/x-ms-wmv
+wmx=video/x-ms-wmx
+wvx=video/x-ms-wvx
+avi=video/x-msvideo
+movie=video/x-sgi-movie
+mime=www/mime
+ice=x-conference/x-cooltalk
+vrm=x-world/x-vrml
+vrml=x-world/x-vrml
+
+#JTS: Support for Office 2007
+docm=application/vnd.ms-word.document.macroEnabled.12
+docx=application/vnd.openxmlformats-officedocument.wordprocessingml.document
+dotx=application/vnd.openxmlformats-officedocument.wordprocessingml.template
+potm=application/vnd.ms-powerpoint.template.macroEnabled.12
+potx=application/vnd.openxmlformats-officedocument.presentationml.template
+ppam=application/vnd.ms-powerpoint.addin.macroEnabled.12
+ppsm=application/vnd.ms-powerpoint.slideshow.macroEnabled.12
+ppsx=application/vnd.openxmlformats-officedocument.presentationml.slideshow
+pptm=application/vnd.ms-powerpoint.presentation.macroEnabled.12
+pptx=application/vnd.openxmlformats-officedocument.presentationml.presentation
+xlam=application/vnd.ms-excel.addin.macroEnabled.12
+xlsb=application/vnd.ms-excel.sheet.binary.macroEnabled.12
+xlsm=application/vnd.ms-excel.sheet.macroEnabled.12
+xlsx=application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
+xltm=application/vnd.ms-excel.template.macroEnabled.12
+xltx=application/vnd.openxmlformats-officedocument.spreadsheetml.template
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/turkish.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/turkish.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/turkish.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Bu iÅlemi yapmaya yetkili deÄilsiniz.<BR><BR>EÄer baÄlÄ± deÄilseniz lÃŒtfen Ã¶nce <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">giriÅ yapÄ±n</a>',
+		  'select_album' => 'LÃŒtfen resimleri gÃ¶ndereceÄiniz albÃŒmÃŒ seÃ§iniz. ',
+		  'button_update_album' => 'AlbÃŒmÃŒ gÃŒncelle',
+		  'button_create_album' => 'AlbÃŒm Yarat',
+		  'success' => 'Ä°Ålem BaÅarÄ±lÄ± !',
+		  'error_select_album' => 'LÃŒtfen Ã¶nce albÃŒm seÃ§iniz',
+		  'error_album_name' => 'LÃŒtfen AlbÃŒm adÄ±nÄ± girin.',
+		  'error_album_already_exists' => 'Bu isimde bir albÃŒm zaten var<BR><BR>AlbÃŒmÃŒnÃŒze baÅka bir isim vermek iÃ§in lÃŒtfen tarayÄ±cÄ±nÄ±zdaki <I>Geri</I> dÃŒÄmesine basÄ±nÄ±z.',
+		  'album_name' => 'AlbÃŒm adÄ±',
+		  'album_presentation' => 'Burada bir albÃŒm seÃ§melisiniz. GÃ¶ndereceÄiniz resimler sunucuda bu albÃŒm iÃ§erisine kaydedilecektir. <BR>EÄer bir albÃŒmÃŒnÃŒz yoksa albÃŒm listesi boÅ gÃ¶zÃŒkecektir. Ãnce \'Yarat\' dÃŒÄmesine basÄ±p ilk albÃŒmÃŒnÃŒzÃŒ yaratabilirsiniz.',
+		  'album_description' => 'AlbÃŒm tanÄ±mÄ±',
+		  'add_pictures' => 'SeÃ§ili albÃŒme resim ekle',
+		  'max_upload_size' => 'Maksimum resim boyutu: $1 Ko',
+		  'upload_presentation' => 'EÄer aÅaÄÄ±daki kare appleti gÃ¶stermiyor ve tarayÄ±cÄ±nÄ±z sayfada sÃŒrekli olarak hata mesajlarÄ± veriyorsa, java runtime plugin\'i yÃŒklemek gerekecektir..<BR>SonrasÄ±nda gÃ¶nderim gerÃ§ekten basit olacaktÄ±r! <B>GÃ¶zat</B> a basÄ±p dosyalarÄ± seÃ§in ya da dosyalarÄ± bilgisaranÄ±zdan sÃŒrÃŒkleyip bÄ±rakÄ±n. SonrasÄ±nda <B> GÃ¶nder </B> e basÄ±p resimleri sunucuya gÃ¶nderin.'
+		  	. "<BR><U>Eski gÃ¶nderim sayfasÄ±</U>nÄ± kullanmak iÃ§in, <a href='upload.php'>tÄ±klayÄ±nÄ±z</a>.",
+		  'album' => 'AlbÃŒm',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/norwegian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/norwegian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/norwegian.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+	      'link_title' => 'JUpload',
+	      'link_comment' => 'Last opp filer til galleriet, ved hjelp av en applet',    
+	      'perm_denied' => 'Du har ikke tillatelse til Ã¥ utfÃžre den opprasjonen.<BR><BR>Hvis du ikke er innlogget, vÃŠr vennlig og <a href="$1">logg inn</a> fÃžrst',
+	      'select_album' => 'Du mÃ¥ velge et album du Ãžnsker Ã¥ laste opp bilder til',
+	      'button_update_album' => 'Oppdater album',
+	      'button_create_album' => 'Lag album',
+	      'success' => 'Handling utfÃžrt !',
+	      'error_select_album' => 'Du mÃ¥ velge et album fÃžrst',
+	      'error_album_name' => 'Du mÃ¥ gi albumet et navn',
+	      'error_album_already_exists' => 'Det fines allerede et album med dette navnet.<BR><BR>VÃŠr vennlig Ã¥ klikke <I>Tilbake</I> knappen pÃ¥ nettleseren for Ã¥ skrive inn en nytt navn pÃ¥ ditt album.',
+	      'album_name' => 'Album navn',
+	      'album_presentation' => 'Du mÃ¥ velge et album her. Bildene du laster opp vil bli lagret I dette albumet. <BR>Hvis du ikke har et album, er albumlisten tom. Bruk "Lage" knappen til Ã¥ lage ditt fÃžrste album.',
+	      'album_description' => 'Album beskrivelse',
+	      'add_pictures' => 'Legg til bilder i valgte album',
+	      'max_upload_size' => 'Maksimum stÃžrrelse for et bilde er $1 kB',
+	      'upload_presentation' => 'Hvis rammen nedenfor ikke kan vises, og nettleseren indikerer at det er feil pÃ¥ siden, mÃ¥ du installere Java plugin.<BR>Etter dette er opplasting veldig enkelt! Klikk pÃ¥ <B>Bla gjennom</B> for Ã¥ velge filer eller bruk dra og slipp fra filutforskeren, velg sÃ¥ <B>Last opp</B> for Ã¥ sende bildene til nettsiden.'
+	    . "<BR>For Ã¥ bruke <U>den vanlige filopplastingen</U>, <a href='upload.php'>klikk her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din nettleser tillater ikke Java. Opplastingsprogrammet krever Java. Du kan enkelt laste det ned fra <a href="http:\\java.sun.com\jre\">Java nettsidene</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk pÃ¥ denne lenken og fyll inn informasjon i feltene nedenfor, dersom du Ãžnkser at denne skal legges til alle bildene i neste opplasting.',
+		  'quota_used' => 'Du bruker nÃ¥ $1 MB ($2%) av din $3 MB store lagringsplass.',
+		  'quota_about_full' => 'Fjern noen bilder, eller be administrator om Ã¥ gjÃžre kontoen din stÃžrre.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'  	
+		  )
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/english.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/english.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/english.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Upload files to the gallery, with the help of an applet',
+		  'perm_denied' => 'You don\'t have permission to perform this operation.<BR><BR>If you\'re not connected, please <a href="$1">login</a> first',
+		  'select_album' => 'Please, choose an album, where you want to upload pictures',
+		  'button_update_album' => 'Update album',
+		  'button_create_album' => 'Create album',
+		  'success' => 'Action success !',
+		  'error_select_album' => 'Please, choose an album first',
+		  'error_album_name' => 'Please give a name to the album.',
+		  'error_album_already_exists' => 'You already own an album with this name.<BR><BR>Please click on the <I>Back</I> button of your navigator, to type another title for your new album.',
+		  'album_name' => 'Album name',
+		  'album_presentation' => 'You must select an album here. The pictures you\'ll send to the server will be stored in this album. <BR>If you don\'t have any album, the album list is empty. Use the \'Create\' button to create your first album.',
+		  'album_description' => 'Album description',
+		  'add_pictures' => 'Add pictures to the selected album',
+		  'max_upload_size' => 'The maximum size for a picture is $1 KB',
+		  'upload_presentation' => 'If the square below definitely refuses to display the applet, and the navigator indicates that there are errors on this page, a good idea would be to install the java runtime plugin.<BR>After, upload is really simple! Click on <B>Browse</B> to select files or use drag\'n\'drop from the explorer, then click on <B>Upload</B> to send the pictures to the server.'
+		. "<BR>To use the <U>old upload page</U>, <a href='upload.php'>click here</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Click here, to see the URL of the uploaded pictures, contained on this page'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/czech.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/czech.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/czech.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'K provedenÃ­ tÃ©to operace nemÃ¡te dostateÄnÃ¡ oprÃ¡vnÄnÃ­.<BR><BR>Pokud nejste pÅipojen, <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">pÅihlaÅ¡te se</a> prosÃ­m',
+		  'select_album' => 'Vyberte prosÃ­m album, do kterÃ©ho si pÅejete pÅenÃ©st obrÃ¡zky',
+		  'button_update_album' => 'Aktualizovat album',
+		  'button_create_album' => 'VytvoÅit album',
+		  'success' => 'ÃspÄÅ¡nÄ provedeno !',
+		  'error_select_album' => 'Nejprve prosÃ­m vyberte album',
+		  'error_album_name' => 'Zadejte prosÃ­m nÃ¡zev alba.',
+		  'error_album_already_exists' => 'Album s tÃ­mto nÃ¡zvem jiÅŸ vlastnÃ­te.<BR><BR>KliknÄte prosÃ­m na tlaÄÃ­tko<I>ZpÄt</I> vaÅ¡eho prohlÃ­ÅŸeÄe, abyste mohli vyplnit jinÃœ nÃ¡zev vaÅ¡eho novÃ©ho alba.',
+		  'album_name' => 'NÃ¡zev alba',
+		  'album_presentation' => 'Zde musÃ­te vybrat album. ObrÃ¡zky, kterÃ© pÅenesete na server budou uloÅŸeny v tomto albu. <BR>Pokud nemÃ¡te ÅŸÃ¡dnÃ© album, je seznam alb prÃ¡zdnÃœ. PouÅŸijte tlaÄÃ­tko \'VytvoÅit album\' k vytvoÅenÃ­ vaÅ¡eho prvnÃ­ho alba.',
+		  'album_description' => 'Popis alba',
+		  'add_pictures' => 'VloÅŸit obrÃ¡zky do vybranÃ©ho alba',
+		  'max_upload_size' => 'MaximÃ¡lnÃ­ velikost obrÃ¡zku je $1 Ko',
+		  'upload_presentation' => 'Pokud prohlÃ­ÅŸeÄ odmÃ­tÃ¡ zobrazit applet a hlÃ¡sÃ­ na tÃ©to strÃ¡nce chyby, je vhodnÃ© nainstalovat rozÅ¡Ã­ÅenÃ­ java runtime.<BR>PotÃ© je jiÅŸ pÅenos souborÅ¯ opravdu jednoduchÃœ! KlikÅete <B>ProchÃ¡zet</B> pro vÃœbÄr souborÅ¯ nebo pouÅŸijte pÅetaÅŸenÃ­ souborÅ¯ (drag\'n\'drop) z PrÅ¯zkumnÃ­ka, potÃ© kliknÄte <B>PÅenÃ©st</B> k odeslÃ¡nÃ­ obrÃ¡zkÅ¯ na server.'
+		  	. "<BR>Pro pouÅŸitÃ­ <U>pÅ¯vodnÃ­ strÃ¡nky pro pÅenos souborÅ¯</U>, <a href='upload.php'>kliknÄte zde</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+		
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/brazilian_portuguese.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/brazilian_portuguese.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/brazilian_portuguese.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/slovenian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/slovenian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/slovenian.php	(revision 3951)
@@ -0,0 +1,67 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'NimaÅ¡ pooblastil za izvedbo tega opravila.<BR><BR>Äe ni povezave, se najprej <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">prijavi</a>',
+		  'select_album' => 'Prosim, izberi album, v katerega ÅŸeliÅ¡ naloÅŸiti slike',
+		  'button_update_album' => 'OsveÅŸi album',
+		  'button_create_album' => 'Ustvari album',
+		  'success' => 'Postopek je uspel!',
+		  'error_select_album' => 'Prosim, najprej izberi album',
+		  'error_album_name' => 'Prosim, poimenuj album.',
+		  'error_album_already_exists' => 'V galeriji ÅŸe imaÅ¡ album s tem imenom.<BR><BR>Prosim, klikni gumb <I>Nazaj</I> v svojem brskalniku in vpiÅ¡i drugo ime za svoj novi album.',
+		  'album_name' => 'Ime albuma',
+		  'album_presentation' => 'Izbrati moraÅ¡ album, v katerega ÅŸeliÅ¡ naloÅŸiti slike. <BR>Äe albumov ni, je seznam prazen. Uporabi gumb \'Ustvari album\' in ustvari svoj prvi album.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'Dodaj slike v izbrani album',
+		  'max_upload_size' => 'NajveÄja dovoljena velikost slike je $1 KB',
+		  'upload_presentation' => 'Äe se v spodnjem polju ne pokaÅŸe programÄek, brskalnik pa opozarja na napako na strani, moraÅ¡ namestiti <a href=\'http://www.java.com\'>javo</a>.<BR>Uporaba je preprosta! Klikni <B>IÅ¡Äi</B> in izberi datoteke ali pa uporabi \'povleci in spusti\' v raziskovalcu ter nato klikni <B>NaloÅŸi</B> in poÅ¡lji slike na streÅŸnik.'
+		        . "<BR><U>Staro stran za nalaganje</U>, <a href='upload.php'>najdeÅ¡ tukaj</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/polish.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/polish.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/polish.php	(revision 3951)
@@ -0,0 +1,76 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nie masz uprawnieÅ do wykonania tej operacji.<BR><BR>JeÅŒeli nie jesteÅ poÅÄ
+czony, proszÄ siÄ najpierw <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">zalogowaÄ</a>',
+		  'select_album' => 'ProszÄ wybraÄ album, do ktÃ³rego zostanÄ
+ przesÅane pliki',
+		  'button_update_album' => 'Aktualizuj album',
+		  'button_create_album' => 'StwÃ³rz album',
+		  'success' => 'Operacja zakoÅczona sukcesem',
+		  'error_select_album' => 'ProszÄ najpierw wybraÄ album.',
+		  'error_album_name' => 'ProszÄ nazwaÄ album.',
+		  'error_album_already_exists' => 'Istnieje juÅŒ album o takiej nazwie w Twojej kolekcji.<BR><BR>UÅŒyj przycisku <I>PowrÃ³t</I>w Twojej przeglÄ
+darce, aby wpisaÄ innÄ
+ nazwÄ albumu.',
+		  'album_name' => 'Nazwa albumu',
+		  'album_presentation' => 'Musisz teraz wybraÄ album, w ktÃ³rym bÄdÄ
+ przechowywane zdjÄcia, ktÃ³re przeÅlesz na serwer. <BR>JeÅŒeli jeszcze nie utworzyÅeÅ ÅŒadnego albumu, lista albumÃ³w bÄdzie pusta. UyÅŒj przycisku \'StwÃ³rz album\' aby utworzyÄ nowy album.',
+		  'album_description' => 'Opis albumu',
+		  'add_pictures' => 'Dodaj zdjÄcia do wybranego albumu',
+		  'max_upload_size' => 'Maksymalny rozmiar pliku ze zdjÄciem to $1 Ko',
+		'upload_presentation' => 'JeÅŒeli nie moÅŒesz wyÅwietliÄ apletu i przeglÄ
+darka informuje o bÅÄdach na stronie, najprawdopodobniej nie masz zainstalowanego Årodowiska uruchomieniowego Javy (Java JRE).<BR>Jak tylko je zainstalujesz, przesyÅanie plikÃ³w bÄdzie naprawdÄ proste! NaciÅniesz przycisk <B>PrzeglÄ
+daj</B> aby wybraÄ pliki albo po prostu przeciÄ
+gniesz je z menadÅŒera plikÃ³w, potem naciÅniesz przycisk <B>PrzeÅlij</B> i pliki zostanÄ
+ wysÅane na serwer.'
+		  	. "<BR>Aby korzystaÄ ze <U>starej strony przesyÅania</U>, <a href='upload.php'>kliknij tutaj</a>.",
+		  'album' => 'Album'  ,
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/slovak.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/slovak.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/slovak.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Odosielajte sÃºbory do galÃ©rie s pomocou Java appletu',
+		  'perm_denied' => 'NemÃ¡te oprÃ¡vnenie pre vykonanie tejto akcie.<BR><BR>Ak nie ste prihlÃ¡senÃœ, prosÃ­m <a href="$1">prihlÃ¡ste sa</a> najskÃŽr',
+		  'select_album' => 'ProsÃ­m vyberte album, do ktorÃ©ho chcete odoslaÅ¥ obrÃ¡zky',
+		  'button_update_album' => 'UpraviÅ¥ album',
+		  'button_create_album' => 'VytvoriÅ¥ album',
+		  'success' => 'Akcia bola vykonanÃ¡ ÃºspeÅ¡ne !',
+		  'error_select_album' => 'ProsÃ­m, vyberte najskÃŽr album',
+		  'error_album_name' => 'ProsÃ­m, zadajte nÃ¡zov albumu.',
+		  'error_album_already_exists' => 'Album s takÃœmto nÃ¡zvom uÅŸ mÃ¡te.<BR><BR>ProsÃ­m kliknite na tlaÄidlo <I>SpÃ€Å¥</I> na svojom prehliadaÄi, pre napÃ­sanie inÃ©ho nÃ¡zvu vÃ¡Å¡ho novÃ©ho albumu.',
+		  'album_name' => 'NÃ¡zov albumu',
+		  'album_presentation' => 'Tu je potrebnÃ© vybraÅ¥ album. ObrÃ¡zky, ktorÃ© poÅ¡lete server, budÃº uloÅŸenÃ© prÃ¡ve do tohto albumu. <BR>Ak nemÃ¡te vytvorenÃœ album, zoznam albumov je prÃ¡zdny. PouÅŸite tlaÄidlo \'VytvoriÅ¥ album\' na vytvorenie prvÃ©ho albumu.',
+		  'album_description' => 'Popis albumu',
+		  'add_pictures' => 'PridaÅ¥ obrÃ¡zky do vybranÃ©mu albumu',
+		  'max_upload_size' => 'MaximÃ¡lny veÄŸkost obrÃ¡zku mÃŽÅŸe byÅ¥ $1 KB',
+		  'upload_presentation' => 'Ak sa oblasti dole odmietne zobraziÅ¥ applet a prehliadaÄ oznamuje, ÅŸe na strÃ¡nke sa objavili chyby, pravdepodobne potrebujete nainÅ¡talovaÅ¥ java runtime plugin.<BR>Potom je uÅŸ odoslanie jednoduchÃ©! Kliknite na <B>HÄŸadaÅ¥</B> pre zvolenie sÃºborov, alebo ich cez drag\'n\'drop preneste kurzorom, nÃ¡sledne kliknite na <B>OdoslaÅ¥</B> pre odoslanie sÃºborov na server.'
+		. "<BR>Pre pouÅŸitie <U>starej strÃ¡nky pre upload</U>, <a href='upload.php'>kliknite sem</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'VÃ¡Å¡ prehliadaÄ nepodporuje Javu. Applet pre odosielanie vyÅŸaduje Javu. MÃŽÅŸete si ju zdarma stiahnuÅ¥ zo <a href="http:\\java.sun.com\jre\">strÃ¡nok Javy</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Kliknite na tento odkaz a vyplÅte informÃ¡cie do polÃ­Äok dole, ak chcete aby boli pouÅŸitÃ© na vÅ¡etky obrÃ¡zky v ÄalÅ¡om odoslanÃ­.',
+		  'quota_used' => 'AktuÃ¡lne puÅŸÃ­vate $1 MB ($2%) z $3 MB vÃ¡Å¡ho priestoru.',
+		  'quota_about_full' => 'OdstrÃ¡Åte nejakÃ© obrÃ¡zky, alebo poÅŸiadajte administrÃ¡tora aby vÃ¡m poskytol viac priestoru.',
+		  //Since 3.2.0
+		  'need_approval' => 'OdoslanÃ© obrÃ¡zky sa zobrazia v galÃ©rii aÅŸ po potvrdenÃ­ administrÃ¡torom galÃ©rie.'
+		)
+	);
+}
+
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/croatian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/croatian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/croatian.php	(revision 3951)
@@ -0,0 +1,67 @@
+﻿<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File croatian.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nedostaju prava za izvršenje.<BR><BR>Prijaviti se možete <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ovdje</a>.',
+		  'select_album' => 'Molimo izaberite album u koji želite spremiti slike.',
+		  'button_update_album' => 'Osvježi album',
+		  'button_create_album' => 'Otvori novi album',
+		  'success' => 'Uspješno izvršeno!',
+		  'error_select_album' => 'Molim prvo izaberite album',
+		  'error_album_name' => 'Molim upišite ime albuma.',
+		  'error_album_already_exists' => 'Album sa tim imenom već postoji.<BR><BR>Molim kliknite izbornik <I>Nazad</I> u pregledniku te upišite drugo ime albuma.',
+		  'album_name' => 'Naslov albuma',
+		  'album_presentation' => 'Molim izaberite album. Datoteke koje su izabrane za slanje na server biti će pohranjene u ovaj album. <BR>Ako album još ne postoji, izaberite opciju \'Otvori novi album\'.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'Pridruži nove slike albumu',
+		  'max_upload_size' => 'Najveća dopištena veličina slike iznosi $1 KB',
+		  'upload_presentation' => 'Ukoliko se Applet ne prikaže i/ili preglednik vrati grešku, molim provjerite da li koristite zadnju verziju java runtime plugin-a.<BR>Nakon aktualiziranja applet će raditi znatno bolje. Za slanje slika na server kliknite na <B>Pretraži...</B> i izberite datoteke ili \'povucite\' datoteke mišem iz direktorija u applet. Nakon toga kliknite na <B>Pošalji</B> da biste pokrenuli slanje.'
+		  	. "<BR>Ako želite koristiti <U>staru</U> funkciju slanja, kliknite molim <a href='upload.php'>ovdje</a>.",
+		  'album' => 'album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/esperanto.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/esperanto.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/esperanto.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Vi ne rajtas fari tion.<br><br>If vi ne estas konektita, bonvolu <a href="$1">ensaluti</a> unue',
+		  'select_album' => "Bonvolu elekti fotoalbumon, kie vi volas al\u015Duti fotojn",
+		  'button_update_album' => "\u011Cidatigu albumon",
+		  'button_create_album' => 'Kreu albumon',
+		  'success' => 'Sukceso!',
+		  'error_select_album' => 'Bonvolu elekti fotoalbumon unue',
+		  'error_album_name' => 'Bonvolu nomi la fotoalbumon.',
+		  'error_album_already_exists' => 'Vi jam havas albumon kun tiu nomo.<br><br>Bonvolu klaki sur la <i>Reen</i>-butono de via retumilo, por tajpi alian titolon por via nova fotoalbumo.',
+		  'album_name' => 'Albuma nomo',
+		  'album_presentation' => "Vi devas elekti albumon \u0109i tie.  La bildoj kiujn vi sendis al la servilo konservi/u011Dos en \u0109i tiu albumo.<br>Se vi ne havas albumon, la albuma listo estas malplena. Uzu la 'Kreu'-butonon por krei vian unuan albumon.",
+		  'album_description' => 'Albuma priskribo',
+		  'add_pictures' => 'Aldonu bildojn al la elektita albumo',
+		  'max_upload_size' => 'La maksimuma grandeco por bildo estas $1 Kb',
+		  'upload_presentation' => "Se la kvadrato sube rifuzas montri la apleton, kaj la retumilo indikas ke estas eraroj sur la pa/u011Do, bona ideo estus instali la \"Java Runtime Plugin\".<br>Poste, al\u015Dutado simplos! Klaku sur <b>Foliumi</b> por elekti dosierojn a\u016D uzu \"klaktenu kaj metu\" de la retumilo, tiam klaku sur <b>Al\u015Duti</b> por sendi la bildojn al la servilo."
+		  . "<br>Por uzi la <u>malnova al\u015Duta pa/u011Do</u>, <a href='upload.php'>klaku \u0109i tie</a>.",
+		  'album' => 'Albumo',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/persian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/persian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/persian.php	(revision 3951)
@@ -0,0 +1,119 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ ØšÙ Ú¯Ø§ÙØ±Û ØšØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ø§Ø² Ø§ÙŸÙØª Ø¬Ø§ÙØ§',
+		  'perm_denied' => 'ØŽÙ
+Ø§ Ø§Ø¬Ø§Ø²Ù Ø§ÙØ¬Ø§Ù
+ Ø§ÛÙ Ø¹Ù
+ÙÛØ§Øª Ø±Ø§ ÙØ¯Ø§Ø±ÛØ¯.<BR><BR>ÙØ·ÙØ§ Ø§ØšØªØ¯Ø§ <a href="$1">ÙØ§Ø±Ø¯</a> ØŽÙÛØ¯',
+		  'select_album' => 'ÙØ·ÙØ§ Ø¢ÙØšÙÙ
+Û Ø±Ø§ Ú©Ù Ù
+ÛØ®ÙØ§ÙÛØ¯ ØšÙ Ø¢Ù ÙØ§ÛÙ Ø§Ø±Ø³Ø§Ù Ú©ÙÛØ¯ Ø Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯',
+		  'button_update_album' => 'ØšÙ Ø±ÙØ² Ø±Ø³Ø§ÙÛ Ø¢ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÛØ¬Ø§Ø¯ Ø¢ÙØšÙÙ
+',
+		  'success' => 'Ø¹Ù
+ÙÛØ§Øª ØšØ§ Ù
+ÙÙÙÛØª Ø§ÙØ¬Ø§Ù
+ ØŽØ¯!',
+		  'error_select_album' => 'ÙØ·ÙØ§ Ø§ØšØªØ¯Ø§ Ø¢ÙØšÙÙ
+ Ø±Ø§ Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯.',
+		  'error_album_name' => 'ÙØ·ÙØ§ ÙØ§Ù
+ Ø¢ÙØšÙÙ
+ Ø±Ø§ Ù
+ØŽØ®Øµ Ú©ÙÛØ¯.',
+		  'error_album_already_exists' => 'Ø¢ÙØšÙÙ
+Û ØšØ§ Ø§ÛÙ ÙØ§Ù
+ ÙØ¬ÙØ¯ Ø¯Ø§Ø±Ø¯.<BR><BR>ÙØ·ÙØ§ ØšØ± Ø±ÙÛ Ú©ÙÛØ¯ <I>Back</I> Ù
+Ø±ÙØ±Ú¯Ø±ØªØ§Ù Ú©ÙÛÚ© Ú©ÙÛØ¯, ØªØ§ ÙØ§Ù
+ Ø¯ÛÚ¯Ø±Û ØšØ±Ø§Û Ø¢ÙØšÙÙ
+ Ø§ÙØªØ®Ø§Øš ÙÙ
+Ø§ØŠÛØ¯.',
+		  'album_name' => 'ÙØ§Ù
+ Ø¢ÙØšÙÙ
+',
+		  'album_presentation' => 'ØŽÙ
+Ø§ ØšØ§ÛØ¯ Ø¢ÙØšÙÙ
+Û Ø±Ø§ Ø§ÙØªØ®Ø§Øš ÙÙ
+Ø§ØŠÛØ¯. ÙØ§ÛÙÛ Ø±Ø§ Ú©Ù Ø§Ø±Ø³Ø§Ù Ù
+Û Ú©ÙÛØ¯ Ø¯Ø± Ø§ÛÙ Ø¢ÙØšÙÙ
+ ÙØ±Ø§Ø± Ø®ÙØ§ÙØ¯ Ú¯Ø±ÙØª. <BR>Ø§Ú¯Ø± Ø¢ÙØšÙÙ
+Û ÙØ³Ø§Ø®ØªÙ ØšØ§ØŽÛØ¯ ÙÛØ³Øª Ø¢ÙØšÙÙ
+ ÙØ§ Ø®Ø§ÙÛ Ø§Ø³Øª . Ø§Ø² Ú©ÙÛØ¯ \'Ø³Ø§Ø®Øª\' ØšØ±Ø§Û Ø³Ø§Ø®ØªÙ Ø§ÙÙÛÙ Ø§ÙØšÙÙ
+ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯.',
+		  'album_description' => 'ØªÙØ¶ÛØ­Ø§Øª Ø¢ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§ÙØ²ÙØ¯Ù ÙØ§ÛÙ ØšÙ Ø¢ÙØšÙÙ
+ Ø§ÙØªØ®Ø§Øš ØŽØ¯Ù',
+		  'max_upload_size' => 'Ø­Ø¬Ù
+ ØšØ²Ú¯ØªØ±ÛÙ ÙØ§ÛÙ ÙØšØ§ÛØ¯ ØšÛØŽØªØ± Ø§Ø² $1 Ú©ÛÙÙØšØ§ÛØª ØšØ§ØŽØ¯.',
+		  'upload_presentation' => 'Ø§Ú¯Ø± Ø§ÙŸÙØª Ø¬Ø§ÙØ§ Ø¯Ø± Ø²ÛØ± ÙÙ
+Ø§ÛØŽ Ø¯Ø§Ø¯Ù ÙÙ
+Û ØŽÙØ¯ Ù Ù
+Ø±ÙØ±Ú¯Ø± Ø®Ø·Ø§ÛÛ Ø±Ø§ ÙÙ
+Ø§ÛØŽ Ù
+Û Ø¯ÙØ¯ ØšÙØªØ±ÛÙ Ú©Ø§Ø± Ø§ÛÙ Ø§Ø³Øª Ú©Ù java runtime plugin Ø±Ø§ ÙØµØš Ú©ÙÛØ¯.<BR>Ø§Ø±Ø³Ø§Ù ØšØ§ÛÙ ØšØ³ÛØ§Ø± Ø¢Ø³Ø§Ù Ø§Ø³Øª . Ú©Ø§ÙÛ Ø§Ø³Øª ØšØ± Ø±ÙÛ Ú©ÙÛØ¯  <B>Browse</B> Ú©ÙÛÚ© Ú©ÙÛØ¯ Ù ÙØ§ÛÙ Ø±Ø§ Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯ Ù ÛØ§ Ù
+ÛØªÙØ§ÙÛØ¯ ØšØ§ Ù
+ÙØŽÙØ§Ø±Ù ÙØ§ÛÙÙØ§ Ø±Ø§ ØšØ§ Ø¯Ø§Ø®Ù Ø§ÙŸÙØª ØšÚ©ØŽÛØ¯Ù Ø³ÙŸØ³ ØšØ± Ø±ÙÛ Ú©ÙÛØ¯ <B>Upload</B> Ú©ÙÛÚ© Ú©ÙÛØ¯ ØªØ§ ÙØ§ÛÙ Ø§Ø±Ø³Ø§Ù ØŽÙØ¯.'
+		. "<BR>ØšØ±Ø§Û Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ <U>ØšÙ ØŽÛÙÙ ÙØ¯ÛÙ
+Û</U> <a href='upload.php'>Ø§ÛÙØ¬Ø§</a> Ú©ÙÛÚ© Ú©ÙÛØ¯",
+		  'album' => 'Ø¢ÙØšÙÙ
+',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø¬Ø§ÙØ§ Ø¯Ø± Ù
+Ø±ÙØ±Ú¯Ø± ØŽÙ
+Ø§ ØºÛØ± ÙØ¹Ø§Ù ØŽØ¯Ù Ø§Ø³Øª. Ø§ÙŸÙØª Ø¬Ø§ÙØ§ ØšØ±Ø§Û Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ ØšÙ Ø¬Ø§ÙØ§ ÙÛØ§Ø² Ø¯Ø§Ø±Ø¯!. ØšØ±Ø§Û ÙØµØš Ø¬Ø§ÙØ§ Ù
+ÛØªÙØ§ÙÛØ¯ Ø§Ø² <a href="http:\\java.sun.com\jre\">java web site</a> Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯ (Ù
+ØªØ§Ø³ÙØ§ÙÙ Ø§ÛÙ Ø³Ø§ÛØª Ø§Ù
+Ú©Ø§Ù Ø¯Ø±ÛØ§ÙØª ÙØ§ÛÙ ØšØ±Ø§Û Ø§ÛØ±Ø§ÙÛØ§Ù Ø±Ø§ ÙØ±Ø§ÙÙ
+ ÙÙ
+Û Ú©ÙØ¯!)',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/portuguese.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/portuguese.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/portuguese.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/romanian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/romanian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/romanian.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'ÃncÄrcaÅ£i fiÅiere Ã®n galerie, cu ajutorul unui applet',
+		  'perm_denied' => 'Nu aveÅ£i permisiunea de a efectua aceastÄ operaÅ£ie.<BR><BR>DacÄ nu eÅti conectat, vÄ rugÄm sÄ vÄ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '"> autentificaÅ£i </ a> prima datÄ',
+		  'select_album' => 'VÄ rugÄm, alegeÅ£i un album, Ã®n cazul Ã®n care doriÅ£i sÄ Ã®ncÄrcaÅ£i imagini',
+		  'button_update_album' => 'Actualizare album',
+		  'button_create_album' => 'Creare album',
+		  'success' => 'AcÅ£iune cu succes !',
+		  'error_select_album' => 'VÄ rugÄm, alegeÅ£i un album prima datÄ',
+		  'error_album_name' => 'VÄ rugÄm sÄ daÅ£i un nume albumului.',
+		  'error_album_already_exists' => 'AveÅ£i deja un album cu acest nume.<BR><BR>VÄ rugÄm sÄ faceÅ£i clic pe <I>Ãnapoi</I> butonul de Navigator-ul tÄu, pentru a da un alt titlu albumul nou.',
+		  'album_name' => 'Nume album',
+		  'album_presentation' => 'Trebuie sÄ selectaÅ£i un album aici. Imaginile pe care le trimiteÅ£i la server vor fi stocate Ã®n acest album. <BR> DacÄ nu ai nici un album, sau lista de albume este goalÄ. UtilizaÅ£i butonul \'CreaÅ£i\' pentru a crea primul album.',
+		  'album_description' => 'Descriere album',
+		  'add_pictures' => 'AdaugÄ poze la albumul selectat',
+		  'max_upload_size' => 'Dimensiunea maximÄ pentru o imagine este $1 KB',
+		  'upload_presentation' => 'Ãn cazul Ã®n care se refuzÄ categoric pentru a afiÅa appletul pÄtrat de mai jos, Åi navigatorul indicÄ faptul cÄ existÄ erori pe aceastÄ paginÄ, o idee bunÄ ar fi sÄ instalaÅ£i plugin-ul Java Runtime.<a href="http://java.sun.com/" target="_blank">Java&#8482;</a><BR>DupÄ ce, Ã®ncÄrcaÅ£i este foarte simplu! FaceÅ£i clic pe <B>RÄsfoire</B> pentru a selecta fiÅiere sau utilizaÅ£i glisare \'n\' de la explorator, apoi faceÅ£i clic pe <B>ÃncÄrcare</B> pentru a trimite imagini pe server.'
+		. "<BR>Pentru a utiliza <U>pagina de Ã®ncÄrcare veche</U>, <a href='upload.php'>click aici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Navigator tÄu nu permite Java. Ai nevoie de Java Applet. AveÅ£i posibilitatea sÄ descÄrcaÅ£i cu uÅurinÅ£Ä de la <a href="http:\\java.sun.com\jre\">site-ul web de java</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'FaceÅ£i clic pe acest link, Åi introduceÅ£i datele Ã®n cÃ¢mpurile de mai jos, dacÄ doriÅ£i ca acestea sÄ fie aplicate la toate imaginile din Ã®ncÄrcare urmÄtoare.',
+		  'quota_used' => 'Ãn prezent utilizaÅ£i $1 MB ($2%) din $3 MB de volum.',
+		  'quota_about_full' => 'ScoateÅ£i niÅte poze, sau cereÅ£i de la  admin pentru a mÄri cota mai mare.',
+		  //Since 3.2.0
+		  'need_approval' => 'Administradorul Galeriei trebuie sÄ aprobe aceste imagini Ã®ncÄrcate, Ã®nainte de a le putea vedea pe galerie.'
+		)
+	);
+
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/bulgarian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/bulgarian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/bulgarian.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'ÐÑÑÐ·ÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ',
+		  'link_comment' => 'ÐÐ°ÑÐµÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²Ðµ Ð»ÐµÑÐœÐŸ Ðž Ð±ÑÑÐ·ÐŸ',
+		  'perm_denied' => 'ÐÑÐŒÐ°ÑÐµ Ð¿ÑÐ°Ð²Ð° Ð·Ð° ÑÐ°Ð·Ðž ÐŸÐ¿ÐµÑÐ°ÑÐžÑ.<BR><BR>ÐÑÐŸÐ²ÐµÑÐµÑÐµ ÐŽÐ°Ð»Ðž ÑÑÐµ Ð²Ð»ÐµÐ·Ð»Ðž, Ð°ÐºÐŸ ÐœÐµ ÐœÐ°ÑÐžÑÐœÐµÑÐµ:<a href="$1">ÐÑ
+ÐŸÐŽ</a> first',
+		  'select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ ÐºÑÐŽÐµÑÐŸ ÐžÐ·ÐºÐ°ÑÐµ ÐŽÐ° ÐºÐ°ÑÐžÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²ÐµÑÐµ',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²Ðž Ð°Ð»Ð±ÑÐŒÐ°',
+		  'button_create_album' => 'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ',
+		  'success' => 'ÐÐ¿ÐµÑÐ°ÑÐžÑÑÐ° ÑÑÐ¿ÐµÑÐœÐ° !',
+		  'error_select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ',
+		  'error_album_name' => 'ÐÐŸÐ»Ñ ÐŽÐ°Ð¹ÑÐµ ÐžÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°.',
+		  'error_album_already_exists' => 'ÐÐµÑÐµ ÐžÐŒÐ° Ð°Ð»Ð±ÑÐŒ Ñ ÑÐŸÐ²Ð° ÐžÐŒÐµ.<BR><BR>ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <I>Back</I> Ð±ÑÑÐŸÐœ Ð² Ð±ÑÐ°ÑÐ·Ð°ÑÐ°, ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ ÐŽÑÑÐ³ÐŸ ÐžÐŒÐµ Ð·Ð° Ð°Ð»Ð±ÑÐŒÐ° Ð²Ðž.',
+		  'album_name' => 'ÐÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'album_presentation' => 'ÐÐžÐµ ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ. Ð¡ÐœÐžÐŒÐºÐžÑÐµ ÐºÐŸÐžÑÐŸ ÑÑÐµ ÐžÐ·Ð¿ÑÐ°ÑÐžÐ»Ðž ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ° ÑÐµ ÑÐµ ÑÑÑ
+ÑÐ°ÐœÑÐ²Ð°Ñ Ð² ÑÐŸÐ·Ðž Ð°Ð»Ð±ÑÐŒ. <BR>ÐÐºÐŸ ÐœÑÐŒÐ°ÑÐµ ÐœÐžÐºÐ°ÐºÐ²Ðž Ð°Ð»Ð±ÑÐŒÐž, Ð»ÐžÑÑÐ° Ñ Ð°Ð»Ð±ÑÐŒÐž Ð²Ðž Ðµ Ð¿ÑÐ°Ð·ÐµÐœ. ÐÐ·Ð¿ÐŸÐ»Ð·Ð²Ð°Ð¹ÑÐµ \'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ\' Ð±ÑÑÐŸÐœÐ° Ð·Ð° ÐŽÐ° ÑÑÐ·ÐŽÐ°ÐŽÐµÑÐµ Ð²Ð°ÑÐžÑÑ Ð¿ÑÑÐ²Ðž Ð°Ð»Ð±ÑÐŒ.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐµÑÐµ ÑÐœÐžÐŒÐºÐž Ð² ÐžÐ·Ð±ÑÐ°ÐœÐžÑ Ð°Ð»Ð±ÑÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÐœÐžÑ ÑÐ°Ð·ÐŒÐµÑ ÐœÐ° ÑÐœÐžÐŒÐºÐžÑÐµ Ðµ $1 KB',
+		  'upload_presentation' => 'ÐÐºÐŸ ÐœÐµ Ð²Ðž ÑÐµ Ð¿ÐŸÑÐ²ÑÐ²Ð° Ð°Ð¿Ð»ÐµÑÐ° Ð·Ð° ÐºÐ°ÑÐ²Ð°ÐœÐµ ÐžÐ»Ðž ÐžÐŒÐ° ÐœÑÐºÐ°ÐºÐ²Ðž Ð³ÑÐµÑÐºÐž Ð² ÑÑÑÐ°ÐœÐžÑÐ°ÑÐ° Ðµ ÐŽÐŸÐ±ÑÐ° ÐžÐŽÐµÑ ÐŽÐ° Ð¿ÑÐŸÐ²ÐµÑÐžÑÐµ ÐŽÐ°Ð»Ðž ÐžÐŒÐ°ÑÐµ ÐžÐœÑÑÐ°Ð»ÐžÑÐ°Ðœ java runtime plugin.<BR>ÐÐ°ÑÐ²Ð°ÐœÐµÑÑÐŸ Ðµ Ð»ÐµÑÐœÐŸ! ÐÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Browse</B> ÐžÐ·Ð±ÐµÑÐµÑÐµ ÑÐ°Ð¹Ð» ÐžÐ»Ðž ÐžÐ·ÐŽÑÑÐ¿Ð°Ð¹ÑÐµ ÑÐ°Ð¹Ð»Ð° ÐŸÑ ÐµÐºÑÐ¿Ð»ÐŸÑÐµÑÐ°, ÑÐ»ÐµÐŽ ÑÐŸÐ²Ð° ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Upload</B> ÐŽÐ° ÐžÐ·Ð¿ÑÐ°ÑÐžÑÐµ ÑÐœÐžÐŒÐºÐ°ÑÐ° ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ°.'
+		. "<BR>ÐÐ° ÐŽÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ  <U>ÐŽÑÑÐ³ÐžÑ Ð²Ð°ÑÐžÐ°ÐœÑ</U>, <a href='upload.php'>ÐºÐ»ÐžÐºÐœÐµÑÐµ ÑÑÐº</a>.",
+		  'album' => 'ÐÐ»Ð±ÑÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'ÐÐ°ÑÐžÑ Ð±ÑÐ°ÑÐ·ÐµÑ ÐœÐµ Ð¿ÐŸÐŽÑÑÐ¶Ð° Java. ÐÐ° ÐŽÐ° ÑÐ°Ð±ÐŸÑÐž Ð°Ð¿Ð»ÐµÑÐ° Ð²Ðž ÑÑÑÐ±Ð²Ð° Java. ÐÐŸÐ²ÐµÑÐµ Ð»ÐµÑÐœÐŸ ÐŽÐ° Ñ ÑÐ²Ð°Ð»ÐžÑÐµ ÐŸÑ: <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'ÐÐ»ÐžÐºÐœÐµÑÐµ ÐœÐ° ÑÐŸÐ·Ðž Ð»ÐžÐœÐº, Ðž Ð²ÑÐ²ÐµÐŽÐµÑÐµ ÐŽÐ°ÐœÐœÐž Ð² Ð¿ÐŸÐ»ÐµÑÐ°ÑÐ° Ð¿ÐŸ-ÐŽÐŸÐ»Ñ, Ð°ÐºÐŸ ÐžÑÐºÐ°ÑÐµ ÑÐµ ÐŽÐ° ÑÐµ Ð¿ÑÐžÐ»Ð°Ð³Ð°Ñ ÐºÑÐŒ Ð²ÑÐžÑÐºÐž ÑÐœÐžÐŒÐºÐž Ð² ÑÐ»ÐµÐŽÐ²Ð°ÑÐŸÑÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ.',
+		  'quota_used' => 'Ð ÐŒÐŸÐŒÐµÐœÑÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ $1 MB ($2%) ÐŸÑ  $3 MB ÐŽÐžÑÐºÐŸÐ²ÐŸ Ð¿ÑÐŸÑÑÑÐ°ÐœÑÑÐ²ÐŸ.',
+		  'quota_about_full' => 'ÐžÐ·ÑÑÐžÐ¹ÑÐµ ÐœÑÐºÐŸÑ ÑÐœÐžÐŒÐºÐ°, ÐžÐ»Ðž Ð¿ÐžÑÐµÑÐµ ÐœÐ° Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÐŽÐ° Ð²Ðž Ð²ÐŽÐžÐ³ÐœÐµ ÐºÐ²ÐŸÑÐ°ÑÐ°.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÐÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐŸÐŽÐŸÐ±ÑÐž ÐºÐ°ÑÐµÐœÐžÑÐµ ÑÐœÐžÐŒÐºÐž, Ð¿ÑÐµÐŽÐž ÐŽÐ° Ð³Ðž Ð²ÐžÐŽÐžÑÐµ Ð² Ð³Ð°Ð»ÐµÑÐžÑÑÐ°.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/spanish.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/spanish.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/spanish.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// Thanks to jesusangelwork: jesusangelwork[at]users.sourceforge[dot]net
+//  And GecKoTDF (on http://forum.coppermine-gallery.net)
+// ------------------------------------------------------------------------- //
+ 
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Usted no tiene permisos para realizar esta operaciÃ³n.<BR><BR>Si no estÃ¡ conectado, por favor <a href="$1">conÃ©ctese</a> antes',
+		  'select_album' => 'Por favor, seleccione el Ã¡lbum donde desea subir las imÃ¡genes',
+		  'button_update_album' => 'Actualizar Ã¡lbum',
+		  'button_create_album' => 'Crear Ã¡lbum',
+		  'success' => 'ËOperaciÃ³n exitosa!',
+		  'error_select_album' => 'Por favor, seleccione antes un Ã¡lbum',
+		  'error_album_name' => 'Por favor, escriba un nombre para el Ã¡lbum.',
+		  'error_album_already_exists' => 'Ya tiene un Ã¡lbum con este nombre.<BR><BR>Pulse, por favor, sobre el botÃ³n <I>AtrÃ¡s</I> de su navegador para escribir otro tÃ­tulo para su nuevo Ã¡lbum.',
+		  'album_name' => 'Nombre del Ã¡lbum',
+		  'album_presentation' => 'Debe seleccionar un Ã¡lbum. Las imÃ¡genes que envÃ­e al servidor serÃ¡n almacenadas en este Ã¡lbum. <BR>Si no tiene ningÃºn Ã¡lbum, la lista de Ã¡lbumes aparecerÃ¡ vacÃ­a. Utilice el botÃ³n \'Crear\' para crear su primer Ã¡lbum.',
+		  'album_description' => 'DescripciÃ³n del Ã¡lbum',
+		  'add_pictures' => 'AÅadir imÃ¡genes al Ã¡lbum seleccionado',
+		  'max_upload_size' => 'El tamaÅo mÃ¡ximo para una imagen es $1 Ko',
+		  'upload_presentation' => 'Si el applet no aparece en el cuadrado que hay debajo y el navegador indica que se han producido errores en esta pÃ¡gina, serÃ­a buena idea que instalase el plugin de JAVA.<BR>DespuÃ©s de eso, subir las imÃ¡genes serÃ¡ muy sencillo. Pulse sobre <B>Examinar</B> para seleccionar ficheros o utilice arrastrar y soltar desde el explorador de ficheros, despuÃ©s pulse sobre <B>Subir</B> para enviar las imÃ¡genes al servidor.'
+		  	. "<BR>Para usar la <U>antigua pÃ¡gina de carga</U>, <a href='upload.php'>pulse aquÃ­</a>.",
+		  'album' => 'Ãlbum',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Su navegador no soporta Java. Necesita Java. Puede bajarlo desde <a href="http:\\www.java.com/es/download/">el sitio de java.</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Haga click en este link, y ponga la informacion en los campos de abajo, Si quiere que se apliquen en proximas subidas.',
+		  'quota_used' => 'Actualmente usa $1 MB ($2%) de sus $3 MB de almacenamiento.',
+		  'quota_about_full' => 'Sin espacio, borre algunas imagenes, o pidale al administrador mas espacio.',
+		  //Since 3.2.0
+		  'need_approval' => 'El administrador debe autorizar estas imagenes, antes de poder ser vistas en la galeria.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/french.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/french.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/french.php	(revision 3951)
@@ -0,0 +1,75 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Envoyer des fichiers vers la galerie, avec l\'aide d\'une applet',
+		  'perm_denied' => 'Vous n\'avez pas la permission d\'effectuer cette opÃ©ration.<BR><BR>Si vous n\'Ãªtes pas connectÃ©s, <a href="$1">identifiez-vous</a> d\'abord, en cliquant <a href="$1">ici</a> par exemple.',
+		  'select_album' => 'Choisissez un album o&ugrave; envoyer les photos',
+		  'button_update_album' => 'Modifier le nom et/ou la description',
+		  'button_create_album' => 'CrÃ©er un nouvel album',
+		  'success' => 'Action rÃ©ussie !',
+		  'error_select_album' => 'Veuillez d\'abord sÃ©lectionner un album.',
+		  'error_album_name' => 'Veuillez d\'abord donner un nom Ã  l\'album.',
+		  'error_album_already_exists' => 'Vous possÃ©dez dÃ©jÃ  un album avec ce titre.<BR><BR>Cliquez sur le bouton <I>PrÃ©cÃ©dent</I> de votre navigateur pour sÃ©lectionner un autre nom.',
+		  'album_name' => 'Nom de l\'album',
+		  'album_presentation' => 'Vous devez sÃ©lectionner un album. Les images que vous enverrez au serveur seront enregistrÃ©es dans cet album.<BR>Si vous n\'avez pas encore crÃ©Ã© d\'album, la liste est vide. Utilisez alors le bouton \'CrÃ©er\' pour en faire un nouveau.',
+		  'album_description' => 'Description de l\'album',
+		  'add_pictures' => 'Ajouter des images Ã  l\'album sÃ©lectionnÃ©',
+		  'max_upload_size' => 'Le poids maximal autorisÃ© pour une image est de $1 Ko',
+		  'upload_presentation' => "Si la carrÃ© ci-dessous reste dÃ©sespÃ©rÃ©ment blanc, et que la navigateur indique qu'il y a des erreurs sur cette page, une bonne idÃ©e est de cliquer sur <a href=\"http://les.gauthier.free.fr/install/jre-1_5_0_06-windows-i586-p.exe\">ce lien pour installer Java</a>, puis de choisir 'ExÃ©cuter' sur la fenÃªtre qui va s'ouvrir. Laisser vous guider (prendre les options proposÃ©es en standard). <BR> " 
+		  	. "AprÃšs, promis : le transfert des images est super simple ! "
+		  	. "Cliquez sur <B>Choisir des fichiers</B> (ou faites un glisser/dÃ©placer des fichiers images), puis sur <B>Envoyer</B> pour les charger sur le serveur."
+		  	. "<BR>Pour utiliser l'<U>ancienne mÃ©thode</U> d'upload d'image, <a href='upload.php'>cliquez ici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Java n\'est pas installÃ© sur votre ordinateur. L\'applet d\'upload a besoin de java. Vous pouvez facilement l\'installer depuis le <a href="http:\\java.sun.com\jre\">site web de java</a>.',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Cliquez sur ce lien, et entrez des valeurs dans les champs ci-dessous, si vous voulez qu\'elles s\'appliquent Ã  toutes les images du prochain upload (tÃ©lÃ©chargement) de fichiers.',
+		  'quota_used' => 'Vous utilisez actuellement $1 MB ($2%) de votre quota de $3 MB de stockage.',
+		  'quota_about_full' => 'Supprimez des photos, ou demandez une augmentation de votre quota Ã  l\'administrateur.',
+		  //Since 3.2.0
+		  'need_approval' => 'L\'administrateur de la galerie doit approuver les images uploadÃ©es, avant que vous puissiez les voir sur le site.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Cliquez ici, pour voir les URL des images uploadÃ©es, visibles sur cette page'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/danish.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/danish.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/danish.php	(revision 3951)
@@ -0,0 +1,69 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php   in Danish
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du har ikke tilladelse til at udfÃžre denne operation. BR><BR>Hvis du ikke er forbundet, sÃ¥ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">login</a> fÃžrst',
+		  'select_album' => 'VÃŠlg venligst et album, hvori du vil uploade billeder',
+		  'button_update_album' => 'Opdater album',
+		  'button_create_album' => 'Opret album',
+		  'success' => 'Handlingen lykkedes!',
+		  'error_select_album' => 'VÃŠlg venligst et album fÃžrst',
+		  'error_album_name' => 'Giv venligst albummet et navn.',
+		  'error_album_already_exists' => 'Du ejer allerede et album med dette navn.<BR><BR>Klik venligst pÃ¥ <I>Tilbage</I>-knappen i din browser for at skrive en titel pÃ¥ dit nye album.',
+		  'album_name' => 'Albumnavn',
+		  'album_presentation' => 'Du skal vÃŠlge et album her. Billederne du sender til serveren, vil blive gemt i dette album. <BR>Hvis du ikke har et album, er albumlisten tom. Brug âOpretâ-knappen til at oprette dit fÃžrste album.',
+		  'album_description' => 'Albumbeskrivelse',
+		  'add_pictures' => 'TilfÃžj billeder til det valgte album',
+		  'max_upload_size' => 'Den maximale stÃžrrelse for et billede er $1 Kb',
+		  'upload_presentation' => 'Hvis firkanten nedenfor fuldstÃŠnding nÃŠgter at vise appletten, og navigatoren indikerer at der er fejl pÃ¥ denne side, er det en god ide at installere java runtime plugin-et.<BR>NÃ¥r det er gjort, er upload virkelig enkelt ! Klik pÃ¥ <B>SÃžg...</B> for at vÃŠlge filer eller brug trÃŠk-og-slip fra stifinderen. Klik sÃ¥ pÃ¥ <b>Upload</b> for at sende billederne til serveren.'
+		  	. "<BR>For at bruge den <U>gamle uploadside</U>, <a href='upload.php'>klik her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/swedish.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/swedish.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/swedish.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ Maintainer: Erik Lindahl erik@fisensmosse.se
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Ladda upp bilder till galleriet med hjÃ€lp av appleten',
+		  'perm_denied' => 'Du har inte behÃ¶righet att utfÃ¶ra Ã¥tgÃ€rden<BR><BR>Om du inte Ã€r ansluten, <a href="$1">logga in</a> fÃ¶rst',
+		  'select_album' => 'VÃ€lj ett album dÃ€r du vill spara bilderna',
+		  'button_update_album' => 'Uppdatera album',
+		  'button_create_album' => 'Skapa album',
+		  'success' => 'UtfÃ¶rt!',
+		  'error_select_album' => 'VÃ€lj ett album fÃ¶rst',
+		  'error_album_name' => 'Namnge album',
+		  'error_album_already_exists' => 'Du har redan ett album med de namnet.<BR><BR>Klicka pÃ¥ <I>bÃ¥kÃ¥t</I> knappen i webblÃ€saren, fÃ¶r att vÃ€lja ett annat namn.',
+		  'album_name' => 'Album namn',
+		  'album_presentation' => 'Du mÃ¥ste vÃ€lja ett album hÃ€r. Bilderna du laddar upp kommer sparas dÃ€r.<BR>Om du inte har ett album Ã€r listan tom. AnvÃ€nd \'Skapa\' kanppen fÃ¶r att gÃ¶ra ett.',
+		  'album_description' => 'Album fÃ¶rklaring',
+		  'add_pictures' => 'LÃ€gg till bilder i valt album',
+		  'max_upload_size' => 'StÃ¶rsta godkÃ€nda storleken Ã€r $1 KB',
+		  'upload_presentation' => 'Om rutan nedanfÃ¶r inte visar appleten och webblÃ€saren visar att det finns fel mÃ¥ste du installera en Java plugin<BR><BR> FÃ¶r att anvÃ€nda den <U>gamla sidan</U>, <a href="upload.php">tryck hÃ€r</a>.',
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din webblÃ€sare saknar Java, gÃ¥r att ladda ner frÃ¥n <a href="http:\\java.sun.com\jre\">http:\\java.sun.com\jre</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicka pÃ¥ lÃ€nken och fyll i fÃ€lten nedanfÃ¶r. Om du vill att de ska gÃ€lla fÃ¶r alla filer nÃ€sta uppladdning.',
+		  'quota_used' => 'Du anvÃ€nder fÃ¶rnÃ€rvarande $1 MB ($2%) av $3 MB.',
+		  'quota_about_full' => 'Du mÃ¥ste frigÃ¶ra minne, din kvot Ã€r fylld.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/dutch.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/dutch.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/dutch.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'U heft niet voldoende rechten voor deze actie.<BR><BR>Gelieve eerst in te loggen: <a href="$1">login</a>',
+		  'select_album' => 'Selecteer een album waar u de nieuwe bestanden wilt plaatsen',
+		  'button_update_album' => 'Album bijwerken',
+		  'button_create_album' => 'Album aanmaken',
+		  'success' => 'Gereed !',
+		  'error_select_album' => 'Selecteer eerst een album',
+		  'error_album_name' => 'Geef het album eerst een naam.',
+		  'error_album_already_exists' => 'Deze naam is reeds in gebruik. <BR><BR>Druk op de <I>Terug</I> knop van uw browser, en voer een nieuwe naam in.',
+		  'album_name' => 'Album naam',
+		  'album_presentation' => 'U dient hier een album te selecteren. De geselecteerde afbeeldingen zullen aan dit album worden toegevoegd. <BR>Middels de knop \'Album aanmaken\' kunt u nieuwe albums aanmaken.',
+		  'album_description' => 'Album omschrijving',
+		  'add_pictures' => 'Afbeeldingen toevoegen aan het geselecteerde album',
+		  'max_upload_size' => 'De maximale bestandsgrootte is $1 Ko',
+		  'upload_presentation' => 'Als de applet niet weergegeven wordt, kan dit verholpen worden door de java runtime plugin te installeren.<BR>Vervolgens is uploaden zeer eenvoudig! Klik op <B>Bladeren</B> om bestanden te selecteren of gebruik de drag\'n\'drop functionaliteit van de verkenner. Klik vervolgens op <B>Upload</B> om afbeeldingen naar de server te verznden.'
+		  	. "<BR>Om de originele <u>upload-functionaliteit</u> te gebruiken, <a href='upload.php'>klik hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/german_sie.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/german_sie.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/german_sie.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Sie haben keine Berechtigung diesen Vorgang durchzufÃŒhren.<BR><BR>Bitte <a href="$1">melden</a> Sie sich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hlen Sie ein Album, in welches Sie Dateien hochladen mÃ¶chten',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erstellen',
+		  'success' => 'Vorgang erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte geben Sie dem Album einen Namen.',
+		  'error_album_already_exists' => 'Sie haben bereits ein Album mit diesem Namen.<BR><BR>Bitte klicken Sie auf den <I>ZurÃŒck</I> Button ihres Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hlen Sie ein Album. Die Dateien, die Sie hochladen mÃ¶chten, werden in diesem Album gespeichert. <BR>Wenn Sie noch kein Album erstellt haben, dann benutzen Sie bitte die \'Album erzeugen\' Funktion um ihr erstes Album zu erstellen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem Album hinzufÃŒgen.',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 KB',
+		  'upload_presentation' => 'Wenn die untere Box leer bleibt und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfen Sie bitte ob Sie die neueste Version des Java runtime plugins installiert haben.<BR> Um Dateien hochzuladen klicken Sie auf <B>Durchsuchen</B> und wÃ€hlen Sie die Dateien aus oder fÃŒgen Sie diese per drag\'n\'drop aus ihrem Ordner ein. AnschlieÃend klicken Sie bitte auf <B>Hochladen</B> um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte</U> Datei hochladen-Funktion zu nutzen, klicken Sie bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ihr Browser erlaubt kein java. Das Jupload Applet braucht java. Sie kÃ¶nnen es unter <a href="http:\\java.sun.com\jre\">java web site</a> kostenlos herunterladen',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicken Sie auf diesen Link und geben Sie die gewÃŒnschten Daten in die Felder ein wenn Sie sie zu allen Bildern des nÃ€chsten Uploads hinzufÃŒgen mÃ¶chten.',
+		  'quota_used' => 'Sie nutzen momentan $1 MB ($2%) von maximal $3 MB Speicher.',
+		  'quota_about_full' => 'Entfernen Sie einige Bilder oder bitten Sie den Administrator Ihren Speicherplatz zu erhÃ¶hen.',
+		  //Since 3.2.0
+		  'need_approval' => 'Der Galerieadministrator muss die hochgeladenen Bilder genehmigen und freischalten, bevor sie gesehen werden kÃ¶nnen.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/german_formal.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/german_formal.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/german_formal.php	(revision 3951)
@@ -0,0 +1,68 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Sie haben keine Berechtigung diesen Vorgang durchzufÃŒhren.<BR><BR>Bitte <a href="$1">melden</a> Sie sich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hlen Sie ein Album, in welches Sie Dateien hochladen mÃ¶chten',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erstellen',
+		  'success' => 'Aktion erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte geben Sie dem Album einen Namen.',
+		  'error_album_already_exists' => 'Sie haben bereits ein Album mit diesem Namen.<BR><BR>Bitte klicken Sie auf den <I>ZurÃŒck</I> Button ihres Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hlen Sie hier ein Album aus. Die Datei, die Sie hochladen mÃ¶chten, wird in diesem Album gespeichert. <BR>Wenn Sie noch kein Album erstellt haben, dann ist diese Liste leer. Benutzen Sie dann die \'Album erstellen\' Funktion um ihr erstes Album zu erzeugen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem ausgewÃ€hlten Album hinzufÃŒgen.',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 Ko',
+		  'upload_presentation' => 'Wenn in der unteren Box nichts angezeigt wird und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfen Sie bitte ob Sie die neueste Version des Java runtime plugins installiert haben.<BR>Danach gestaltet sich der Upload-Vorgang wesentlich komfortabler! Klicken Sie auf <B>Durchsuchen</B> um die Dateien auszuwÃ€hlen oder fÃŒgen Sie die Dateien per drag\'n\'drop aus ihrem Ordner ein. AnschlieÃend klicken Sie bitte auf <B>Hochladen</B> um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte Datei hochladen-Funktion</U> zu nutzen, klicken Sie bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/german.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/german.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/german.php	(revision 3951)
@@ -0,0 +1,67 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File german.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du hast keine Berechtigung fÃŒr diesen Vorgang.<BR><BR>Bitte <a href="$1">melde</a> Dich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hle ein Album aus, in das Du Dateien hochladen mÃ¶chtest',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erzeugen',
+		  'success' => 'Vorgang erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte gib dem Album einen Namen.',
+		  'error_album_already_exists' => 'Du hast bereits ein Album mit diesem Namen.<BR><BR>Bitte klicke auf den <I>ZurÃŒck</I> Button Deines Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hle ein Album aus. Die Dateien, die Du hochladen mÃ¶chtest, werden in diesem Album gespeichert. <BR>Wenn Du noch kein Album erstellt hast, dann benutze bitte die \'Album erzeugen\' Funktion um Dein erstes Album zu erstellen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem Album hinzufÃŒgen',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 KB',
+		  'upload_presentation' => 'Wenn die unteren Box leer bleibt und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfe bitte, ob Du die neueste Version des Java runtime plugins installiert hast.<BR>Um Dateien hochzuladen klicke auf <B>Durchsuchen</B> und wÃ€hle die Dateien aus oder fÃŒge sie per drag\'n\'drop aus Deinem Ordner ein. AnschlieÃend auf <B>Hochladen</B> klicken um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte</U> Datei hochladen-Funktion zu nutzen, klicke bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Dein Browser erlaubt kein java. Das Jupload Applet braucht java. Du kannst es unter <a href="http:\\java.sun.com\jre\">java web site</a> kostenlos herunterladen',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicke auf diesen Link und gib die gewÃŒnschten Daten in die Felder ein wenn Du sie zu allen Bildern des nÃ€chsten Uploads hinzufÃŒgen mÃ¶chtest.',
+		  'quota_used' => 'Du nutzt momentan $1 MB ($2%) von maximal $3 MB Speicher.',
+		  'quota_about_full' => 'Entferne einige Bilder oder bitte den Administrator Deinen Speicherplatz zu erhÃ¶hen.',
+		  //Since 3.2.0
+		  'need_approval' => 'Der Galerieadministrator muss die hochgeladenen Bilder genehmigen und freischalten, bevor sie gesehen werden kÃ¶nnen.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/hebrew.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/hebrew.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/hebrew.php	(revision 3951)
@@ -0,0 +1,80 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => '××¢×××ª ×§××Š×× ××××š××× ××¢××š×ª ××©××××',
+		  'perm_denied' => '××× ×× ××š×©×× ××××Š××¢ ×€×¢××× ××.<BR /><BR />×× ××× × ×××××š, × ×¡× <a href="$1">×××ª×××š</a> ×ª××××.',
+		  'select_album' => '×× × ×××š ××××× ××××¡×× ××ª××× ××ª.',
+		  'button_update_album' => '×¢××× ×××××',
+		  'button_create_album' => '××Š××š×ª ××××× ×××©',
+		  'success' => '×€×¢××× ××Š××××!',
+		  'error_select_album' => '×× × ×××š ××××× ×ª××××',
+		  'error_album_name' => '×× × ×ª× ×××××× ×©×.',
+		  'error_album_already_exists' => '×××š ×§××× ××××× ×¢× ×©× ××.<BR /><BR />×× × ×××¥ ×¢× <I>××××š×</I> ×××€××€× ××××š ×©× ×××š ×××××× ××.',
+		  'album_name' => '×©× ××××××',
+		  'album_presentation' => '××ª× ××××š× ×××××š ×××××. ××ª××× ××ª ×©×ª×©×× ××©×š×ª ×××××¡× × ×××××× ××.<BR />×× ×× ×§××××× ×××××××, ××š×©××× ×ª××× ×š××§×. ×××¥ ×¢× \'××Š××š×ª ××××× ×××©\' ×ª××××.',
+		  'album_description' => '×ª××××š ××××××',
+		  'add_pictures' => '×××¡×£ ×ª××× ××ª ×××××× ×× ×××š',
+		  'max_upload_size' => '××××× ×××§×¡×××× ××ª××× × ××× × $1 KB',
+		  'upload_presentation' => '×× ××š××××¢ ×××× ××× × ××Š×× ××ª ×××©××××, ××××€××€× ×××××¢ ×¢× ×©×××××ª ××¢××× ××, ×× ×š×× ×©× ××š×©×ª ××ª×§× × ×©× java runtime plugin.<BR />××××š ×××, ××¢×××ª ××ª××× ××ª ×××© ×€×©×××! ×××¥ ×¢× <B>×¢×××</B> ××××š ××ª ××§××Š×× ××š×Š×××× ×× ××š××š ×××ª× ×× ×××©×××× ××× ×××× ×××š. ××××Š× ×¢× <B></B> ×ª×©×× ×××ª× ×× ××©×š×ª.'
+		. "<BR />×× ××š×Š×× × ×××©×ª××© ×<U>×××©×§ ×××¢××× ×××©×</U>, <a href='upload.php'>×××¥ ×××</a>.",
+		  'album' => '×××××',
+		  //Since 2.1.0
+		  'java_not_enabled' => '×××€××€× ×©×× ××× × ×××€×©×š java. ××©×××× ×××¢××× ××××× ×©××××© ×- java. × ××ª× ××€×ª××š ×××ª ××§×××ª ×¢× ××× ××ª×§× × ×-  <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => '×××¥ ×¢× ×§××©××š ×× ×××× ××ª ××©×××ª ×××× ×× ××š×Š×× × ××××× ×©×× ×××× ××× ×¢× ××€×¢× ×××× ×× ×ª×¢×× ×§××Š××',
+		  'quota_used' => '××ª× ×× ×Š× ××¢×ª $1 MB ($2%) ××ª×× $3 MB ×©×××§×Š× ×× ××××¡××.',
+		  'quota_about_full' => '×××§ ×ª××× ××ª ×× ××§×© ××× ×× ×××ª×š ×××§×Š××ª ×× ×××ª×š ××§×× ×××¡××.',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+
+
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/hungarian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/hungarian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/hungarian.php	(revision 3951)
@@ -0,0 +1,74 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+ 
+ //     Hungarian translation:
+ //     GÃ¡bor RÃ©zsÃ³
+ //     gabor.rezso at gmail dot com
+ 
+// ------------------------------------------------------------------------- //
+// File hungarian.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload-KÃ©p FeltÃ¶ltÃ©s+',
+		  'link_comment' => 'KÃ©pek feltÃ¶ltÃ©se a galÃ©riÃ¡ba',
+		  'perm_denied' => 'Nincs megfelelÅ jogosultsÃ¡god.<BR><BR>Ha nem vagy belÃ©pve, <a href="$1">itt</a> megteheted',
+		  'select_album' => 'VÃ¡lassz albumot, ahova a kÃ©peket tÃ¶ltenÃ©d',
+		  'button_update_album' => 'Album frissÃ­tÃ©se',
+		  'button_create_album' => 'Album lÃ©trehozÃ¡sa',
+		  'success' => 'Sikeres mÅ±velet!',
+		  'error_select_album' => 'KÃ©rlek, elÅszÃ¶r vÃ¡lassz albumot',
+		  'error_album_name' => 'KÃ©rlek, elÅszÃ¶r adj nevet az albumnak.',
+		  'error_album_already_exists' => 'MÃ¡r van ilyen nevÅ± album.<BR><BR>KLikk a <I>vissza</I> nyilra, Ãºj album nÃ©v megadÃ¡sÃ¡hoz.',
+		  'album_name' => 'Album nÃ©v',
+		  'album_presentation' => 'VÃ¡lassz albumot. A feltÃ¶ltÃ¶tt kÃ©pek . <BR>Ha nincs mÃ©g album lÃ©trehozva, a lista ÃŒres. Az Ãj album gomra kattintva hozhatod lÃ©tre elsÅ albumodat.',
+		  'album_description' => 'Album leÃ­rÃ¡s',
+		  'add_pictures' => 'KÃ©pek feltÃ¶ltÃ©se a kijelÃ¶lt albumba',
+		  'max_upload_size' => 'A kÃ©pek maximÃ¡lis mÃ©rete 1 KB',
+		  'upload_presentation' => 'Ha az alÃ¡bbi nÃ©gyzetben nem tÃ¶ltÅdik be a program, ill a bÃ¶ngÃ©szÅ hibaÃŒzenetet jelenÃ­t meg, ajÃ¡nlatos ÃºjratelepÃ­teni a java runtime plugin -t.<BR>A feltÃ¶ltÃ©s, sokkal gyorsabb Ã©s kÃ¶nnyebb! Klikk <B>TallÃ³z</B> kÃ©pek kivÃ¡lasztÃ¡sÃ¡hoz vagy hÃºzd bele a kÃ©peket az egÃ©rrel az intÃ©zÅbÅl, majd klikk <B>FeltÃ¶lt</B> gombra a feltÃ¶ltÃ©s elindÃ­tÃ¡sÃ¡hoz.'
+		. "<BR>a <U>rÃ©gi feltÃ¶ltÃ©si mÃ³d</U>, hasznÃ¡latÃ¡hoz <a href='upload.php'>Klikk ide</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk ide Ã©s add meg az alapvetÅ kÃ©p informÃ¡ciÃ³kat ha minden most feltÃ¶ltÃ¶tt kÃ©pre szeretnÃ©d alkalmazni azokat.',
+		  'quota_used' => 'Jelenleg $1 MB ($2%) tÃ¡rhelyet hasznÃ¡lsz, a rendelkezÃ©sre Ã¡llÃ³ $3 MB -bÃ³l.',
+		  'quota_about_full' => 'TÃ¶rÃ¶lj pÃ¡r kÃ©pet vagy bÅvÃ­tsd a tÃ¡rhelyet.',
+		  //Since 3.2.0
+		  'need_approval' => 'A galÃ©ria adminisztrÃ¡torÃ¡nak engedÃ©lyeznie kell a feltÃ¶ltÃ©st, mielÅtt megjelenne a galÃ©riÃ¡ban.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/arabic.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/arabic.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/arabic.php	(revision 3951)
@@ -0,0 +1,140 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// Maintainer: "Abdulrhman Alkhodiry" <almooheb@gmail.com>  
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'Ø¬Ù Ø§ØšÙÙØ¯',
+		  'link_comment' => 'Ø±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹, ØšØ³ØªØ®Ø¯Ø§Ù
+ Ø¬Ù Ø§ØšÙÙØ¯',
+		  'perm_denied' => 'ÙÙØ³Øª ÙØ¯ÙÙ Ø§ÙØµÙØ§Ø­ÙØ© ÙØªÙÙÙØ° ÙØ°Ø§ Ø§ÙØ§Ù
+Ø±.<BR><BR>Ø§Ø°Ø§ ÙÙ
+ ØªØ³Ø¬Ù Ø§ÙØ¯Ø®ÙÙ, Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ø¬ÙÙ <a href="$1">Ø§ÙØ¯Ø®ÙÙ</a> Ø§ÙÙØ§',
+		  'select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+, Ø§ÙØ°Ù Ø³ØªÙÙÙ
+ ØšØ±ÙØ¹ Ø§ÙØµÙØ± Ø¥ÙÙÙ',
+		  'button_update_album' => 'ØªØ­Ø¯ÙØ« Ø§ÙØ§ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÙØŽØ§Ø¡ Ø§ÙØ§ÙØšÙÙ
+',
+		  'success' => 'ØªÙ
+ Ø§ÙØªÙÙÙØ° ØšÙØ¬Ø§Ø­ !',
+		  'error_select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§',
+		  'error_album_name' => 'Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ù
+ÙØ© Ø§ÙØ§ÙØšÙÙ
+.',
+		  'error_album_already_exists' => 'ÙÙØ¬Ø¯ Ø§ÙØšÙÙ
+ ØšÙØ§Ø°Ø§ Ø§ÙØ§Ø³Ù
+.<BR><BR>Ø§ÙØ±Ø¬Ø§Ø¡ Ø§ÙØ±Ø¬ÙØ¹ Ø§ÙÙ <I>Ø§ÙØ®ÙÙ</I> ØšØ§ÙÙ
+ØªØµÙØ­ ÙØ§Ø®ØªÙØ§Ø± Ø§Ø³Ù
+ Ø¢Ø®Ø± ÙÙØ§ÙØšÙÙ
+.',
+		  'album_name' => 'Ø§Ø³Ù
+ Ø§ÙØ§ÙØšÙÙ
+',
+		  'album_presentation' => 'ÙØ¬Øš Ø¹ÙÙÙ Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+. Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±Ø³Ù Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹ Ø³ÙØªÙ
+ ØªØ®Ø²ÙÙÙØ§ ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯. <BR>Ø§Ø°Ø§ ÙØ§Ù ÙØ§ ÙÙØ¬Ø¯ ÙØ¯ÙÙ Ø§Ù Ø¥ÙØšÙÙ
+, ÙØ§ØŠÙ
+Ø© Ø§ÙØ§ÙØšÙÙ
+Ø§Øª Ø®Ø§ÙÙØ©. Ø§ÙÙØ± Ø¹ÙÙ \'Ø§ÙØŽØ§Ø¡\' button to create your first album.',
+		  'album_description' => 'ÙØµÙ Ø§ÙØ§ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§Ø¶Ø§ÙØ© ØµÙØ±Ø© Ø§ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯',
+		  'max_upload_size' => 'Ø§ÙØ­Ø¬Ù
+ Ø§ÙØ§ÙØµÙ ÙÙØµÙØ±Ø© ÙÙ $1 KB',
+		  'upload_presentation' => 'Ø§Ø°Ø§ Ø§ÙÙ
+Ø±ØšØ¹ ØšØ§ÙØ§Ø³ÙÙ ÙØ§ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§, ÙØŽØ±ÙØ· Ø§ÙØ­Ø§ÙØ© ØšØ§ÙØ§Ø³ÙÙ ÙÙØ¶Ø­ ÙØ¬ÙØ¯ Ø®Ø·Ø£, Ø§ÙØ­Ù Ø§ÙØ§ÙØ¶Ù ÙÙ ØªØ«ØšÙØª Ù
+ÙÙØ§Øª Ø§ÙØ¬Ø§ÙØ§.<BR>ØšØ¹Ø¯ Ø°ÙÙ, Ø±ÙØ¹ Ø§ÙØµÙØ± ÙÙÙ
+ÙÙØ¹ Ø³ÙÙ Ø¬Ø¯Ø§! ÙÙØ· ÙÙ
+ ØšØ§ÙÙÙØ± Ø¹ÙÙ <B>Ø§Ø³ØªØ¹Ø±Ø§Ø¶</B> ÙØ§Ø®ØªÙØ§Ø± Ø§ÙÙ
+ÙÙØ§Øª Ø§Ù ÙÙ
+ ØšØ³Ø­Øš Ø§ÙÙ
+ÙÙ Ù Ø§ÙÙØ§Ø¡Ù Ø¹ÙÙ Ø§ÙÙ
+Ø³ØªØ¹Ø±Ø¶ , Ø«Ù
+ Ø§ÙÙØ± Ø¹ÙÙ <B>Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª</B> ÙØ±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		. "<BR>ÙØ³ØªØ®Ø¯Ø§Ù
+ <U>ØµÙØ­Ø© Ø§ÙØ±ÙØ¹ Ø§ÙÙØ¯ÙÙ
+Ø©</U>, <a href='upload.php'>Ø§Ø¶ØºØ· ÙÙØ§</a>.",
+		  'album' => 'Ø§ÙØšÙÙ
+ Ø§ÙØµÙØ±',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø§ÙÙ
+ØªØµÙØ­ ÙØ§ ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±Ø§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§ _ Ø§ØšÙÙØª. ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ±ÙØ¹ ÙØ­ØªØ§Ø¬ Ø¬Ø§ÙØ§. ØªØ³ØªØ·ÙØ¹ ØªØ­Ù
+ÙÙ Ù
+ØŽØºÙ Ø§ÙØ¬Ø§ÙØ§ ØšØ³ÙÙÙØ© Ù
+Ù <a href="http:\\java.sun.com\jre\">Ù
+ÙÙØ¹ Ø¬Ø§ÙØ§</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Ø§Ø¶ØºØ· Ø¹ÙÙ Ø§ÙØ±Ø§ØšØ·, ÙÙÙ
+ ØšØ£Ø¯Ø®Ø§Ù Ø§ÙØšÙØ§ÙØ§Øª ÙÙ Ø§ÙØ§Ø³ÙÙ, Ø§Ø°Ø§ Ø§Ø±Ø¯Øª Ø­ÙØž Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙ Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±ÙØ¹.',
+		  'quota_used' => 'Ø§ÙØª ØªØ³ØªØ®Ø¯Ù
+ $1 MB ($2%) Ù
+Ù $3 MB Ø§ÙÙ
+Ø³Ø§Ø­Ø© Ø§ÙØ§Ø¬Ù
+Ø§ÙÙØ©.',
+		  'quota_about_full' => 'Ø§Ø­Ø°Ù ØšØ¹Ø¶ Ø§ÙØµÙØ±, Ø§Ù ÙÙ
+ ØšØ·ÙØš Ø²ÙØ§Ø¯Ø© Ø§ÙÙ
+Ø³Ø§Ø­Ø© ÙÙÙ
+ÙÙØ¹ Ù
+Ù Ø§ÙØŽØ±ÙØ© Ø§ÙÙ
+Ø³ØªØ¶ÙÙØ©.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÙÙ Ø§ÙØªØžØ§Ø± Ù
+ÙØ§ÙÙØ© Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹ Ø¹ÙÙ Ø§ÙØµÙØ±, ÙØšÙ Ø§Ù ØªØ³ØªØ·ÙØ¹ Ø±Ø£ÙØªÙÙ
+ ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/italian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/italian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/italian.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Pubblicazione di files nella galleria con l\'aiuto di un\'applet',
+		  'perm_denied' => 'Non hai il permesso per eseguire questa operazione.<BR><BR>Se non sei connesso per favore esegui prima il <a href="$1">login</a> ',
+		  'select_album' => 'Scegli l\'album dove postare le tue immagini',
+		  'button_update_album' => 'Aggiorna album',
+		  'button_create_album' => 'Crea album',
+		  'success' => 'Azione eseguita !',
+		  'error_select_album' => 'Per favore scegli prima un album',
+		  'error_album_name' => 'Inserisci il nome dell\'album',
+		  'error_album_already_exists' => 'Esiste gi&#225; un album con questo nome.<BR><BR>Clicca sul tasto <I>Back</I> del tuo browser, e scegli un\'altro nome.',
+		  'album_name' => 'Nome dell\'album',
+		  'album_presentation' => 'Puoi selezionare un\'album. Le immagini che invierai al server saranno salvate in questo album. <BR>Non hai nessun album, la lista album &#232 vuota. Usa il bottone \'Create\' per creare il tuo primo album.',
+		  'album_description' => 'Descrizione album',
+		  'add_pictures' => 'Aggiungi immagini nell\'album selezionato',
+		  'max_upload_size' => 'La massima dimensione delle immagini &#232 $1 Ko',
+		  'upload_presentation' => 'Se il riquadro in basso non visualizza l\'applet e il vostro browser segnala un errore nella pagina dovrete installare le runtime Java.<BR>Dopo, la pubblicazione sar&#225; molto semplice! Clicca su <B>Browse</B> per selezionare i files o usa Copia e Incolla da explorer, cilicca su <B>Upload</B> per inviare le immagini al server.'
+		. "<BR>Per usare <U>la vecchia pagina di upload </U>, <a href='upload.php'>clicca qui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_big5.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_big5.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_big5.php	(revision 3951)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/russian.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/russian.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/russian.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Ð£ ÐÐ°Ñ ÐœÐµÑ Ð¿ÑÐ°Ð² ÐœÐ° Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ ÑÑÐŸÐ¹ ÐŸÐ¿ÐµÑÐ°ÑÐžÐž.<br /><br />ÐÑÐ»Ðž Ð²Ñ ÐœÐµ Ð°Ð²ÑÐŸÑÐžÐ·ÐŸÐ²Ð°ÐœÑ, Ð¿ÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">Ð°Ð²ÑÐŸÑÐžÐ·ÑÐ¹ÑÐµÑÑ</a>.',
+		  'select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ, Ð² ÐºÐŸÑÐŸÑÑÐ¹ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž.',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²ÐžÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'button_create_album' => 'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'success' => 'ÐÐŸÑÐŸÐ²ÐŸ!',
+		  'error_select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_name' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÐœÐ°Ð·ÐŸÐ²ÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_already_exists' => 'Ð£ ÐÐ°Ñ ÑÐ¶Ðµ ÐµÑÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ Ñ ÑÐ°ÐºÐžÐŒ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµÐŒ.<br /><br />ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, <a href="javascript:history.back()">Ð²ÐµÑÐœÐžÑÐµÑÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ (ÐžÐ»Ðž ÐœÐ°Ð¶ÐŒÐžÑÐµ <i>ÐÐ°Ð·Ð°ÐŽ</i> Ð² ÐœÐ°Ð²ÐžÐ³Ð°ÑÐŸÑÐµ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°) Ðž ÐŽÐ°Ð¹ÑÐµ ÐŽÑÑÐ³ÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐÐ°ÑÐµÐŒÑ ÐœÐŸÐ²ÐŸÐŒÑ Ð°Ð»ÑÐ±ÐŸÐŒÑ.',
+		  'album_name' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'album_presentation' => 'ÐÐŽÐµÑÑ ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ Ð²ÑÐ±ÑÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ. ÐÐ°ÑÑÐžÐœÐºÐž, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ Ð±ÑÐŽÐµÑÐµ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑ ÐœÐ° ÑÐµÑÐ²ÐµÑ, Ð±ÑÐŽÑÑ ÑÐŸÑ
+ÑÐ°ÐœÐµÐœÑ Ð² ÑÑÐŸÐŒ Ð°Ð»ÑÐ±ÐŸÐŒÐµ.<br />ÐÑÐ»Ðž Ñ ÐÐ°Ñ ÐµÑÐµ ÐœÐµÑ Ð°Ð»ÑÐ±ÐŸÐŒÐŸÐ², ÑÐ¿ÐžÑÐŸÐº Ð¿ÑÑÑÐŸÐ¹. ÐÐ°Ð¶ÐŒÐžÑÐµ \'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ\' ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐœÐŸÐ²ÐŸÐ³ÐŸ Ð°Ð»ÑÐ±ÐŸÐŒÐ°.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž Ð² Ð²ÑÐ±ÑÐ°ÐœÐœÑÐ¹ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÑÐ¹ ÑÐ°Ð·ÐŒÐµÑ ÑÐ°Ð¹Ð»Ð° ÐºÐ°ÑÑÐžÐœÐºÐž $1 ÐÐ±',
+		  'upload_presentation' => 'ÐÑÐ»Ðž ÐŸÐ±Ð»Ð°ÑÑÑ ÑÐºÑÐ°ÐœÐ° ÐœÐžÐ¶Ðµ ÐŸÐŽÐœÐŸÐ·ÐœÐ°ÑÐœÐŸ ÐŸÑÐºÐ°Ð·ÑÐ²Ð°ÐµÑÑÑ ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ Ð°Ð¿Ð¿Ð»ÐµÑ Ðž Ð±ÑÐ°ÑÐ·ÐµÑ ÑÐŸÐŸÐ±ÑÐ°ÐµÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ, Ð¿ÐŸÐ¿ÑÐŸÐ±ÑÐ¹ÑÐµ ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ Ð¿Ð»Ð°Ð³ÐžÐœ <a href="http://java.sun.com/" target="_blank">Java&#8482;</a> ÐŽÐ»Ñ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°.<br />ÐÐŸÑÐ»Ðµ ÑÑÐŸÐ³ÐŸ Ð·Ð°Ð³ÑÑÐ·ÐºÐ° ÐºÐ°ÑÑÐžÐœÐŸÐº Ð±ÑÐŽÐµÑ ÐœÐ°ÐŒÐœÐŸÐ³ÐŸ Ð¿ÑÐŸÑÐµ! ÐÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ±Ð·ÐŸÑ</b>, ÑÑÐŸÐ±Ñ Ð²ÑÐ±ÑÐ°ÑÑ ÑÐ°Ð¹Ð»Ñ, ÐžÐ»Ðž ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ drag\'n\'drop ÐžÐ· Explorer\'Ð°, Ð·Ð°ÑÐµÐŒ ÐœÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ°Ð³ÑÑÐ·ÐžÑÑ</b> ÑÑÐŸÐ±Ñ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÑ ÑÐ°Ð¹Ð»Ñ ÐœÐ° ÑÐµÑÐ²ÐµÑ.'
+		        . '<br />ÐÐŸÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ <u>ÑÑÐ°ÑÑÐŒ ÑÐ¿ÐŸÑÐŸÐ±ÐŸÐŒ Ð·Ð°Ð³ÑÑÐ·ÐºÐž</u> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ <a href="upload.php">Ð·ÐŽÐµÑÑ</a>.',
+		  'album' => 'ÐÐ»ÑÐ±ÐŸÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_gb.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_gb.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/chinese_gb.php	(revision 3951)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/coppermine.utf-8/japanese.php
===================================================================
--- 3thparty/jupload/src/main/translation/coppermine.utf-8/japanese.php	(revision 3951)
+++ 3thparty/jupload/src/main/translation/coppermine.utf-8/japanese.php	(revision 3951)
@@ -0,0 +1,73 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Source: $
+ $Revision: ?
+ $Author: etienne_sf $
+ $Date: $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'å®è¡æš©éããããŸããã<BR><BR>æåã«<a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ã­ã°ã€ã³</a>ããŠãã ããã',
+		  'select_album' => 'ç»åãä¿å­ããã¢ã«ãã ãéžæããŠãã ããã',
+		  'button_update_album' => 'ã¢ã«ãã æŽæ°',
+		  'button_create_album' => 'ã¢ã«ãã äœæ',
+		  'success' => 'åŠçæå !',
+		  'error_select_album' => 'æåã«ã¢ã«ãã ãéžæããŠãã ããã',
+		  'error_album_name' => 'ã¢ã«ãã ã®ååãå
+¥åããŠãã ããã',
+		  'error_album_already_exists' => 'åãååã®ã¢ã«ãã ããã§ã«å­åšããŠããŸãã<BR><BR>ãã©ãŠã¶ãŒã®<I>æ»ã</I>ãã¿ã³ãã¯ãªãã¯ããŠãéãååãå
+¥åããŠãã ããã',
+		  'album_name' => 'ã¢ã«ãã ã®åå',
+		  'album_presentation' => 'ã¢ã«ãã ãéžæããŠãã ãããã¢ããã­ãŒãããç»åã¯ãéžæããã¢ã«ãã ã«ä¿å­ãããŸãã<BR>ãªã¹ãã«ã¢ã«ãã ããªãå Žåã¯ãæåã« \'ã¢ã«ãã äœæ\' ãã¿ã³ãã¯ãªãã¯ããŠã¢ã«ãã ãäœæããŠãã ããã',
+		  'album_description' => 'ã¢ã«ãã ã®èª¬æ',
+		  'add_pictures' => 'éžæããã¢ã«ãã ã«ç»åãè¿œå ',
+		  'max_upload_size' => 'ç»åã®æå€§ãµã€ãºã¯ $1 KB ã§ã',
+		  'upload_presentation' => 'äžã«ã¢ãã¬ãããè¡šç€ºãããã«ãšã©ãŒãè¡šç€ºãããå Žåã¯ãJavaãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŠãã ããã<BR>ã€ã³ã¹ããŒã«ããåŸã«ã¯ã <B>ãã¡ã€ã«ãéã</B> ãã¿ã³ãã¯ãªãã¯ããŠãã¡ã€ã«ãéžæãããããšã¯ã¹ãã­ãŒã©ãããã©ãã°ïŒãã­ããããŠã<B>ã¢ããã­ãŒã</B> ãã¿ã³ãã¯ãªãã¯ããããšã§ãµãŒãã«ãã¡ã€ã«ãã¢ããã­ãŒãã§ããŸãã'
+		  	. "<BR><U>old upload page</U>ãäœ¿çšããã«ã¯<a href='upload.php'>ãã</a>ãã¯ãªãã¯ããŠãã ããã",
+		  'album' => 'ã¢ã«ãã ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/src/main/translation/one_translation.template
===================================================================
--- 3thparty/jupload/src/main/translation/one_translation.template	(revision 3951)
+++ 3thparty/jupload/src/main/translation/one_translation.template	(revision 3951)
@@ -0,0 +1,33 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (${language})
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part (in ${language})
+
+--------------
+
+${applet_translation}
+
+--------------
+
+#if (${coppermine_filename})
+
+Translation for the CopperminePlugin part (in ${language})
+
+#if (${coppermine_filename} == "english.php")
+   The translation for ${language} doesn't exist. Please create a new one, based on the English translation below... 
+#else
+   Content of the <${coppermine_filename}> file.
+#end
+
+--------------
+
+${coppermine_translation}
+
+--------------
+
+#end
Index: 3thparty/jupload/src/main/translation/available_translations.template
===================================================================
--- 3thparty/jupload/src/main/translation/available_translations.template	(revision 3951)
+++ 3thparty/jupload/src/main/translation/available_translations.template	(revision 3951)
@@ -0,0 +1,19 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (list of available translations)
+           --------------------
+           --------------------
+           --------------------
+
+   This page contains the list of available translation, with the relevant contributors (thanks to them). Each line contains 
+   a link to the page which contains this translation. Each page contains both the applet translation (for this package), and a 
+   translation for the JUPload plugin for Coppermine. This second translation is not used, if you directly use the applet. But, 
+   as it is a free and open source project, it would be nice that translators also translate it...
+
+   Please read all details in the {{{../howto-translate.html}howto-translate}} page.
+
+*--------------------*--------------------*
+| Language | Contributor |
+#foreach ($translation in $translations)
+| {{{./${translation.filename}.html}${translation.language}}} | ${translation.contributor} |
+#end
+*--------------------*--------------------*
Index: 3thparty/jupload/pom.xml
===================================================================
--- 3thparty/jupload/pom.xml	(revision 3951)
+++ 3thparty/jupload/pom.xml	(revision 3951)
@@ -0,0 +1,738 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>net.sf.jupload</groupId>
+	<artifactId>jupload</artifactId>
+	<packaging>jar</packaging>
+	<version>5.0.1</version>
+	<name>JUpload project on Sourceforge</name>
+	<description>
+		Java Multiple File Upload Applet (JUpload) takes care of
+		the limitation posed by traditional HTML upload forms
+		by allowing you to upload a whole directory and the files within it with
+		a single click. Optionally, it allows
+		simple picture management.
+	</description>
+	<url>http://jupload.sourceforge.net</url>
+	<issueManagement>
+		<system>Sourceforge trackers</system>
+		<url>https://sourceforge.net/tracker/?group_id=59144</url>
+	</issueManagement>
+	<developers>
+		<developer>
+			<id>etienne_sf</id>
+			<name>Etienne</name>
+			<email>etienne_sf@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/etienne_sf</url>
+			<roles>
+				<role>Administrator</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>felfert</id>
+			<name>Fritz Elfert</name>
+			<email>felfert@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/felfert</url>
+			<roles>
+				<role>Developper (Felfert did a lot enhancement, but he is no more active)</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>postb99</id>
+			<name>Barbara Post</name>
+			<email>postb99@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/postb99</url>
+			<roles>
+				<role>Developper</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>nordfalk</id>
+			<name>Jacob Nordfalk</name>
+			<email>nordfalk@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/nordfalk</url>
+			<roles>
+				<role>Developper</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>ehsavoie</id>
+			<name>ehsavoie</name>
+			<email>ehsavoie@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/ehsavoie</url>
+			<roles>
+				<role>Developper</role>
+			</roles>
+		</developer>
+		<developer>
+			<id>bilbo_uk</id>
+			<name>Geoff</name>
+			<email>bilbo_uk@users.sourceforge.net</email>
+			<url>https://sourceforge.net/users/bilbo_uk</url>
+			<roles>
+				<role>Developper</role>
+			</roles>
+		</developer>
+	</developers>
+	<licenses>
+		<license>
+			<name>GNU GPL V3</name>
+			<url>http://www.gnu.org/licenses/gpl-3.0.html</url>
+			<distribution>repo</distribution>
+			<comments>Une</comments>
+		</license>
+	</licenses>
+	<scm>
+		<connection>scm:svn:https://jupload.svn.sourceforge.net/svnroot/jupload/tags/5.0.1</connection>
+		<developerConnection>scm:svn:https://jupload.svn.sourceforge.net/svnroot/jupload/tags/5.0.1</developerConnection>
+		<url>https://jupload.svn.sourceforge.net/svnroot/jupload/tags/5.0.1</url>
+	</scm>
+	<profiles>
+		<profile>
+			<!--
+				The generate-key is executed twice in the release:perform goal. So,
+				we remove the generated keystore, in the release:perform goal
+				execution. This should be executed before the generate-key. So it
+				will do something ... only if generate-key is executed twice.
+			-->
+			<id>remove-keystore</id>
+			<activation>
+				<file>
+					<missing>target/keystore</missing>
+				</file>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<artifactId>maven-antrun-plugin</artifactId>
+						<executions>
+							<execution>
+								<phase>generate-sources</phase>
+								<configuration>
+									<tasks>
+										<delete file="target/keystore" />
+									</tasks>
+								</configuration>
+								<goals>
+									<goal>run</goal>
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<!--
+				This profile generates a key, for applet signing. This key is only
+				used if the user didn't define the 'jupload.keystore.filename'
+				property in its settings.xml file.
+			-->
+			<!-- See the HowTo compile, on JUpload site for details. -->
+			<!--
+				See the generate-sign-key profile, here above, for use of this
+				generated key.
+			-->
+			<id>generate-key</id>
+			<activation>
+				<file>
+					<!--
+						Property biding is done after profile resulation. We need to
+						'hard-code' the file name, for it to work.
+					-->
+					<missing>target/keystore</missing>
+				</file>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>keytool-maven-plugin</artifactId>
+						<version>1.0</version>
+						<!--
+							This plugin allows to locally generate a certificate, to sign the
+							applet. See http://jupload.sourceforge.net/howto-compile.html
+						-->
+						<executions>
+							<execution>
+								<id>generate-demo-cert</id>
+								<phase>prepare-package</phase>
+								<goals>
+									<goal>genkey</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<alias>jupload</alias>
+							<keystore>target/keystore</keystore>
+							<storepass>jupload-demo-pass</storepass>
+							<dname>cn=demo-jupload.sourceforge.net,ou=None,L=None,ST=None,o=JUpload,c=None</dname>
+							<validity>180</validity> <!--  Six month is enough, for a demo certificate -->
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<!--
+				This profile: (1) generates an assembly (which contains the official
+				release for JUpload) and (2) sign all the project artefacts with the
+				user's PGP key. It is activated only when performing a release.
+			-->
+			<id>generate-jupload-release</id>
+			<activation>
+				<activeByDefault>false</activeByDefault>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-assembly-plugin</artifactId>
+						<version>2.2-beta-5</version>
+						<configuration>
+							<finalName>jupload</finalName>
+							<descriptors>
+								<descriptor>src/main/assembly/release.xml</descriptor>
+							</descriptors>
+						</configuration>
+						<executions>
+							<execution>
+								<id>make-assembly</id> <!-- this is used for inheritance merges -->
+								<phase>package</phase> <!-- append to the packaging phase. -->
+								<goals>
+									<goal>single</goal> <!-- goals == mojos -->
+								</goals>
+							</execution>
+						</executions>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-gpg-plugin</artifactId>
+						<version>1.0</version>
+						<executions>
+							<execution>
+								<id>gpg-sign-artifacts</id>
+								<phase>verify</phase>
+								<goals>
+									<goal>sign</goal>
+								</goals>
+								<configuration>
+									<passphrase>${jupload.pgp.passphrase}</passphrase>
+									<keyname>${jupload.pgp.keyname}</keyname>
+								</configuration>
+							</execution>
+						</executions>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<!--
+				The translate profile manages the language files. It actually
+				executes the jupload-translation maven plugin (available in this
+				package, in the ./jupload-translation/ folder). This execution take
+				the source language files, in the ./src/main/lang/, and re-generates
+				the ./src/main/resources/lang/* files.
+			-->
+			<!--
+				To activate it, you'll need to build the jupload-translation maven
+				plugin, make it available in your local repository (mvn install in
+				the ./jupload-translation/ folder should be enough), and define the
+				jupload.translation property to true (by executing this command in
+				the root jupload folder: mvn install -Djupload.translation)
+			-->
+			<id>translate</id>
+			<activation>
+				<property>
+					<name>jupload.translation</name>
+					<value>true</value>
+				</property>
+			</activation>
+			<build>
+				<plugins>
+					<plugin>
+						<groupId>net.sf.jupload</groupId>
+						<artifactId>maven-translation-plugin</artifactId>
+						<version>1.0.0</version>
+						<executions>
+							<execution>
+								<id>translate-generate-sources</id>
+								<phase>generate-sources</phase>
+								<goals>
+									<goal>translate</goal>
+								</goals>
+							</execution>
+							<execution>
+								<id>translate-pre-site</id>
+								<phase>pre-site</phase>
+								<goals>
+									<goal>translate</goal>
+								</goals>
+							</execution>
+						</executions>
+						<configuration>
+							<docFileExtension>.apt</docFileExtension>
+							<docFolder>src/site/apt</docFolder>
+							<coppermineFolder>src/main/translation/coppermine.utf-8
+							</coppermineFolder>
+							<inputEncoding>UTF-16</inputEncoding>
+							<inputFolder>src/main/translation/applet.utf-16</inputFolder>
+							<resourceLangFolder>src/main/resources/lang</resourceLangFolder>
+							<templateAvailableTranslation>src/main/translation/available_translations.template
+							</templateAvailableTranslation>
+							<templateOneTranslation>src/main/translation/one_translation.template
+							</templateOneTranslation>
+						</configuration>
+					</plugin>
+				</plugins>
+			</build>
+		</profile>
+		<profile>
+			<!--
+				This profile activate all reporting for the JUpload site. It's
+				activated by default. It's main use is ... that it can be
+				deactivated. Useful, for checking the APT files rendering. Executing
+				'mvn site -Dskip.reporting' will deactivate default profiles, and
+				quickly generate the maven site, from the previously run reports.
+			-->
+			<id>reporting</id>
+			<activation>
+				<property>
+					<name>!skip.reporting</name>
+				</property>
+			</activation>
+			<reporting>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>cobertura-maven-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-pmd-plugin</artifactId>
+						<version>2.4</version>
+						<configuration>
+							<targetJdk>1.5</targetJdk>
+							<rulesets>
+								<ruleset>/rulesets/basic.xml</ruleset>
+								<ruleset>/rulesets/controversial.xml</ruleset>
+							</rulesets>
+							<format>xml</format>
+							<linkXref>true</linkXref>
+							<sourceEncoding>utf-8</sourceEncoding>
+							<minimumTokens>100</minimumTokens>
+						</configuration>
+					</plugin>
+					<plugin>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<version>2.5</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-javadoc-plugin</artifactId>
+						<version>2.6.1</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-jxr-plugin</artifactId>
+						<version>2.1</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-clover-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+					<!--
+						One of these plugins seem to generates an error, when executing
+						the release:perform <plugin> <groupId>org.codehaus.mojo</groupId>
+						<artifactId>scmchangelog-maven-plugin</artifactId>
+						<version>1.3</version> </plugin> <plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-changelog-plugin</artifactId>
+						<version>2.1</version> </plugin>
+					-->
+					<!--
+						<plugin> Needs
+						org.apache.maven.shared:maven-doxia-tools:jar:1.0.2, whose
+						download doesn't work, from my network !
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-changes-plugin</artifactId>
+						<version>2.3</version> </plugin>
+					-->
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>taglist-maven-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+				</plugins>
+			</reporting>
+		</profile>
+	</profiles>
+	<dependencies>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.5</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-net</groupId>
+			<artifactId>commons-net</artifactId>
+			<version>1.4.1</version>
+		</dependency>
+		<!-- classes netscape.javascript.*  -->
+		<dependency>
+			<groupId>com.sun.runtime</groupId>
+			<artifactId>java-plugin</artifactId>
+			<version>1.5.0</version>
+			<scope>system</scope>
+			<systemPath>${java.home}/../jre/lib/plugin.jar</systemPath>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>1.2.13</version>
+			<scope>test</scope>
+		</dependency>
+		<!--
+			Useless for the core applet. Used only to compile the
+			jupload-translation plugin
+		-->
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-plugin-api</artifactId>
+			<version>2.0</version>
+			<scope>provided</scope>
+		</dependency>
+		<dependency>
+			<groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId>
+			<version>2.5</version>
+			<scope>provided</scope>
+		</dependency>
+	</dependencies>
+	<build>
+		<finalName>wjhk.jupload</finalName>
+		<resources>
+			<resource>
+				<directory>src/main/resources</directory>
+				<filtering>true</filtering>
+			</resource>
+		</resources>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.codehaus.mojo</groupId>
+					<artifactId>buildnumber-maven-plugin</artifactId>
+					<version>1.0-beta-4</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-compiler-plugin</artifactId>
+					<version>2.0.2</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-dependency-plugin</artifactId>
+					<version>2.0</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-release-plugin</artifactId>
+					<version>2.0-beta-9</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-resources-plugin</artifactId>
+					<version>2.4.1</version>
+				</plugin>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-source-plugin</artifactId>
+					<version>2.1.1</version>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-release-plugin</artifactId>
+				<configuration>
+					<tagBase>https://jupload.svn.sourceforge.net/svnroot/jupload/tags
+					</tagBase>
+					<preparationGoals>clean site verify</preparationGoals>
+					<goals>site deploy</goals>
+					<releaseProfiles>generate-jupload-release</releaseProfiles>
+					<!--
+						jupload.scm.username and jupload.scm.password should be defined in
+						the 'jupload' Profile, in your settings.xml
+					-->
+					<username>${jupload.scm.username}</username>
+					<password>${jupload.scm.password}</password>
+				</configuration>
+			</plugin>
+			<plugin>
+				<!--
+					mvn ant:ant generates the build.xml for this project Caution: this
+					will export the jupload.keystore.filename and
+					jupload.keystore.storepass properties, from your settings.xml to
+					the build.properties file. MUST BE CLEANED BEFORE COMMIT ! (because
+					it contains your passwords)
+				-->
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-ant-plugin</artifactId>
+				<version>2.2</version>
+			</plugin>
+			<plugin>
+				<groupId>org.codehaus.mojo</groupId>
+				<artifactId>buildnumber-maven-plugin</artifactId>
+				<executions>
+					<execution>
+						<phase>validate</phase>
+						<goals>
+							<goal>create</goal>
+						</goals>
+					</execution>
+				</executions>
+				<configuration>
+					<doCheck>false</doCheck>
+					<doUpdate>false</doUpdate>
+					<revisionOnScmFailure>true</revisionOnScmFailure>
+					<locale>en</locale>
+					<useLastCommittedRevision>true</useLastCommittedRevision>
+				</configuration>
+			</plugin>
+			<plugin>
+				<!--
+					Get the dependencies jar files to a common place, for jar signing
+				-->
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-dependency-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>copy-dependencies</id>
+						<phase>site</phase>
+						<goals>
+							<goal>copy-dependencies</goal>
+						</goals>
+						<configuration>
+							<includeScope>runtime</includeScope>
+							<outputDirectory>${project.build.directory}/site
+							</outputDirectory>
+							<overWriteReleases>false</overWriteReleases>
+							<overWriteSnapshots>false</overWriteSnapshots>
+							<overWriteIfNewer>true</overWriteIfNewer>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-jarsigner-plugin</artifactId>
+				<version>1.2</version>
+				<executions>
+					<execution>
+						<!--
+							JUpload requires applet signing. The properties to sign the
+							applet must be stored in your local settings.xml, under the
+							jupload profile. See documentation for details
+						-->
+						<id>sign-artefact</id>
+						<phase>package</phase>
+						<goals>
+							<goal>sign</goal>
+						</goals>
+						<configuration>
+							<alias>${jupload.keystore.alias}</alias>
+							<keystore>${jupload.keystore.filename}</keystore>
+							<storepass>${jupload.keystore.storepass}</storepass>
+							<removeExistingSignatures>true</removeExistingSignatures>
+						</configuration>
+					</execution>
+					<execution>
+						<!--
+							JUpload web site requires that all dependencies are signed with
+							the same key, in order to work properly
+						-->
+						<id>sign-site</id>
+						<phase>site</phase>
+						<goals>
+							<goal>sign</goal>
+						</goals>
+						<configuration>
+							<alias>${jupload.keystore.alias}</alias>
+							<keystore>${jupload.keystore.filename}</keystore>
+							<storepass>${jupload.keystore.storepass}</storepass>
+							<removeExistingSignatures>true</removeExistingSignatures>
+							<archiveDirectory>${project.build.directory}/site
+							</archiveDirectory>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<artifactId>maven-resources-plugin</artifactId>
+				<executions>
+					<execution>
+						<id>install-copy-resources-jupload-jar</id>
+						<phase>install</phase>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>${project.build.directory}/site
+							</outputDirectory>
+							<nonFilteredFileExtensions>
+								<nonFilteredFileExtension>jar</nonFilteredFileExtension>
+							</nonFilteredFileExtensions>
+							<resources>
+								<resource>
+									<directory>${project.build.directory}</directory>
+									<includes>
+										<include>*.jar</include>
+									</includes>
+								</resource>
+							</resources>
+						</configuration>
+					</execution>
+					<execution>
+						<id>site-copy-resources-jupload-jar</id>
+						<phase>site</phase>
+						<goals>
+							<goal>copy-resources</goal>
+						</goals>
+						<configuration>
+							<outputDirectory>${project.build.directory}/site
+							</outputDirectory>
+							<nonFilteredFileExtensions>
+								<nonFilteredFileExtension>jar</nonFilteredFileExtension>
+							</nonFilteredFileExtensions>
+							<resources>
+								<resource>
+									<directory>${project.build.directory}</directory>
+									<includes>
+										<include>*.jar</include>
+									</includes>
+								</resource>
+							</resources>
+						</configuration>
+					</execution>
+				</executions>
+			</plugin>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-site-plugin</artifactId>
+				<version>2.0.1</version>
+				<configuration>
+					<inputEncoding>UTF-8</inputEncoding>
+					<outputEncoding>UTF-8</outputEncoding>
+					<!--  templateFile>src/site/site.vm</templateFile -->
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<distributionManagement>
+		<!--
+			We have no Maven repository yet. So release are to be deployed on a
+			local repository.... TODO: have a real repository. Publish to Maven
+			Central Repository?
+		-->
+		<repository>
+			<id>${jupload.distributionManagement.repository.id}</id>
+			<name>${jupload.distributionManagement.repository.name}</name>
+			<url>${jupload.distributionManagement.repository.url}</url>
+		</repository>
+		<snapshotRepository>
+			<id>${jupload.distributionManagement.snapshotRepository.id}</id>
+			<name>${jupload.distributionManagement.snapshotRepository.name}
+			</name>
+			<url>${jupload.distributionManagement.snapshotRepository.url}</url>
+		</snapshotRepository>
+		<!--
+			The next tag allows to easily update the JUpload site, hosted by
+			sourceforge.net
+		-->
+		<site>
+			<id>jupload.website</id>
+			<name>JUpload Website</name>
+			<url>sftp://web.sourceforge.net/home/groups/j/ju/jupload/htdocs/</url>
+		</site>
+	</distributionManagement>
+	<properties>
+		<!--
+			All these properties can (should) be overriden in your settings.xml
+			file. See the http://jupload.sourceforge.net/howto-compile.html page
+			for details
+		-->
+		<!--
+			The next parameters are mandatory, for applet signing. Default
+			behavior, in the pom, is to generate these parameters, if you didn't
+			define them in your settings.xml. So, they are optional in your
+			settings. If you don't define them, JUpload will use a generated
+			keystore, with a certificate generated at compile time. BUT: if you
+			want to PUBLISH the applet to real life users, you SHOULD define
+			them. See the howto-compile on the JUpload site, for details
+		-->
+		<jupload.keystore.alias>jupload</jupload.keystore.alias>
+		<jupload.keystore.filename>target/keystore</jupload.keystore.filename>
+		<jupload.keystore.storepass>jupload-demo-pass
+		</jupload.keystore.storepass>
+
+		<!--
+			The next parameters are mandatory only for publishing Maven artefact
+			to your repositories, that is: when you use the "deploy" maven goal.
+			Useless when you 'just' compile, that is: when you use the 'install'
+			maven goal. There is currently no 'Central' jupload repository
+		-->
+		<jupload.distributionManagement.repository.id>Id_for_your_main_repository
+		</jupload.distributionManagement.repository.id>
+		<jupload.distributionManagement.repository.name>Name_for_your_main_repository
+		</jupload.distributionManagement.repository.name>
+		<jupload.distributionManagement.repository.url>URL_for_your_main_repository
+		</jupload.distributionManagement.repository.url>
+		<jupload.distributionManagement.snapshotRepository.id>Id_for_your_main_snapshotRepository
+		</jupload.distributionManagement.snapshotRepository.id>
+		<jupload.distributionManagement.snapshotRepository.name>Name_for_your_main_snapshotRepository
+		</jupload.distributionManagement.snapshotRepository.name>
+		<jupload.distributionManagement.snapshotRepository.url>URL_for_your_main_snapshotRepository
+		</jupload.distributionManagement.snapshotRepository.url>
+
+		<!--
+			The next parameters are mandatory only for PGP signing. PGP signing
+			is used only when performing a release, that is: when executing the
+			goal release:perform Not used (so: optional) otherwise. PGP signing
+			is only used for developpers who would like to publish a new JUpload
+			version to the Maven Central Repository. For all other users, you can
+			let skip to true.
+		-->
+		<jupload.pgp.keyname>Your PGP key name</jupload.pgp.keyname>
+		<!--
+			The passphrase is optional: if not provided, it will be asked to the
+			user
+		-->
+		<jupload.pgp.passphrase>Your PGP passphrase</jupload.pgp.passphrase>
+
+		<!--
+			The next parameters are mandatory, only for use of the maven release
+			plugin. Optionnal otherwise. So for standard use of JUpload (without
+			creating releases), you can let this parameter unchanged
+		-->
+		<jupload.scm.username>Your SCM login</jupload.scm.username>
+		<jupload.scm.password>Your SCM password</jupload.scm.password>
+	</properties>
+
+	<!--
+		Reporting: see the 'reporting' profile, here above.  
+	 -->
+
+</project>
+ 
Index: 3thparty/jupload/readme.txt
===================================================================
--- 3thparty/jupload/readme.txt	(revision 3951)
+++ 3thparty/jupload/readme.txt	(revision 3951)
@@ -0,0 +1,83 @@
+Hi,
+
+  Thank you for downloading JUpload !
+
+
+
+You'll find in this file a description of the package content you downloaded.
+If you checked out the sources from SVN your paths will differ: you won't have 
+the /site folder, only available in official releases. To generate the site, 
+please read the doc.
+
+
+QUICK START :
+
+The main entry points are:
+- Compiled applet: /site/wjhk.jupload.jar
+- full sources :  /src
+- all translation material: /site/translation
+- demo web site, with all the JUPload documentation:  /site/index.html
+  It contains links to all docs for the JUpload project.
+
+
+PACKAGE CONTENT:
+
+/src
+  Full sources.
+  The JUpload applet java sources are in /src/main/java/
+
+/site
+  The copy of the JUpload web site, available as a link from the jupload sourceforge project.
+  Its main content is:
+  
+	Main files and folders:
+	  /site/apidocs/
+	    The JUpload javadoc.
+	  /site/wjhk.jupload.jar
+	    THE COMPILED APPLET, that can you use directly on your web site. You should sign it with your own certificate.
+	    See the /site/README.txt file
+	  /site/samples.java/
+	    Some samples for a J2EE server, like tomcat. The parseRequest.jsp show an example of managing uploaded file
+	    in Java.
+	  /site/samples.PHP/
+	    Some samples for a J2EE server, like tomcat. The parseRequest.jsp show an example of managing uploaded file
+	    in Java.
+
+	Main files:
+	  /site/advanced_js_demo.html
+	    Allows you to test the applet with various parameters.
+	  /site/applet-basic-picture.html
+	    Example of the applet in picture mode (uses the PictureUploadPolicy upload policy)
+	  /site/applet-basic.html
+	    Basic applet demo.
+	  /site/common.js
+	    Some javascript used by the other pages.
+	  /site/howto-customize.html
+	    Documentation how you can make the applet match to your needs.
+	  /site/howto-debug.html
+	    How to analyse what's happening.
+	  /site/howto-support.html
+	    How and where to get support.
+	  /site/howto-translate.html
+	    We accept all translations !!!   ;-)
+	  /site/index.html
+	    ENTRY POINT FOR THE DEMO WEB SITE
+	  /site/jakarta-commons-oro.jar
+	    the jakarata library, signed by our demo certificate. Used in FTP mode only.
+	  /site/nocache.php
+	    Used to prevent caching of the jar file, by the sourceforge hosting.
+	  /site/RELEASE-NOTES.txt
+	    What's new in this relese (and full history)
+	  /site/upload_dummy.php
+	    A dummy php file, that can receive uploads. Can be used as a (very) simple sample in PHP
+	  /site/wjhk.jupload.jar
+	    THE APPLET, READY TO USE.
+
+	
+	  /site/samples.java/
+	    Java samples, as an exemple on how to embed JUpload in your java application
+	  /site/samples.PHP/
+	    PHP samples, as an exemple on how to embed JUpload in your PHP application
+
+  
+  You can use /site as the root for a J2EE application server, like Tomcat or Apache/PHP.
Index: 3thparty/jupload/.settings/org.eclipse.jdt.core.prefs
===================================================================
--- 3thparty/jupload/.settings/org.eclipse.jdt.core.prefs	(revision 3951)
+++ 3thparty/jupload/.settings/org.eclipse.jdt.core.prefs	(revision 3951)
@@ -0,0 +1,12 @@
+#Fri Apr 01 17:46:58 BRT 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
+org.eclipse.jdt.core.compiler.codegen.unusedLocal=preserve
+org.eclipse.jdt.core.compiler.compliance=1.5
+org.eclipse.jdt.core.compiler.debug.lineNumber=generate
+org.eclipse.jdt.core.compiler.debug.localVariable=generate
+org.eclipse.jdt.core.compiler.debug.sourceFile=generate
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.5
Index: 3thparty/jupload/build.xml
===================================================================
--- 3thparty/jupload/build.xml	(revision 3951)
+++ 3thparty/jupload/build.xml	(revision 3951)
@@ -0,0 +1,187 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!-- ====================================================================== -->
+<!-- Ant build file (http://ant.apache.org/) for Ant 1.6.2 or above.        -->
+<!-- ====================================================================== -->
+
+<project name="jupload" default="eclipse_package" basedir=".">
+
+	<!-- Let's load the system properties -->
+	<property environment="env" />
+
+	<!-- Definition of the classpath for ant-contrib tasks -->
+	<path id="ant.tasks.ant-contrib.classpath">
+		<fileset dir="lib/ant">
+			<include name="ant-contrib.jar" />
+		</fileset>
+	</path>
+	<taskdef resource="net/sf/antcontrib/antcontrib.properties"
+	         classpathref="ant.tasks.ant-contrib.classpath" />
+
+	<!-- ====================================================================== -->
+	<!-- Import maven-build.xml into the current project                        -->
+	<!-- ====================================================================== -->
+
+	<import file="maven-build.xml" />
+
+	<!-- ====================================================================== -->
+	<!-- Help target                                                            -->
+	<!-- ====================================================================== -->
+
+	<target name="help">
+		<echo message="Please run: $ant -projecthelp" />
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- prepare_resources target - allows action before simulated maven build  -->
+	<!-- ====================================================================== -->
+
+	<target name="prepare_resources">
+		<!-- Default value for the svn.properties properties. You should 
+		override by setting them before calling the ant build -->
+		<property name="pom.version" value="pom.version undefined" />
+		<property name="timestamp" value="1" />
+		<property name="svn.revision" value="" />
+		<!-- Let's calculate an ant build number -->
+		<mkdir dir="${maven.build.outputDir}" />
+		<buildnumber file="target/build.number" />
+		<property name="buildNumber" value="${build.number}" />
+		<property name="pom.version" value="pom.version undefined" />
+		<!-- Let's copy and update properties in the svn.properties file -->
+		<copy file="${maven.build.resourceDir.0}/conf/svn.properties"
+		      todir="${maven.build.outputDir}/conf"
+		      filtering="true"
+		      overwrite="true">
+			<filterset id="myFilterSet" begintoken="{" endtoken="}">
+				<filter token="pom.version" value="${pom.version}" />
+				<filter token="timestamp" value="${timestamp}" />
+				<filter token="buildNumber" value="${buildNumber}" />
+			</filterset>
+			<filterset id="myFilterSet" begintoken="=" endtoken="$">
+				<filter token=" " value="= " />
+			</filterset>
+		</copy>
+	</target>
+
+	<!-- ====================================================================== -->
+	<!-- Specific eclipse target, to create the classpath allowing eclipse      -->
+	<!-- compiler to run without error                                          -->
+	<!-- ====================================================================== -->
+
+	<!-- Copy one jar file to the ./lib folder, and add it to the eclipse classpath -->
+	<target name="add_one_jar_to_eclipse_classpath">
+		<echo message="Adding ${jarFile} to eclipse classpath" level="info" />
+		<!-- Copy the given jar file, useless ? -->
+		<!-- copy file="${jarFile}" todir="./lib" /   -->
+		<!-- 
+			Add the copied file to the eclipse classpath. We must do that by copying to a new file (to have an actual replacement), 
+			with a new placeholder (to avoid an infinite loop).
+		-->
+		<copy file=".classpath"
+		      tofile=".classpath.tmp"
+		      verbose="true"
+		      overwrite="true">
+			<filterset begintoken="#" endtoken="#">
+				<filter token="dependencyJarFile"
+				        value="&lt;classpathentry kind=&quot;lib&quot; path=&quot;${jarFile}&quot;/&gt; 
+					#dependencyJarFile2#" />
+			</filterset>
+		</copy>
+		<copy file=".classpath.tmp"
+		      tofile=".classpath"
+		      verbose="true"
+		      overwrite="true">
+			<filterset begintoken="#" endtoken="#">
+				<filter token="dependencyJarFile2"
+				        value="#dependencyJarFile#" />
+			</filterset>
+		</copy>
+		<delete file=".classpath.tmp" />
+	</target>
+
+	<target name="create_eclipse_classpath">
+		<!-- Let's override the .classpath, by the relevant template -->
+		<copy file=".classpath_template_for_and_build"
+		      tofile=".classpath"
+		      overwrite="true" />
+
+		<!-- We add all dependency jar files, to the classpath, so that eclipse internal compiler works -->
+		<delete file=".classpath.tmp" />
+		<foreach target="add_one_jar_to_eclipse_classpath"
+		         param="jarFile"
+		         trim="true">
+			<path refid="build.test.classpath" />
+		</foreach>
+		<!-- Let's remove the placeholder -->
+
+		<copy file=".classpath" tofile=".classpath.tmp" overwrite="true">
+			<filterset begintoken="#" endtoken="#">
+				<filter token="dependencyJarFile" value="" />
+			</filterset>
+		</copy>
+		<move file=".classpath.tmp" tofile=".classpath" overwrite="true" />
+	</target>
+
+	<target name="refresh_if_eclipse" if="eclipse.running">
+		<eclipse.refreshLocal resource="jupload" depth="infinite" />
+	</target>
+
+	<!-- =================================================================================
+		Start of Signing applet jar
+		Various targets to sign the applet, depending on the given parameters 
+	================================================================================== -->
+	<target name="sign_jar"
+	        depends="sign_jar_without_keypass, sign_jar_with_keypass" />
+	<target name="sign_jar_without_keypass" unless="jupload.keystore.keypass">
+		<echo message="Jar: ${maven.build.dir}/${maven.build.finalName}.jar"
+		      level="info" />
+		<echo message="Keystore: ${jupload.keystore.filename}" level="info" />
+		<echo message="Alias: ${jupload.keystore.alias}" level="info" />
+		<signjar jar="${maven.build.dir}/${maven.build.finalName}.jar"
+		         alias="${jupload.keystore.alias}"
+		         storepass="${jupload.keystore.storepass}"
+		         keystore="${jupload.keystore.filename}" />
+	</target>
+	<target name="sign_jar_with_keypass" if="jupload.keystore.keypass">
+		<signjar jar="${maven.build.dir}/${maven.build.finalName}.jar"
+		         alias="${jupload.keystore.alias}"
+		         storepass="${jupload.keystore.storepass}"
+		         keystore="${jupload.keystore.filename}"
+		         keypass="${jupload.keystore.keypass}"
+		         verbose="true" />
+	</target>
+	<!-- =================================================================================
+		End of Signing applet jar 
+	================================================================================== -->
+
+	<!-- =================================================================================
+		Start of post compile actions
+		Copy of the applet jar file to the /site and /target/site/ folders, if they exist 
+	================================================================================== -->
+	<target name="post_compile_action"
+	        depends="check_site_folders,copy_jar_to_site, copy_jar_to_target_site" />
+	<target name="check_site_folders">
+		<available file="site" property="jupload.available.site" />
+		<available file="target/site"
+		           property="jupload.available.target.site" />
+	</target>
+	<target name="copy_jar_to_site" if="jupload.available.site">
+		<copy file="${maven.build.dir}/${maven.build.finalName}.jar"
+		      todir="site" />
+	</target>
+	<target name="copy_jar_to_target_site" if="jupload.available.target.site">
+		<copy file="${maven.build.dir}/${maven.build.finalName}.jar"
+		      todir="target/site" />
+	</target>
+	<!-- =================================================================================
+		End of post compile actions
+	================================================================================== -->
+
+
+	<!-- =================================================================================
+		The main goal ! 
+	================================================================================== -->
+	<target name="eclipse_package"
+	        depends="get-deps, create_eclipse_classpath, prepare_resources, package, refresh_if_eclipse, post_compile_action" />
+
+</project>
Index: 3thparty/jupload/maven-build.properties
===================================================================
--- 3thparty/jupload/maven-build.properties	(revision 3951)
+++ 3thparty/jupload/maven-build.properties	(revision 3951)
@@ -0,0 +1,24 @@
+#Generated by Maven Ant Plugin - DO NOT EDIT THIS FILE!
+#Tue Jun 01 20:14:41 CEST 2010
+#jupload.keystore.alias=Must be defined in your ant properties
+#jupload.keystore.filename=Must be defined in your ant properties
+#jupload.keystore.storepass=Must be defined in your ant properties
+#jupload.pgp.keyname=Unused
+#jupload.pgp.passphrase=Unused
+#jupload.scm.password=Unused
+#jupload.scm.username=Unused
+maven.build.dir=target
+maven.build.finalName=wjhk.jupload
+maven.build.outputDir=${maven.build.dir}/classes
+maven.build.resourceDir.0=src/main/resources
+maven.build.srcDir.0=src/main/java
+maven.build.testDir.0=src/test/java
+maven.build.testOutputDir=${maven.build.dir}/test-classes
+maven.build.testResourceDir.0=src/test/resources
+maven.repo.local=${user.home}/.m2/repository
+maven.reporting.outputDirectory=${maven.build.dir}/site
+maven.settings.interactiveMode=true
+maven.settings.offline=false
+maven.test.reports=${maven.build.dir}/test-reports
+project.build.directory=${maven.build.dir}
+project.build.outputDirectory=${maven.build.outputDir}
Index: 3thparty/jupload/maven-translation-plugin/src/test/java/wjhk/jupload/translation/TranslationManagerMojoTest.java
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/java/wjhk/jupload/translation/TranslationManagerMojoTest.java	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/java/wjhk/jupload/translation/TranslationManagerMojoTest.java	(revision 3951)
@@ -0,0 +1,893 @@
+/**
+ * 
+ */
+package wjhk.jupload.translation;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileNotFoundException;
+import java.io.FileReader;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.util.Properties;
+
+import org.apache.maven.plugin.MojoExecutionException;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.Test;
+
+/**
+ * @author etienne_sf
+ */
+public class TranslationManagerMojoTest {
+
+	final static String TEST_COPPERMINE_FOLDER = "src/test/resources/lang.coppermine.utf-8";
+
+	final static String TEST_LANG_UTF8_FOLDER = "src/test/resources/lang.utf-8";
+
+	final static String TEST_LANG_UTF16_FOLDER = "src/test/resources/lang.utf-16";
+
+	final static String TEST_LANG_KO_FOLDER = "src/test/resources/lang.ko";
+
+	final static String DEFAULT_DOC_FOLDER = "target/translationTest-docFolder";
+
+	final static String DEFAULT_INPUT_FOLDER = "target/translationTest-inputFolder";
+
+	final static String DEFAULT_RESOURCE_LANG_FOLDER = "target/translationTest-resourceLangFolder";
+
+	final static String VERIF_UTF8_FOLDER = "src/test/resources/lang.verif.utf-8";
+
+	final static String VERIF_UTF16_FOLDER = "src/test/resources/lang.verif.utf-16";
+
+	final static String VERIF_UTF16_APT_FOLDER = "src/test/resources/lang.verif.utf-16_to_apt";
+
+	final static String VERIF_UTF16_TO_UNICODE_FOLDER = "src/test/resources/lang.verif.utf-16_to_unicode";
+
+	final static String RESOURCE_ENCODING = "UTF-8";
+
+	TranslationManagerMojo translationManagerMojo = null;
+
+	File projectRoot = null;
+
+	File docFolder = null;
+
+	File inputFolder = null;
+
+	File resourceLangFolder = null;
+
+	File verifUTF8Folder = null;
+
+	File verifUTF16Folder = null;
+
+	File verifUTF16AptFolder = null;
+
+	FilenameFilter noSvnFilenameFilter = new NoSvnFilenameFilter();
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@Before
+	public void setUp() throws Exception {
+		// Let's get the current folder.
+		projectRoot = new File(".");
+		String currentDir = projectRoot.getAbsolutePath();
+		if (projectRoot.getAbsolutePath().endsWith(".")) {
+			// This should always be the case.
+			currentDir = projectRoot.getAbsolutePath();
+			currentDir = currentDir.substring(0, currentDir.length() - 2);
+			projectRoot = new File(currentDir);
+		}
+
+		if (currentDir.endsWith("jupload")) {
+			currentDir = projectRoot.getAbsolutePath() + File.separator
+					+ "jupload-translation";
+			projectRoot = new File(currentDir);
+		} else if (!currentDir.endsWith("maven-translation-plugin")) {
+			Assert.fail("Non-managed current folder: " + currentDir);
+		}
+
+		verifUTF8Folder = new File(projectRoot, VERIF_UTF8_FOLDER);
+		verifUTF16Folder = new File(projectRoot, VERIF_UTF16_FOLDER);
+		verifUTF16AptFolder = new File(projectRoot, VERIF_UTF16_APT_FOLDER);
+
+		docFolder = new File(projectRoot, DEFAULT_DOC_FOLDER);
+		if (!docFolder.exists()) {
+			docFolder.mkdirs();
+		} else if (!docFolder.isDirectory()) {
+			Assert.fail(docFolder.getAbsolutePath()
+					+ " must be a valid directory");
+		} else {
+			TranslationManagerMojo.emptyFolder(docFolder);
+		}
+
+		inputFolder = new File(projectRoot, DEFAULT_INPUT_FOLDER);
+		if (!inputFolder.exists()) {
+			inputFolder.mkdirs();
+		} else if (!inputFolder.isDirectory()) {
+			Assert.fail(inputFolder.getAbsolutePath()
+					+ " must be a valid directory");
+		} else {
+			TranslationManagerMojo.emptyFolder(inputFolder);
+		}
+
+		resourceLangFolder = new File(projectRoot, DEFAULT_RESOURCE_LANG_FOLDER);
+		if (!resourceLangFolder.exists()) {
+			resourceLangFolder.mkdirs();
+		} else if (!resourceLangFolder.isDirectory()) {
+			Assert.fail(resourceLangFolder.getAbsolutePath()
+					+ " must be a valid directory");
+		} else {
+			TranslationManagerMojo.emptyFolder(resourceLangFolder);
+		}
+
+		File originalTestLangFolder = new File(projectRoot,
+				TEST_LANG_UTF8_FOLDER);
+		if (!inputFolder.isDirectory()) {
+			Assert.fail(inputFolder.getAbsolutePath()
+					+ " must be a valid directory");
+		}
+
+		// Test initialization.
+		translationManagerMojo = new TranslationManagerMojo();
+		translationManagerMojo.setDocFolder(docFolder);
+		translationManagerMojo.setInputFolder(inputFolder);
+		translationManagerMojo.setResourceLangFolder(resourceLangFolder);
+		translationManagerMojo
+				.setTemplateAvailableTranslation("src/test/resources/available_translations.template");
+		translationManagerMojo
+				.setTemplateOneTranslation("src/test/resources/one_translation.template");
+
+		// The next setter will create the folder, if it doesn't exist.
+		translationManagerMojo.setWorkFolder(new File(projectRoot,
+				"target/translation-workFolder"));
+
+		// Let's copy the lang files from src/test/resources to
+		// target/inputFolder
+		// The original files will then remain unchanged by the runned tests.
+		copyInputFilesForTest(originalTestLangFolder, RESOURCE_ENCODING);
+	}
+
+	/**
+	 * Copy files for the current test. This inputFolder is emptied before
+	 * copying the files to it, to prevent 'interaction' between tests.
+	 * 
+	 * @param testCaseInputFolder
+	 *            The folder which contains the files for the current test.
+	 * @throws IOException
+	 */
+	private void copyInputFilesForTest(File testCaseInputFolder,
+			String fileEncoding) throws IOException {
+		// First step: emptying input folder.
+		File[] files = inputFolder.listFiles(noSvnFilenameFilter);
+		for (int i = 0; i < files.length; i += 1) {
+			files[i].delete();
+		}
+
+		// Second step, copy the source files to the inputFolder.
+		files = testCaseInputFolder.listFiles(noSvnFilenameFilter);
+		for (int i = 0; i < files.length; i += 1) {
+			if (files[i].getName().endsWith(".properties")) {
+				translationManagerMojo
+						.copyFile(files[i], fileEncoding, new File(inputFolder,
+								files[i].getName()), fileEncoding);
+			}
+		}
+	}
+
+	/**
+	 * @param source
+	 * @param target
+	 * @throws IOException
+	 * @throws MojoExecutionException
+	 */
+	private void compareFiles(File source, File target) throws IOException,
+			MojoExecutionException {
+		if (!source.isFile()) {
+			throw new MojoExecutionException(
+					"The source file to compare to doesn't exist ("
+							+ source.getAbsolutePath() + ")");
+		} else if (!target.isFile()) {
+			throw new MojoExecutionException(
+					"The target file to compare to doesn't exist ("
+							+ target.getAbsolutePath() + ")");
+		}
+		long lenSource = source.length();
+		Assert.assertEquals(
+				"Length of the files must be equal ("
+						+ source.getAbsolutePath() + " and "
+						+ target.getAbsolutePath(), lenSource, target.length());
+
+		BufferedReader brSource = new BufferedReader(new FileReader(source));
+		BufferedReader brTarget = new BufferedReader(new FileReader(target));
+		String s, t;
+		while ((s = brSource.readLine()) != null
+				&& (t = brTarget.readLine()) != null) {
+			// As the file length are equals, the above and below test are
+			// enough (no need to check that we found the end of a file before
+			// the other one.
+			Assert.assertEquals("Content of the files must be equal ("
+					+ source.getAbsolutePath() + " and "
+					+ target.getAbsolutePath(), s, t);
+		}
+	}
+
+	/**
+	 * @throws java.lang.Exception
+	 */
+	@After
+	public void tearDown() throws Exception {
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testExecute_UTF8() throws MojoExecutionException, IOException {
+		String filename = "lang_fr.properties";
+		File fileLangFR_utf8 = new File(verifUTF8Folder, filename + ".utf-8");
+		File fileLangFRUnicode = new File(verifUTF8Folder, filename
+				+ ".unicode");
+		translationManagerMojo.execute();
+
+		// Let's check the inputFolder. The lang file should remain unchanged.
+		// The lang_fr should be formatted.
+		Assert.assertEquals("Number of generated files", 2, inputFolder
+				.listFiles(noSvnFilenameFilter).length);
+		compareFiles(new File(verifUTF8Folder, "lang.properties"), new File(
+				inputFolder, "lang.properties"));
+		compareFiles(new File(inputFolder + File.separator + filename),
+				fileLangFR_utf8);
+
+		// Let's check the resourceLangFolder. The lang file should remain
+		// unchanged. The lang_fr should be formatted, and 'unicoded'.
+		Assert.assertEquals("Number of generated files", 2, resourceLangFolder
+				.listFiles(noSvnFilenameFilter).length);
+		compareFiles(new File(verifUTF8Folder, "lang.properties"), new File(
+				resourceLangFolder, "lang.properties"));
+		compareFiles(new File(resourceLangFolder + File.separator + filename),
+				fileLangFRUnicode);
+
+		// Let's check the docFolder.
+		Assert.assertEquals("Number of generated files", 3, docFolder
+				.listFiles(noSvnFilenameFilter).length);
+		// We just check that the file exists. The file generation is tested in
+		// testExecute_UTF16()
+		// No file extension has been given ...
+		filename = "available_translations";
+		Assert
+				.assertTrue("The file '" + filename + "' must exist in the "
+						+ docFolder + " folder", new File(docFolder, filename)
+						.isFile());
+		filename = "lang.properties";
+		Assert
+				.assertTrue("The file '" + filename + "' must exist in the "
+						+ docFolder + " folder", new File(docFolder, filename)
+						.isFile());
+		filename = "lang_fr.properties";
+		Assert
+				.assertTrue("The file '" + filename + "' must exist in the "
+						+ docFolder + " folder", new File(docFolder, filename)
+						.isFile());
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testExecute_UTF16() throws MojoExecutionException, IOException {
+		// First step: initialize this test case with the UTF-16 files
+		File originalTestLangFolder = new File(projectRoot,
+				TEST_LANG_UTF16_FOLDER);
+		if (!inputFolder.isDirectory()) {
+			Assert.fail(inputFolder.getAbsolutePath()
+					+ " must be a valid directory");
+		}
+		// Let's copy the lang files from src/test/resources to
+		// target/inputFolder
+		copyInputFilesForTest(originalTestLangFolder, "UTF-16");
+		File verifUTF16ToUnicodeFolder = new File(projectRoot,
+				VERIF_UTF16_TO_UNICODE_FOLDER);
+
+		// Let's execute the whole process
+		translationManagerMojo.setCoppermineFolder(new File(projectRoot,
+				TEST_COPPERMINE_FOLDER));
+		translationManagerMojo.setInputEncoding("UTF-16");
+		translationManagerMojo.setDocFileExtension(".apt");
+		translationManagerMojo.execute();
+
+		// Let's test, now.
+		Assert
+				.assertEquals(
+						"Number of generated files (check of the verification folders)",
+						verifUTF16Folder.listFiles(noSvnFilenameFilter).length,
+						verifUTF16ToUnicodeFolder
+								.listFiles(noSvnFilenameFilter).length);
+		Assert.assertEquals("Number of generated files (UTF-16)",
+				verifUTF16Folder.listFiles(noSvnFilenameFilter).length,
+				inputFolder.listFiles(noSvnFilenameFilter).length);
+		Assert.assertEquals("Number of generated files (unicode)",
+				verifUTF16Folder.listFiles(noSvnFilenameFilter).length,
+				resourceLangFolder.listFiles(noSvnFilenameFilter).length);
+
+		// Check of the inputFolder result.
+		File[] inputFiles = inputFolder.listFiles(noSvnFilenameFilter);
+		for (int i = 0; i < inputFiles.length; i += 1) {
+			compareFiles(new File(verifUTF16Folder, inputFiles[i].getName()),
+					inputFiles[i]);
+			compareFiles(new File(verifUTF16ToUnicodeFolder, inputFiles[i]
+					.getName()), new File(translationManagerMojo
+					.getResourceLangFolder(), inputFiles[i].getName()));
+		}// for
+
+		// Check of the docFolder content, based on the inputFolder files.
+		File[] htmlFiles = docFolder.listFiles(noSvnFilenameFilter);
+		Assert
+				.assertEquals(
+						"Number of html generated files, including the available_translations.html file.",
+						inputFiles.length + 1, htmlFiles.length);
+		for (int i = 0; i < htmlFiles.length; i += 1) {
+			File fileToCompare = new File(verifUTF16AptFolder, htmlFiles[i]
+					.getName());
+			compareFiles(fileToCompare, htmlFiles[i]);
+		}// for
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testExecute_KO() throws MojoExecutionException, IOException {
+		// Test with a null inputFolder.
+		try {
+			translationManagerMojo.inputFolder = null;
+			translationManagerMojo.execute();
+			Assert.fail("Null inputFolder is prohibited");
+		} catch (NullPointerException e) {
+			// Success.
+		}
+		// Test with a non directory folder.
+		try {
+			translationManagerMojo.inputFolder = new File(projectRoot,
+					"not a valid file");
+			translationManagerMojo.execute();
+			Assert.fail("inputFolder must be directory");
+		} catch (MojoExecutionException e) {
+			// Success.
+		}
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws UnsupportedEncodingException
+	 */
+	@Test
+	public void testLoadOneLangFile_OK() throws MojoExecutionException,
+			UnsupportedEncodingException {
+		File propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER
+				+ File.separator + "lang.properties");
+		Properties props = translationManagerMojo.loadOneLangFile(propFile,
+				"ASCII");
+		Assert.assertEquals("The lang.properties file contains 5 entries", 5,
+				props.size());
+		Assert
+				.assertEquals(
+						"The lang.properties file contains this entry",
+						"This is a key.With a new line in it, and with a \n character!",
+						props.get("aKey"));
+		Assert
+				.assertEquals(
+						"The lang.properties file contains this entry",
+						"This is another key.Also with a new line in it, and also with a \n character!",
+						props.get("anotherKey"));
+		Assert.assertEquals("The lang.properties file contains this entry",
+				"this it the last key", props.get("aLastKey"));
+
+		propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER + File.separator
+				+ "lang_fr.properties");
+		props = translationManagerMojo.loadOneLangFile(propFile, "UTF-8");
+		Assert.assertEquals("The lang_fr.properties file contains 4 entries",
+				4, props.size());
+		Assert.assertEquals("The lang_fr.properties file contains this entry",
+				"C'est une clef", props.get("aKey"));
+		// The properties files may not be in UTF-8, but our file is !
+		// Let's read the property, based on its UTF-8 inputEncoding.
+		String lastValue = ((String) props.get("aLastKey"));
+		Assert.assertEquals("The lang_fr.properties file contains this entry",
+				"C'est une derni\u00e8re clef\nAvec un passage à la ligne!",
+				lastValue);
+
+		propFile = new File(projectRoot, TEST_LANG_UTF16_FOLDER
+				+ File.separator + "lang_fr.properties");
+		props = translationManagerMojo.loadOneLangFile(propFile, "UTF-16");
+		Assert.assertEquals("The lang_fr.properties file contains 82 entries",
+				82, props.size());
+		// The properties files may not be in UTF-8, but our file is !
+		// Let's read the property, based on its UTF-8 inputEncoding.
+		String propName = "preparingFile";
+		String propValueNotEncoded = (String) props.get(propName);
+		Assert.assertNotNull("The '" + propName + "' should exist",
+				propValueNotEncoded);
+		Assert.assertEquals(
+				"The lang_fr.properties file contains this entry: '" + propName
+						+ "'", "Pr\u00E9paration du fichier %1$d/%2$d",
+				propValueNotEncoded);
+	}
+
+	/**
+	 */
+	@Test
+	public void testLoadOneLangFile_KO() {
+		File propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER
+				+ File.separator + "a_non_existing_file");
+		try {
+			translationManagerMojo.loadOneLangFile(propFile, "UTF-8");
+			Assert.fail(propFile.getAbsolutePath()
+					+ " doesn't exist: should throw an error");
+		} catch (MojoExecutionException e) {
+			// Success
+		}
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testFormatOneLangFile_utf8_OK() throws MojoExecutionException,
+			IOException {
+		File propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER
+				+ File.separator + "lang_fr.properties");
+		translationManagerMojo.formatOneLangFile(propFile, RESOURCE_ENCODING);
+
+		String generatedFile = translationManagerMojo.getWorkFolder()
+				.getAbsolutePath()
+				+ File.separator + propFile.getName();
+		File verifFile = new File(verifUTF8Folder, propFile.getName()
+				+ ".utf-8");
+		compareFiles(new File(generatedFile), verifFile);
+	}
+
+	/**
+	 * @throws IOException
+	 */
+	@Test
+	public void testFormatOneLangFile_utf8_KO() throws IOException {
+		copyInputFilesForTest(new File(projectRoot, TEST_LANG_KO_FOLDER),
+				RESOURCE_ENCODING);
+		File propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER
+				+ File.separator + "lang_fr.properties");
+		try {
+			translationManagerMojo.formatOneLangFile(propFile,
+					RESOURCE_ENCODING);
+			Assert.fail("processing lang.KO should throw an exception");
+		} catch (MojoExecutionException e) {
+			// Success!
+		}
+	}
+
+	/**
+	 * @throws FileNotFoundException
+	 */
+	@Test
+	public void testCloseStream() throws FileNotFoundException {
+		// Closing a null Closeable is allowed.
+		translationManagerMojo.closeStream(null,
+				"A null FileInputStream should not raise an exception");
+
+		FileInputStream fis = new FileInputStream(new File(inputFolder,
+				"lang.properties"));
+		translationManagerMojo.closeStream(fis, "A test FileInputStream");
+		// The stream must be closed. The only way to check that, is to try to
+		// read from it.
+		try {
+			fis.read();
+			Assert.fail("The stream should be closed!");
+		} catch (IOException e) {
+			// Ok !
+		}
+	}
+
+	/**
+	 * @throws Exception
+	 */
+	@Test
+	public void testCopyAllLangFilesToLangFolder() throws Exception {
+		File source = new File(translationManagerMojo.getWorkFolder(),
+				"lang_fr.properties");
+		File target = new File(translationManagerMojo.getInputFolder(),
+				"lang_fr.properties");
+		try {
+			compareFiles(source, target);
+			throw new Exception(
+					source.getAbsolutePath()
+							+ " and "
+							+ target.getAbsolutePath()
+							+ " should be different, before copying it back to the lang folder");
+		} catch (MojoExecutionException e1) {
+			// OK
+		}
+
+		translationManagerMojo.copyFile(new File(projectRoot,
+				DEFAULT_INPUT_FOLDER + File.separator + "lang_fr.properties"),
+				"UTF-8", source, "UTF-8");
+
+		translationManagerMojo.copyAllLangFilesToInputFolder();
+		// Then the files must be equals
+		compareFiles(source, target);
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testCopyAllLangFilesToResourcesLangFolder()
+			throws MojoExecutionException, IOException {
+		File propFile = new File(projectRoot, DEFAULT_INPUT_FOLDER
+				+ File.separator + "lang_fr.properties");
+		translationManagerMojo.formatOneLangFile(propFile, RESOURCE_ENCODING);
+		translationManagerMojo.copyAllLangFilesToResourcesLangFolder();
+
+		String generatedFile = translationManagerMojo.getResourceLangFolder()
+				.getAbsolutePath()
+				+ File.separator + propFile.getName();
+		File verifFile = new File(verifUTF8Folder, propFile.getName()
+				+ ".unicode");
+		compareFiles(new File(generatedFile), verifFile);
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 * @throws IOException
+	 */
+	@Test
+	public void testGenerateDocForOneTranslation()
+			throws MojoExecutionException, IOException {
+		File file = new File(verifUTF16Folder, "lang_fr.properties");
+		Properties props = new Properties();
+		props.setProperty("language", "French_for_test");
+		translationManagerMojo.setDocFileExtension(".apt");
+		translationManagerMojo.generateDocForOneTranslation(file, props);
+
+		File generatedFile = new File(translationManagerMojo.getDocFolder(),
+				"lang_fr.properties.apt");
+		File verifFolder = new File(projectRoot,
+				"src/test/resources/testGenerateDocForOneTranslation");
+		File verifFile = new File(verifFolder, "lang_fr.properties.apt");
+		compareFiles(generatedFile, verifFile);
+	}
+
+	/**
+	 * Test of the setCoppermineFolder parameter. Tests its constaints
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetCoppermineFolder() throws MojoExecutionException {
+		// null folder are allowed.
+		translationManagerMojo.setCoppermineFolder(null);
+		Assert.assertNull("coppermineFolder may be null",
+				translationManagerMojo.coppermineFolder);
+		Assert.assertNull("coppermineFolder may be null",
+				translationManagerMojo.getCoppermineFolder());
+
+		// If it exists, it must be a folder.
+		try {
+			translationManagerMojo.setCoppermineFolder(new File(projectRoot,
+					DEFAULT_INPUT_FOLDER + File.separator + "lang.properties"));
+			Assert.fail("If it exists, it must be a folder");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		// If it is not null, it must exist
+		try {
+			translationManagerMojo.setCoppermineFolder(new File(projectRoot,
+					File.separator + "not_target" + File.separator
+							+ "this_folder_does_not_exist"));
+			Assert
+					.fail("coppermineFolder which doesn't exist is allowed, only if the path contains /target/");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		// coppermineFolder must exist. We take a valid folder.
+		File coppermineFolder = docFolder;
+		translationManagerMojo.coppermineFolder = null;
+		translationManagerMojo.setCoppermineFolder(coppermineFolder);
+		Assert.assertEquals("coppermineFolder must be set", coppermineFolder,
+				translationManagerMojo.coppermineFolder);
+		Assert.assertEquals("coppermineFolder must be set", coppermineFolder,
+				translationManagerMojo.getCoppermineFolder());
+	}
+
+	/**
+	 * Test of the setHtmlFolder parameter. Tests its constaints
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetDocFolder() throws MojoExecutionException {
+		// null folder are allowed.
+		translationManagerMojo.setDocFolder(null);
+		Assert.assertNull("docFolder may be null",
+				translationManagerMojo.docFolder);
+		Assert.assertNull("docFolder may be null", translationManagerMojo
+				.getDocFolder());
+
+		// If it exists, it must be a folder.
+		try {
+			translationManagerMojo.setDocFolder(new File(projectRoot,
+					DEFAULT_INPUT_FOLDER + File.separator + "lang.properties"));
+			Assert.fail("If it exists, it must be a folder");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		// If it doesn't exist, it must be within the /target/ folder.
+		translationManagerMojo.setDocFolder(new File(projectRoot,
+				DEFAULT_INPUT_FOLDER + File.separator + "target"
+						+ File.separator + "lang.properties"));
+		try {
+			translationManagerMojo.setDocFolder(new File(projectRoot,
+					File.separator + "not_target" + File.separator
+							+ "this_folder_does_not_exist"));
+			Assert
+					.fail("docFolder which doesn't exist is allowed, if the path contains /target/");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		translationManagerMojo.docFolder = null;
+		translationManagerMojo.setDocFolder(docFolder);
+		Assert.assertEquals("docFolder should be null", docFolder,
+				translationManagerMojo.docFolder);
+		Assert.assertEquals("docFolder should be null", docFolder,
+				translationManagerMojo.getDocFolder());
+	}
+
+	/**
+	 * Test of the setHtmlFolder parameter. Tests its constaints
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetDocExtension() throws MojoExecutionException {
+		// null folder are allowed.
+		translationManagerMojo.setDocFileExtension(null);
+		Assert.assertNull("docFileExtension may be null",
+				translationManagerMojo.docFileExtension);
+		Assert
+				.assertEquals(
+						"docFileExtension may be null. getDocFileExtension() should return an empty string",
+						"", translationManagerMojo.getDocFileExtension());
+
+		String docFileExtension = ".an_extension";
+		translationManagerMojo.setDocFileExtension(docFileExtension);
+		Assert.assertEquals("DocFileExtension must be set", docFileExtension,
+				translationManagerMojo.docFileExtension);
+		Assert
+				.assertEquals(
+						"When DocFileExtension is null, getDocFileExtension() should return an empty string",
+						docFileExtension, translationManagerMojo
+								.getDocFileExtension());
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetInputEncoding() throws MojoExecutionException {
+		Assert.assertEquals("Default inputEncoding is UTF-8",
+				translationManagerMojo.inputEncoding, "UTF-8");
+
+		translationManagerMojo.setInputEncoding("UTF-16");
+		Assert.assertEquals(translationManagerMojo.inputEncoding, "UTF-16");
+
+		translationManagerMojo.setInputEncoding("UTF-8");
+		Assert.assertEquals("Setting to UTF-8",
+				translationManagerMojo.inputEncoding, "UTF-8");
+
+		try {
+			translationManagerMojo.setInputEncoding(null);
+			Assert.fail("inputEncoding null value should be prohibited");
+		} catch (NullPointerException e) {
+			// Success!
+		}
+		try {
+			translationManagerMojo
+					.setInputEncoding("Not a valid inputEncoding");
+			Assert
+					.fail("inputEncoding value has a limited set of valid values");
+		} catch (MojoExecutionException e) {
+			// Success!
+		}
+
+	}
+
+	/** */
+	@Test
+	public void testGetLangFolder() {
+		Assert.assertEquals(translationManagerMojo.inputFolder,
+				translationManagerMojo.getInputFolder());
+		translationManagerMojo.inputFolder = null;
+		Assert.assertEquals(translationManagerMojo.inputFolder,
+				translationManagerMojo.getInputFolder());
+	}
+
+	/**
+	 * Test of the setLangFolder parameter. Tests its constaints
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetInputFolder() throws MojoExecutionException {
+		// null folder are forbidden.
+		try {
+			translationManagerMojo.setInputFolder(null);
+			Assert.fail("null folder are forbidden");
+		} catch (NullPointerException e) {
+			// Ok !
+		}
+
+		// If it exists, it must be a folder.
+		try {
+			translationManagerMojo.setInputFolder(new File(projectRoot,
+					DEFAULT_INPUT_FOLDER + File.separator + "lang.properties"));
+			Assert.fail("If it exists, it must be a folder");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		translationManagerMojo.inputFolder = null;
+		translationManagerMojo.setInputFolder(new File(projectRoot,
+				DEFAULT_INPUT_FOLDER));
+		Assert.assertEquals("inputFolder must be set", inputFolder,
+				translationManagerMojo.inputFolder);
+
+	}
+
+	/**
+	 */
+	@Test
+	public void testGetWorkDirectory() {
+		Assert.assertEquals(translationManagerMojo.workFolder,
+				translationManagerMojo.getWorkFolder());
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetWorkDirectory() throws MojoExecutionException {
+		File dummyWorkDirectory = new File("target/a_dummy_folder");
+		Assert.assertNotSame(translationManagerMojo.getWorkFolder(),
+				dummyWorkDirectory);
+
+		// null folder are forbidden.
+		try {
+			translationManagerMojo.setWorkFolder(null);
+			Assert.fail("null folder are forbidden");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		// If it exists, it must be a folder.
+		try {
+			translationManagerMojo.setWorkFolder(new File(projectRoot,
+					DEFAULT_INPUT_FOLDER + File.separator + "lang.properties"));
+			Assert.fail("If it exists, it must be a folder");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+
+		// We want to test the folder creation.
+		if (dummyWorkDirectory.exists()) {
+			dummyWorkDirectory.delete();
+		}
+		Assert.assertFalse("The " + dummyWorkDirectory.getAbsolutePath()
+				+ " should not exist", dummyWorkDirectory.exists());
+
+		// Let's go...
+		translationManagerMojo.setWorkFolder(dummyWorkDirectory);
+		Assert.assertEquals("After setter: the property should be set!",
+				translationManagerMojo.getWorkFolder(), dummyWorkDirectory);
+		Assert.assertTrue("The " + dummyWorkDirectory.getAbsolutePath()
+				+ " should exist", dummyWorkDirectory.exists());
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetResourceLangFolder() throws MojoExecutionException {
+		translationManagerMojo.resourceLangFolder = null;
+		translationManagerMojo.setResourceLangFolder(resourceLangFolder);
+		Assert.assertEquals("resourceLangFolder must be set",
+				resourceLangFolder, translationManagerMojo.resourceLangFolder);
+
+		// null folder are forbidden.
+		try {
+			translationManagerMojo.setResourceLangFolder(null);
+			Assert.fail("null folder are forbidden");
+		} catch (NullPointerException e) {
+			// Ok !
+		}
+
+		// If it exists, it must be a folder.
+		try {
+			translationManagerMojo.setResourceLangFolder(new File(projectRoot,
+					DEFAULT_INPUT_FOLDER + File.separator + "lang.properties"));
+			Assert.fail("If it exists, it must be a folder");
+		} catch (MojoExecutionException e) {
+			// Ok !
+		}
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetTemplateAvailableTranslation()
+			throws MojoExecutionException {
+		translationManagerMojo.templateAvailableTranslation = null;
+		Assert.assertNull("templateAvailableTranslation should be null",
+				translationManagerMojo.getTemplateAvailableTranslation());
+
+		String s = "a_non_existing_template";
+		try {
+			translationManagerMojo.setTemplateAvailableTranslation(s);
+			Assert
+					.fail("Call to setTemplateAvailableTranslation must be done with a valid file as an argument");
+		} catch (MojoExecutionException e) {
+			// Success!
+		}
+
+		s = "src/test/resources/one_translation.template";
+		translationManagerMojo.setTemplateAvailableTranslation(s);
+		Assert.assertEquals("Test 1", s,
+				translationManagerMojo.templateAvailableTranslation);
+		Assert.assertEquals("Test 1", s, translationManagerMojo
+				.getTemplateAvailableTranslation());
+
+		translationManagerMojo.setTemplateAvailableTranslation(null);
+		Assert.assertNull("templateAvailableTranslation should be null",
+				translationManagerMojo.templateAvailableTranslation);
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	@Test
+	public void testSetTemplateOneTranslation() throws MojoExecutionException {
+		translationManagerMojo.templateOneTranslation = null;
+		Assert.assertNull("templateOneTranslation should be null",
+				translationManagerMojo.getTemplateOneTranslation());
+
+		String s = "a_non_existing_template";
+		try {
+			translationManagerMojo.setTemplateOneTranslation(s);
+			Assert
+					.fail("Call to setTemplateOneTranslation must be done with a valid file as an argument");
+		} catch (MojoExecutionException e) {
+			// Success!
+		}
+
+		s = "src/test/resources/one_translation.template";
+		translationManagerMojo.setTemplateOneTranslation(s);
+		Assert.assertEquals("Test 1", s,
+				translationManagerMojo.templateOneTranslation);
+		Assert.assertEquals("Test 1", s, translationManagerMojo
+				.getTemplateOneTranslation());
+
+		translationManagerMojo.setTemplateOneTranslation(null);
+		Assert.assertNull("templateOneTranslation should be null",
+				translationManagerMojo.templateOneTranslation);
+	}
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar.properties.apt	(revision 3951)
@@ -0,0 +1,378 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Arabic)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Ø§Ø³ØªØ¹Ø±Ø§Ø¶ ...
+buttonRemoveSelected = Ø§ÙØºØ§Ø¡ Ø§ÙØ§Ø®ØªÙØ§Ø±
+buttonRemoveAll = Ø§ÙØºØ§Ø¡ Ø§ÙÙÙ
+buttonRotateLeft = Ø§Ø¯Ø§Ø±Ø© ÙÙÙØ³Ø§Ø±
+buttonRotateRight = Ø§Ø¯Ø§Ø±Ø© ÙÙÙÙ
+ÙÙ
+buttonUpload = Ø±ÙØ¹
+buttonStop = Ø§ÙÙØ§Ù
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d Ø¯ÙÙÙØ©. Ù %3$d Ø«Ø§ÙÙØ©.
+timefmt_ms = %1$d Ø¯ÙÙÙØ©. Ù %2$d Ø«Ø§ÙÙØ©.
+timefmt_s = %1$d Ø«ÙØ§ÙÙ
+timefmt_unknown = ØºÙØ± Ù
+Ø¹Ø±ÙÙ
+status_msg = Ø¬Ù Ø§ØšÙÙØ¯ %1$d%% Ø§ÙØªÙÙ, Ø³Ø±Ø¹Ø© Ø§ÙÙÙÙ: %2$s, ØªÙØ±ÙØšØ§: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ø­Ø¬Ù
+ Ø§ÙÙ
+ÙÙ ÙÙ '%1$s' ÙØšÙØ± (%2$s)
+
+#FileUploadThread
+preparingFile = ØªØ­Ø¶ÙØ± Ø§ÙÙ
+ÙÙ %1$d/%2$d
+infoUploading = Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª %1$s
+infoUploaded = %1$s Ù
+ÙÙ Ø±ÙØ¹Ø©. Ø§ÙØªØžØ§Ø± Ø±Ø¯ Ø§ÙØ³ÙØ±ÙØ± ...
+infoAborted = ØªÙ
+ Ø§ÙØºØ§Ø¡ Ø§ÙØ±ÙØ¹ %1$d Ù
+ÙÙ.
+nbUploadedFiles = %1$d Ø§ÙÙ
+ÙÙ Ø§Ù Ø§ÙÙÙØ§Øª Ø±ÙØ¹Ø©
+errDuringUpload = ØªÙ
+ Ø§ÙØºØ§Ø¡ Ø§ÙØ±ÙØ¹ ØšØ£Ø®Ø·Ø§Ø¡
+errHttpResponse = Ø§ÙØ±ÙØ¹ ÙØŽÙ: Ø±Ø¯ Ø§ÙØ³ÙØ±ÙØ± ØºÙØ± Ù
+ØªÙÙØ¹
+questionSendMailOnError = Ø­Ø¯Ø« Ø®Ø·Ø§Ø¡ Ø§Ø«ÙØ§Ø¡ Ø§ÙØ±ÙØ¹. ÙÙ ØªØ±ÙØ¯ Ø§Ø±Ø³Ø§Ù ØšÙØ§ÙØ§Øª Ø§ÙØ®Ø·Ø£ Ø§ÙÙ Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ø§ÙØ§Ø³Ù
+
+colSize = Ø§ÙØ­Ø¬Ù
+
+colDirectory = Ø§ÙÙ
+Ø¬ÙØ¯
+colModified = Ø¹Ø¯Ù
+colReadable = ÙØ§ØšÙ ÙÙÙØ±Ø§Ø¡Ø©?
+errForbiddenExtension = Ø§Ù
+ØªØ¯Ø§Ø¯Ø§Øª ØºÙØ± Ù
+Ø³Ù
+ÙØ­Ø©.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ø­Ø¯Ø« Ø®Ø·Ø£ Ø§Ø«ÙØ§Ø¡ Ø§Ø¯Ø§Ø±Ø© Ø§ÙØ³Ø¬Ù
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§.
+coppermineUploadOk = ØªÙ
+ Ø±ÙØ¹ Ø§ÙØµÙØ± ØšÙØ¬Ø§Ø­, ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø®ØªØ§Ø±.\n\n Ø§ÙÙØ± Ø§ÙÙÙØ© ÙØªØ¹Ø¯ÙÙ Ø§Ø³Ù
+ Ù Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØµÙØ±.\n\n ÙØ§ ØªÙØ³Ù Ø§ÙÙÙØ± Ø¹ÙÙ 'Ø²Ø± ØªÙÙÙØ° Ø§ÙØªØ¹Ø¯ÙÙØ§Øª' ÙÙØªÙ
+ Ø­ÙØž Ø§ÙØªØ¹Ø¯ÙÙØ§Øª ÙÙ Ø§ÙØ³ÙØ±ÙØ± !
+
+#PictureFileData
+tooBigPicture = Ø§ÙØµÙØ±Ø© '%1$s' ÙØšÙØ±Ø© Ø¬Ø¯Ø§. Ø³ÙÙ ÙØªÙ
+ Ø±ÙØ¹ÙØ§ ØšØ¯ÙÙ ØªØ¹Ø¯ÙÙ (ØªØµØºÙØ± Ø§Ù ØžØºØ·...).
+notAPicture = Ø§ÙÙ
+ÙÙ ØšØ£Ø³Ù
+ '%1$s' ÙÙØ³ ØµÙØ±Ø©. ÙÙ ÙØªÙ
+ Ø§Ø¶Ø§ÙØªÙ Ø§ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ÙÙØ¹Ø©.
+
+#PictureDialog
+buttonClose = Ø§ØºÙØ§Ù
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = ØªØ£ÙÙØ¯
+
+#InteractiveTrustManager
+itm_title_pass = Ø§Ø¯Ø®Ù %1$s ÙÙÙ
+Ø© Ø§ÙØ³Ø±
+itm_prompt_pass = %1$s ÙÙÙ
+Ø© Ø§ÙØ³Ø±:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Ø§ÙÙ
+ÙØ¶ÙØ¹:
+itm_cert_issuer = Ø§ÙÙ
+ØŽÙÙØ©:
+itm_cert_nbefore = ÙÙØ³ ÙØšÙ:
+itm_cert_nafter = ÙÙØ³ ØšØ¹Ø¯:
+itm_cert_serial = Ø§ÙØ±ÙÙ
+ Ø§ÙØªØ³ÙØ³ÙÙ:
+itm_cert_fprint = %1$s ØšØµÙ
+Ø©:
+itm_cert_C = Ø§ÙØšÙØ¯:
+itm_cert_CN = Ø§ÙØ§Ø³Ù
+ Ø§ÙØŽØ§ØŠØ¹:
+itm_cert_L = Ø§ÙÙ
+ÙÙØ¹:
+itm_cert_ST = Ø§ÙÙÙØ§ÙØ© Ø§Ù Ø§ÙÙ
+ÙØ§Ø·Ø¹Ø©:
+itm_cert_O = Ø§ÙÙ
+Ø€Ø³Ø³Ø©:
+itm_cert_OU = Organizational unit:
+itm_reasons = Ø§ÙØ§Ø³ØšØ§Øš:
+itm_reason_cnmatch = Ø§ÙØ§Ø³Ù
+ Ø§ÙØŽØ§ØŠØ¹ ÙØ§ ÙØ·Ø§ØšÙ Ø§Ø³Ù
+ Ø§ÙÙ
+Ø³ØªØ¶ÙÙ (%1$s).
+itm_reason_itrust = Ø§ÙØªØ±Ø®ÙØµ ØºÙØ± Ù
+ÙØ«ÙÙ.
+itm_reason_expired = Ø§ÙØªØ±Ø®ÙØµ Ø§ÙØªÙÙ.
+itm_reason_notyet = ÙÙ
+ ÙØªÙ
+ Ø§ÙØªØ£ÙØ¯ Ù
+Ù Ø§ÙØªØ±Ø®ÙØµ.
+itm_fail_verify = Ø§ÙØªØ±Ø®ÙØµ, Ù
+Ù Ø§ÙØ³ÙØ±ÙØ± ÙÙ
+ ÙØªÙ
+ ØªØ£ÙÙØ¯Ù.
+itm_accept_prompt = ÙÙ ØªØ±ÙØ¯ ÙØšÙÙ Ø§ÙØªØ±Ø®ÙØµ?
+itm_accept_always = Ø¯Ø§ØŠÙ
+Ø§
+itm_accept_now = ÙÙØ°Ù Ø§ÙØ¬ÙØ³Ø© ÙÙØ·
+itm_accept_no = ÙØ§
+itm_new_tstore = Ù
+ÙØ§Ù ØªØ®Ø²ÙÙ Ù
+ÙØ«ÙÙ Ø¬Ø¯ÙØ¯
+itm_tstore = Ù
+ÙØ§Ù ØªØ®Ø²ÙÙ
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <arabic.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// Maintainer: "Abdulrhman Alkhodiry" <almooheb@gmail.com>  
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'Ø¬Ù Ø§ØšÙÙØ¯',
+		  'link_comment' => 'Ø±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹, ØšØ³ØªØ®Ø¯Ø§Ù
+ Ø¬Ù Ø§ØšÙÙØ¯',
+		  'perm_denied' => 'ÙÙØ³Øª ÙØ¯ÙÙ Ø§ÙØµÙØ§Ø­ÙØ© ÙØªÙÙÙØ° ÙØ°Ø§ Ø§ÙØ§Ù
+Ø±.<BR><BR>Ø§Ø°Ø§ ÙÙ
+ ØªØ³Ø¬Ù Ø§ÙØ¯Ø®ÙÙ, Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ø¬ÙÙ <a href="$1">Ø§ÙØ¯Ø®ÙÙ</a> Ø§ÙÙØ§',
+		  'select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+, Ø§ÙØ°Ù Ø³ØªÙÙÙ
+ ØšØ±ÙØ¹ Ø§ÙØµÙØ± Ø¥ÙÙÙ',
+		  'button_update_album' => 'ØªØ­Ø¯ÙØ« Ø§ÙØ§ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÙØŽØ§Ø¡ Ø§ÙØ§ÙØšÙÙ
+',
+		  'success' => 'ØªÙ
+ Ø§ÙØªÙÙÙØ° ØšÙØ¬Ø§Ø­ !',
+		  'error_select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§',
+		  'error_album_name' => 'Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ù
+ÙØ© Ø§ÙØ§ÙØšÙÙ
+.',
+		  'error_album_already_exists' => 'ÙÙØ¬Ø¯ Ø§ÙØšÙÙ
+ ØšÙØ§Ø°Ø§ Ø§ÙØ§Ø³Ù
+.<BR><BR>Ø§ÙØ±Ø¬Ø§Ø¡ Ø§ÙØ±Ø¬ÙØ¹ Ø§ÙÙ <I>Ø§ÙØ®ÙÙ</I> ØšØ§ÙÙ
+ØªØµÙØ­ ÙØ§Ø®ØªÙØ§Ø± Ø§Ø³Ù
+ Ø¢Ø®Ø± ÙÙØ§ÙØšÙÙ
+.',
+		  'album_name' => 'Ø§Ø³Ù
+ Ø§ÙØ§ÙØšÙÙ
+',
+		  'album_presentation' => 'ÙØ¬Øš Ø¹ÙÙÙ Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+. Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±Ø³Ù Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹ Ø³ÙØªÙ
+ ØªØ®Ø²ÙÙÙØ§ ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯. <BR>Ø§Ø°Ø§ ÙØ§Ù ÙØ§ ÙÙØ¬Ø¯ ÙØ¯ÙÙ Ø§Ù Ø¥ÙØšÙÙ
+, ÙØ§ØŠÙ
+Ø© Ø§ÙØ§ÙØšÙÙ
+Ø§Øª Ø®Ø§ÙÙØ©. Ø§ÙÙØ± Ø¹ÙÙ \'Ø§ÙØŽØ§Ø¡\' button to create your first album.',
+		  'album_description' => 'ÙØµÙ Ø§ÙØ§ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§Ø¶Ø§ÙØ© ØµÙØ±Ø© Ø§ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯',
+		  'max_upload_size' => 'Ø§ÙØ­Ø¬Ù
+ Ø§ÙØ§ÙØµÙ ÙÙØµÙØ±Ø© ÙÙ $1 KB',
+		  'upload_presentation' => 'Ø§Ø°Ø§ Ø§ÙÙ
+Ø±ØšØ¹ ØšØ§ÙØ§Ø³ÙÙ ÙØ§ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§, ÙØŽØ±ÙØ· Ø§ÙØ­Ø§ÙØ© ØšØ§ÙØ§Ø³ÙÙ ÙÙØ¶Ø­ ÙØ¬ÙØ¯ Ø®Ø·Ø£, Ø§ÙØ­Ù Ø§ÙØ§ÙØ¶Ù ÙÙ ØªØ«ØšÙØª Ù
+ÙÙØ§Øª Ø§ÙØ¬Ø§ÙØ§.<BR>ØšØ¹Ø¯ Ø°ÙÙ, Ø±ÙØ¹ Ø§ÙØµÙØ± ÙÙÙ
+ÙÙØ¹ Ø³ÙÙ Ø¬Ø¯Ø§! ÙÙØ· ÙÙ
+ ØšØ§ÙÙÙØ± Ø¹ÙÙ <B>Ø§Ø³ØªØ¹Ø±Ø§Ø¶</B> ÙØ§Ø®ØªÙØ§Ø± Ø§ÙÙ
+ÙÙØ§Øª Ø§Ù ÙÙ
+ ØšØ³Ø­Øš Ø§ÙÙ
+ÙÙ Ù Ø§ÙÙØ§Ø¡Ù Ø¹ÙÙ Ø§ÙÙ
+Ø³ØªØ¹Ø±Ø¶ , Ø«Ù
+ Ø§ÙÙØ± Ø¹ÙÙ <B>Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª</B> ÙØ±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		. "<BR>ÙØ³ØªØ®Ø¯Ø§Ù
+ <U>ØµÙØ­Ø© Ø§ÙØ±ÙØ¹ Ø§ÙÙØ¯ÙÙ
+Ø©</U>, <a href='upload.php'>Ø§Ø¶ØºØ· ÙÙØ§</a>.",
+		  'album' => 'Ø§ÙØšÙÙ
+ Ø§ÙØµÙØ±',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø§ÙÙ
+ØªØµÙØ­ ÙØ§ ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±Ø§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§ _ Ø§ØšÙÙØª. ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ±ÙØ¹ ÙØ­ØªØ§Ø¬ Ø¬Ø§ÙØ§. ØªØ³ØªØ·ÙØ¹ ØªØ­Ù
+ÙÙ Ù
+ØŽØºÙ Ø§ÙØ¬Ø§ÙØ§ ØšØ³ÙÙÙØ© Ù
+Ù <a href="http:\\java.sun.com\jre\">Ù
+ÙÙØ¹ Ø¬Ø§ÙØ§</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Ø§Ø¶ØºØ· Ø¹ÙÙ Ø§ÙØ±Ø§ØšØ·, ÙÙÙ
+ ØšØ£Ø¯Ø®Ø§Ù Ø§ÙØšÙØ§ÙØ§Øª ÙÙ Ø§ÙØ§Ø³ÙÙ, Ø§Ø°Ø§ Ø§Ø±Ø¯Øª Ø­ÙØž Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙ Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±ÙØ¹.',
+		  'quota_used' => 'Ø§ÙØª ØªØ³ØªØ®Ø¯Ù
+ $1 MB ($2%) Ù
+Ù $3 MB Ø§ÙÙ
+Ø³Ø§Ø­Ø© Ø§ÙØ§Ø¬Ù
+Ø§ÙÙØ©.',
+		  'quota_about_full' => 'Ø§Ø­Ø°Ù ØšØ¹Ø¶ Ø§ÙØµÙØ±, Ø§Ù ÙÙ
+ ØšØ·ÙØš Ø²ÙØ§Ø¯Ø© Ø§ÙÙ
+Ø³Ø§Ø­Ø© ÙÙÙ
+ÙÙØ¹ Ù
+Ù Ø§ÙØŽØ±ÙØ© Ø§ÙÙ
+Ø³ØªØ¶ÙÙØ©.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÙÙ Ø§ÙØªØžØ§Ø± Ù
+ÙØ§ÙÙØ© Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹ Ø¹ÙÙ Ø§ÙØµÙØ±, ÙØšÙ Ø§Ù ØªØ³ØªØ·ÙØ¹ Ø±Ø£ÙØªÙÙ
+ ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_en.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_en.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_en.properties.apt	(revision 3951)
@@ -0,0 +1,252 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (English)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = English
+contributor = No maintainer (same content as lang.properties)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   The translation for English doesn't exist. Please create a new one, based on the English translation below... 
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Upload files to the gallery, with the help of an applet',
+		  'perm_denied' => 'You don\'t have permission to perform this operation.<BR><BR>If you\'re not connected, please <a href="$1">login</a> first',
+		  'select_album' => 'Please, choose an album, where you want to upload pictures',
+		  'button_update_album' => 'Update album',
+		  'button_create_album' => 'Create album',
+		  'success' => 'Action success !',
+		  'error_select_album' => 'Please, choose an album first',
+		  'error_album_name' => 'Please give a name to the album.',
+		  'error_album_already_exists' => 'You already own an album with this name.<BR><BR>Please click on the <I>Back</I> button of your navigator, to type another title for your new album.',
+		  'album_name' => 'Album name',
+		  'album_presentation' => 'You must select an album here. The pictures you\'ll send to the server will be stored in this album. <BR>If you don\'t have any album, the album list is empty. Use the \'Create\' button to create your first album.',
+		  'album_description' => 'Album description',
+		  'add_pictures' => 'Add pictures to the selected album',
+		  'max_upload_size' => 'The maximum size for a picture is $1 KB',
+		  'upload_presentation' => 'If the square below definitely refuses to display the applet, and the navigator indicates that there are errors on this page, a good idea would be to install the java runtime plugin.<BR>After, upload is really simple! Click on <B>Browse</B> to select files or use drag\'n\'drop from the explorer, then click on <B>Upload</B> to send the pictures to the server.'
+		. "<BR>To use the <U>old upload page</U>, <a href='upload.php'>click here</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Click here, to see the URL of the uploaded pictures, contained on this page'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_eo.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_eo.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_eo.properties.apt	(revision 3951)
@@ -0,0 +1,251 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Esperanto)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Esperanto
+contributor = Chuck Smith
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = esperanto
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Foliumi ...
+buttonRemoveSelected = Forigu Elektita(j)
+buttonRemoveAll = Forigu Äiujn
+buttonRotateLeft = Turnigu maldekstren
+buttonRotateRight = Turnigu dekstren
+buttonUpload = AlÅuti
+buttonStop = HALTI
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. kaj %3$d sek.
+timefmt_ms = %1$d min. kaj %2$d sek.
+timefmt_s = %1$d sekundoj
+timefmt_unknown = nekonata
+status_msg = JUpload %1$d%% finita, transferrapideco: %2$s, restas: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparante dosierojn %1$d/%2$d
+infoUploading = AlÅutante dosierojn %1$s
+infoUploaded = Dosiero(j) %1$s alÅutita(j). Atendante servilan respondon ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d dosieroj alÅutitaj
+errDuringUpload = AlÅutado haltita pro eraroj
+errHttpResponse = La HTTP-respondo de la servilo ne taÅ­gas. La alÅuto malsukcesis.
+questionSendMailOnError = Eraro okazis alÅutante.  Äu vi volas sendi Äiujn rilatajn informojn al la retestro?
+
+#DialogUploadRetry
+dialogUploadRetryText = Eraro okazis dum alÅuto de la dosieroj al la servilo. Äu vi volas reprovi alÅuti la dosierojn?\n\nLa alÅuto aÅ­tomate rekomencos post %1$d sekundoj.
+dialogUploadRetryTitle = Reprovi la alÅuton?
+buttonDetails = Detaloj
+buttonYes = Jes
+buttonNo = Ne
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nomo
+colSize = Grandeco
+colDirectory = Dosierujo
+colModified = ÅanÄita
+colReadable = Legebla?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Eraro okazis dum log-administrado
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bonvolu unue elekti fotoalbumon.
+coppermineUploadOk = La fotoj bone alÅutiÄis al la servilo en la elektita fotoalbumo.\n\nKlaku sur Bone nun por asociigi nomojn kaj komentojn al tiujn fotojn.\n\nNe forgesu klaki sur la 'Butono de Aktivigu ÅanÄon' por konservi viajn ÅanÄojn al la servilo!
+
+#PictureFileData
+tooBigPicture = Bildo '%1$s' tro grandas. Äi alÅutiÄos neÅanÄite (sen turno, ÅanÄeco de grandeco ktp).
+notAPicture = La dosiero nomata '%1$s' ne estas bildo. Äi ne aldoniÄas al la alÅutota dosieraro.
+
+#PictureDialog
+buttonClose = Fermi
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Konfirmi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <esperanto.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Vi ne rajtas fari tion.<br><br>If vi ne estas konektita, bonvolu <a href="$1">ensaluti</a> unue',
+		  'select_album' => "Bonvolu elekti fotoalbumon, kie vi volas al\u015Duti fotojn",
+		  'button_update_album' => "\u011Cidatigu albumon",
+		  'button_create_album' => 'Kreu albumon',
+		  'success' => 'Sukceso!',
+		  'error_select_album' => 'Bonvolu elekti fotoalbumon unue',
+		  'error_album_name' => 'Bonvolu nomi la fotoalbumon.',
+		  'error_album_already_exists' => 'Vi jam havas albumon kun tiu nomo.<br><br>Bonvolu klaki sur la <i>Reen</i>-butono de via retumilo, por tajpi alian titolon por via nova fotoalbumo.',
+		  'album_name' => 'Albuma nomo',
+		  'album_presentation' => "Vi devas elekti albumon \u0109i tie.  La bildoj kiujn vi sendis al la servilo konservi/u011Dos en \u0109i tiu albumo.<br>Se vi ne havas albumon, la albuma listo estas malplena. Uzu la 'Kreu'-butonon por krei vian unuan albumon.",
+		  'album_description' => 'Albuma priskribo',
+		  'add_pictures' => 'Aldonu bildojn al la elektita albumo',
+		  'max_upload_size' => 'La maksimuma grandeco por bildo estas $1 Kb',
+		  'upload_presentation' => "Se la kvadrato sube rifuzas montri la apleton, kaj la retumilo indikas ke estas eraroj sur la pa/u011Do, bona ideo estus instali la \"Java Runtime Plugin\".<br>Poste, al\u015Dutado simplos! Klaku sur <b>Foliumi</b> por elekti dosierojn a\u016D uzu \"klaktenu kaj metu\" de la retumilo, tiam klaku sur <b>Al\u015Duti</b> por sendi la bildojn al la servilo."
+		  . "<br>Por uzi la <u>malnova al\u015Duta pa/u011Do</u>, <a href='upload.php'>klaku \u0109i tie</a>.",
+		  'album' => 'Albumo',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_cs.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_cs.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_cs.properties.apt	(revision 3951)
@@ -0,0 +1,249 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Czech)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Czech
+contributor = Vladan Zajda
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = czech
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = ProchÃ¡zet ...
+buttonRemoveSelected = Odstranit oznaÄenÃ©
+buttonRemoveAll = Odstranit vÅ¡e
+buttonRotateLeft = OtoÄit vlevo
+buttonRotateRight = OtoÄit vpravo
+buttonUpload = PÅenÃ©st
+buttonStop = UKONÄIT
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Soubor %1 je pÅÃ­liÅ¡ velikÃœ (%2 bytÅ¯)
+
+#FileUploadThread
+preparingFile = PÅipravuji soubor %1
+infoUploading = PÅenÃ¡Å¡Ã­m soubory %1
+infoUploaded = %1 soubor(Å¯) pÅeneseno. ÄekÃ¡m na odpovÄÄ serveru ...
+infoAborted = PÅenos byl pÅeruÅ¡en po %1 souborech.
+nbUploadedFiles = %1 soubor(Å¯) pÅeneseno
+errDuringUpload = PÅenos byl ukonÄen s chybami
+errHttpResponse = PÅenos byl ukonÄen: neoÄekÃ¡vanÃ¡ odpovÄÄ HTTP
+questionSendMailOnError = Nastala chyba pÅi pÅenosu. PÅejete si odeslat detailnÃ­ informace sprÃ¡vci serveru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = NÃ¡zev
+colSize = Velikost
+colDirectory = AdresÃ¡Å
+colModified = ModifikovÃ¡no
+colReadable = ÄitelnÃœ?
+errForbiddenExtension = ZakÂ zanÂ  souborovÂ  prÂ¡pona.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Nastala chyba pÅi zpracovÃ¡nÃ­ logu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Nejprve prosÃ­m vyberte album.
+coppermineUploadOk = ObrÃ¡zky byly ÃºspÄÅ¡nÄ pÅeneseny do vybranÃ©ho alba na serveru.\n\nNynÃ­ kliknÄte OK abyste mohli pÅiÅadit nÃ¡zvy a komentÃ¡Åe k obrÃ¡zkÅ¯m.\n\nNezapomeÅte kliknout na tlaÄÃ­tko 'UloÅŸit Ãºpravy', aby doÅ¡lo k uloÅŸenÃ­ Ãºprav na serveru !
+
+#PictureFileData
+tooBigPicture = ObrÃ¡zek %1 je pÅÃ­liÅ¡ velkÃœ. Bude pÅenesen neupravenÃœ (bez otoÄenÃ­, zmÄny velikosti...).
+notAPicture = Soubor s nÃ¡zvem '%1' nenÃ­ obrÃ¡zek. Nebyl tedy vloÅŸen do seznamu souborÅ¯ k pÅenesenÃ­.
+
+#PictureDialog
+buttonClose = ZavÅÃ­t
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdit
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <czech.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'K provedenÃ­ tÃ©to operace nemÃ¡te dostateÄnÃ¡ oprÃ¡vnÄnÃ­.<BR><BR>Pokud nejste pÅipojen, <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">pÅihlaÅ¡te se</a> prosÃ­m',
+		  'select_album' => 'Vyberte prosÃ­m album, do kterÃ©ho si pÅejete pÅenÃ©st obrÃ¡zky',
+		  'button_update_album' => 'Aktualizovat album',
+		  'button_create_album' => 'VytvoÅit album',
+		  'success' => 'ÃspÄÅ¡nÄ provedeno !',
+		  'error_select_album' => 'Nejprve prosÃ­m vyberte album',
+		  'error_album_name' => 'Zadejte prosÃ­m nÃ¡zev alba.',
+		  'error_album_already_exists' => 'Album s tÃ­mto nÃ¡zvem jiÅŸ vlastnÃ­te.<BR><BR>KliknÄte prosÃ­m na tlaÄÃ­tko<I>ZpÄt</I> vaÅ¡eho prohlÃ­ÅŸeÄe, abyste mohli vyplnit jinÃœ nÃ¡zev vaÅ¡eho novÃ©ho alba.',
+		  'album_name' => 'NÃ¡zev alba',
+		  'album_presentation' => 'Zde musÃ­te vybrat album. ObrÃ¡zky, kterÃ© pÅenesete na server budou uloÅŸeny v tomto albu. <BR>Pokud nemÃ¡te ÅŸÃ¡dnÃ© album, je seznam alb prÃ¡zdnÃœ. PouÅŸijte tlaÄÃ­tko \'VytvoÅit album\' k vytvoÅenÃ­ vaÅ¡eho prvnÃ­ho alba.',
+		  'album_description' => 'Popis alba',
+		  'add_pictures' => 'VloÅŸit obrÃ¡zky do vybranÃ©ho alba',
+		  'max_upload_size' => 'MaximÃ¡lnÃ­ velikost obrÃ¡zku je $1 Ko',
+		  'upload_presentation' => 'Pokud prohlÃ­ÅŸeÄ odmÃ­tÃ¡ zobrazit applet a hlÃ¡sÃ­ na tÃ©to strÃ¡nce chyby, je vhodnÃ© nainstalovat rozÅ¡Ã­ÅenÃ­ java runtime.<BR>PotÃ© je jiÅŸ pÅenos souborÅ¯ opravdu jednoduchÃœ! KlikÅete <B>ProchÃ¡zet</B> pro vÃœbÄr souborÅ¯ nebo pouÅŸijte pÅetaÅŸenÃ­ souborÅ¯ (drag\'n\'drop) z PrÅ¯zkumnÃ­ka, potÃ© kliknÄte <B>PÅenÃ©st</B> k odeslÃ¡nÃ­ obrÃ¡zkÅ¯ na server.'
+		  	. "<BR>Pro pouÅŸitÃ­ <U>pÅ¯vodnÃ­ strÃ¡nky pro pÅenos souborÅ¯</U>, <a href='upload.php'>kliknÄte zde</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+		
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt_BR.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt_BR.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt_BR.properties.apt	(revision 3951)
@@ -0,0 +1,249 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Brasilian (Protugese))
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Brasilian (Protugese)
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = brazilian_portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor nÃ£o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. VocÃª quer enviar informaÃ§Ãµes ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = DiretÃ³rio
+colModified = Modificado
+colReadable = LegÃ­vel
+errForbiddenExtension = Extenâ¡Ão de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e comentÃ¡rios a esta imagem.\n\nNÃ£o esqueÃ§a de clicar em 'Aplicar modificaÃ§Ãµes' para salvar suas modificaÃ§Ãµes no servidor.
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' Ã© muito grande. SerÃ¡ enviada sem modificaÃ§Ãµes.
+notAPicture = O arquivo '$1%s' nÃ£o Ã© uma imagem. NÃ£o serÃ¡ adicionada Ã  lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <brazilian_portuguese.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_es.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_es.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_es.properties.apt	(revision 3951)
@@ -0,0 +1,250 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Spanish)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Spanish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = spanish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Examinar ...
+buttonRemoveSelected = Eliminar seleccionados
+buttonRemoveAll = Eliminar todos
+buttonRotateLeft = Girar izqda
+buttonRotateRight = Girar drcha
+buttonUpload = Subir
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando fichero %1$d/%2$d
+infoUploading = Subiendo ficheros %1$s
+infoUploaded = %1$s fichero(s) subidos. Esperando la respuesta del servidor...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d ficheros subidos
+errDuringUpload = La carga se detuvo con errores
+errHttpResponse = La respuesta del servidor HTTP no cumple los requisitos. La carga ha fallado.
+questionSendMailOnError = OcurriÃ³ un error durante la carga. Â¿Desea enviar la informaciÃ³n relevante al webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nombre
+colSize = TamaÃ±o
+colDirectory = Carpeta
+colModified = Modificado
+colReadable = Â¿Legible?
+errForbiddenExtension = ExtensiÂ¢n de archivo prohibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = OcurriÃ³ un error durante la gestiÃ³n del log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, seleccione antes un Ã¡lbum.
+coppermineUploadOk = Las imÃ¡genes han sido subidas correctamente al servidor y colocadas en el Ã¡lbum seleccionado.\n\nPulse sobre OK para aÃ±adir nombres y comentarios a estas imÃ¡genes.\n\nNo olvide pulsar sobre el botÃ³n 'Aplicar cambios' para guardar los cambios en el servidor.
+
+#PictureFileData
+tooBigPicture = La imagen '%1$s' es demasiado grande. SerÃ¡ subida sin cambios (rotaciones, cambio de tamaÃ±o...).
+notAPicture = El fichero denominado '%1$s' no es una imagen. No se aÃ±adirÃ¡ a la lista de ficheros para subir.
+
+#PictureDialog
+buttonClose = Cerrar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <spanish.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// Thanks to jesusangelwork: jesusangelwork[at]users.sourceforge[dot]net
+//  And GecKoTDF (on http://forum.coppermine-gallery.net)
+// ------------------------------------------------------------------------- //
+ 
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Usted no tiene permisos para realizar esta operaciÃ³n.<BR><BR>Si no estÃ¡ conectado, por favor <a href="$1">conÃ©ctese</a> antes',
+		  'select_album' => 'Por favor, seleccione el Ã¡lbum donde desea subir las imÃ¡genes',
+		  'button_update_album' => 'Actualizar Ã¡lbum',
+		  'button_create_album' => 'Crear Ã¡lbum',
+		  'success' => 'ËOperaciÃ³n exitosa!',
+		  'error_select_album' => 'Por favor, seleccione antes un Ã¡lbum',
+		  'error_album_name' => 'Por favor, escriba un nombre para el Ã¡lbum.',
+		  'error_album_already_exists' => 'Ya tiene un Ã¡lbum con este nombre.<BR><BR>Pulse, por favor, sobre el botÃ³n <I>AtrÃ¡s</I> de su navegador para escribir otro tÃ­tulo para su nuevo Ã¡lbum.',
+		  'album_name' => 'Nombre del Ã¡lbum',
+		  'album_presentation' => 'Debe seleccionar un Ã¡lbum. Las imÃ¡genes que envÃ­e al servidor serÃ¡n almacenadas en este Ã¡lbum. <BR>Si no tiene ningÃºn Ã¡lbum, la lista de Ã¡lbumes aparecerÃ¡ vacÃ­a. Utilice el botÃ³n \'Crear\' para crear su primer Ã¡lbum.',
+		  'album_description' => 'DescripciÃ³n del Ã¡lbum',
+		  'add_pictures' => 'AÅadir imÃ¡genes al Ã¡lbum seleccionado',
+		  'max_upload_size' => 'El tamaÅo mÃ¡ximo para una imagen es $1 Ko',
+		  'upload_presentation' => 'Si el applet no aparece en el cuadrado que hay debajo y el navegador indica que se han producido errores en esta pÃ¡gina, serÃ­a buena idea que instalase el plugin de JAVA.<BR>DespuÃ©s de eso, subir las imÃ¡genes serÃ¡ muy sencillo. Pulse sobre <B>Examinar</B> para seleccionar ficheros o utilice arrastrar y soltar desde el explorador de ficheros, despuÃ©s pulse sobre <B>Subir</B> para enviar las imÃ¡genes al servidor.'
+		  	. "<BR>Para usar la <U>antigua pÃ¡gina de carga</U>, <a href='upload.php'>pulse aquÃ­</a>.",
+		  'album' => 'Ãlbum',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Su navegador no soporta Java. Necesita Java. Puede bajarlo desde <a href="http:\\www.java.com/es/download/">el sitio de java.</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Haga click en este link, y ponga la informacion en los campos de abajo, Si quiere que se apliquen en proximas subidas.',
+		  'quota_used' => 'Actualmente usa $1 MB ($2%) de sus $3 MB de almacenamiento.',
+		  'quota_about_full' => 'Sin espacio, borre algunas imagenes, o pidale al administrador mas espacio.',
+		  //Since 3.2.0
+		  'need_approval' => 'El administrador debe autorizar estas imagenes, antes de poder ser vistas en la galeria.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_fr.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_fr.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_fr.properties.apt	(revision 3951)
@@ -0,0 +1,255 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (French)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = French
+contributor = Etienne <etienne_sf@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = french
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Choisir des fichiers ...
+buttonRemoveSelected = Suppr sÃ©lectionnÃ©s
+buttonRemoveAll = Suppr tous
+buttonRotateLeft = Tourner gauche
+buttonRotateRight = Tourner droite
+buttonUpload = Envoyer
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Les messages de debug ont Ã©tÃ© copiÃ©s dans le presse-papier.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Go/s
+speedunit_mb_per_second = Mo/s
+speedunit_kb_per_second = Ko/s
+speedunit_b_per_second = o/s
+timefmt_hms = %1$d h., %2$d min. et %3$d sec.
+timefmt_ms = %1$d min. et %2$d sec.
+timefmt_s = %1$d secondes
+timefmt_unknown = inconnu
+status_msg = JUpload %1$d%% effectuÃ©, debit: %2$s, durÃ©e restante: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Le fichier '%1$s' est trop gros (%2$s)
+
+#FileUploadThread
+preparingFile = PrÃ©paration du fichier %1$d/%2$d
+infoUploading = Upload du(des) fichier(s) %1$s en cours
+infoUploaded = Fichier(s) %1$s uploadÃ©. En attente de la rÃ©ponse du serveur ...
+infoAborted = Upload interrompu aprÃšs %1$d fichier(s).
+nbUploadedFiles = %1$d fichier(s) uploadÃ©(s)
+errDuringUpload = Upload arrÃªtÃ© avec erreur
+errHttpResponse = La rÃ©ponse HTTP du serveur ne correspond pas aux critÃšres de succÃšs. L'upload a Ã©chouÃ©.
+questionSendMailOnError = Une erreur s'est produite durant l'upload. Voulez-vous envoyer un mail au webmaster, lui donnant toutes les informations disponibles ?
+
+#DialogUploadRetry
+dialogUploadRetryText = Une erreur s'est produite lors de l'envoi (upload) des fichiers vers le serveur. Voulez-vous rÃ©ssayer l'upload de ces fichiers ?\n\nL'upload sera automatiquement rÃ©-exÃ©cutÃ©s dans %1$d secondes.
+dialogUploadRetryTitle = RÃ©-essayer l'upload ?
+buttonDetails = DÃ©tails
+buttonYes = Oui
+buttonNo = Non
+
+#FileUploadManagerThread
+errorDuringUpload = L'erreur suivante est survenue durant l'upload :\n%1$s\n\nVoulez-vous continuer cet upload vers le serveur ?
+
+#FilePanelDataModel
+colName = Nom
+colSize = Taille
+colDirectory = RÃ©pertoire
+colModified = ModifiÃ© le
+colReadable = Lisible?
+errForbiddenExtension = Extention de fichier interdite
+
+#DefaultUploadPolicy
+errDuringLogManagement = Une erreur est survenue durant la gestion des logs
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Choisissez d'abord un album.
+coppermineUploadOk = Les images ont Ã©tÃ© chargÃ©es sur le serveur, dans l'album sÃ©lectionnÃ©.\n\nCliquez sur Ok pour aller mettre des noms et commentaires Ã  ces images.\n\nN'oubliez pas ensuite de cliquer sur le bouton 'Appliquer les modifications' pour envoyer vos commentaires sur le serveur!
+
+#PictureFileData
+tooBigPicture = L'image '%1$s' est trop grosse. Elle sera envoyÃ©e sans modification (rotation...)
+notAPicture = Le fichier '%1$s' n'est pas une image. Il n'est pas ajoutÃ© Ã  la liste des fichiers Ã  transfÃ©rer.
+
+#PictureDialog
+buttonClose = Fermer
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = o
+unitGigabytes = Go
+unitMegabytes = Mo
+unitKilobytes = ko
+
+#sendDebugInformation
+Confirm = Confirmez
+
+#InteractiveTrustManager
+itm_title_pass = Entrez mot de passe pour %1$s
+itm_prompt_pass = Mot de passe pour %1$s:
+itm_cert_alert = Alerte pour le SSL Certificate
+itm_cert_details = DÃ©tails du certificat:
+itm_cert_subject = Sujet:
+itm_cert_issuer = Emetteur:
+itm_cert_nbefore = Pas avant:
+itm_cert_nafter = Pas aprÃšs:
+itm_cert_serial = NumÃ©ro de sÃ©rie:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Pays:
+itm_cert_CN = Nom commun:
+itm_cert_L = LocalitÃ©:
+itm_cert_ST = Etat ou province:
+itm_cert_O = Organisation:
+itm_cert_OU = UnitÃ© d'Organisation:
+itm_reasons = Raison(s):
+itm_reason_cnmatch = Le nom commun du certificate ne correspond pas au nom de domaine (%1$s).
+itm_reason_itrust = L'Ã©metteur du Certificat n'est pas de confiance.
+itm_reason_expired = Le certificat aas expirÃ©.
+itm_reason_notyet = Le certificate n'est pas encore valide.
+itm_fail_verify = Le certificat presentÃ© par le serveur ne peut pas Ãªtre verifiÃ©.
+itm_accept_prompt = Voulez-vous accepter ce certificat ?
+itm_accept_always = Toujours
+itm_accept_now = Uniquement pour cette session
+itm_accept_no = Non
+itm_new_tstore = Nouveau magasin
+itm_tstore = Magasin
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <french.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Envoyer des fichiers vers la galerie, avec l\'aide d\'une applet',
+		  'perm_denied' => 'Vous n\'avez pas la permission d\'effectuer cette opÃ©ration.<BR><BR>Si vous n\'Ãªtes pas connectÃ©s, <a href="$1">identifiez-vous</a> d\'abord, en cliquant <a href="$1">ici</a> par exemple.',
+		  'select_album' => 'Choisissez un album o&ugrave; envoyer les photos',
+		  'button_update_album' => 'Modifier le nom et/ou la description',
+		  'button_create_album' => 'CrÃ©er un nouvel album',
+		  'success' => 'Action rÃ©ussie !',
+		  'error_select_album' => 'Veuillez d\'abord sÃ©lectionner un album.',
+		  'error_album_name' => 'Veuillez d\'abord donner un nom Ã  l\'album.',
+		  'error_album_already_exists' => 'Vous possÃ©dez dÃ©jÃ  un album avec ce titre.<BR><BR>Cliquez sur le bouton <I>PrÃ©cÃ©dent</I> de votre navigateur pour sÃ©lectionner un autre nom.',
+		  'album_name' => 'Nom de l\'album',
+		  'album_presentation' => 'Vous devez sÃ©lectionner un album. Les images que vous enverrez au serveur seront enregistrÃ©es dans cet album.<BR>Si vous n\'avez pas encore crÃ©Ã© d\'album, la liste est vide. Utilisez alors le bouton \'CrÃ©er\' pour en faire un nouveau.',
+		  'album_description' => 'Description de l\'album',
+		  'add_pictures' => 'Ajouter des images Ã  l\'album sÃ©lectionnÃ©',
+		  'max_upload_size' => 'Le poids maximal autorisÃ© pour une image est de $1 Ko',
+		  'upload_presentation' => "Si la carrÃ© ci-dessous reste dÃ©sespÃ©rÃ©ment blanc, et que la navigateur indique qu'il y a des erreurs sur cette page, une bonne idÃ©e est de cliquer sur <a href=\"http://les.gauthier.free.fr/install/jre-1_5_0_06-windows-i586-p.exe\">ce lien pour installer Java</a>, puis de choisir 'ExÃ©cuter' sur la fenÃªtre qui va s'ouvrir. Laisser vous guider (prendre les options proposÃ©es en standard). <BR> " 
+		  	. "AprÃšs, promis : le transfert des images est super simple ! "
+		  	. "Cliquez sur <B>Choisir des fichiers</B> (ou faites un glisser/dÃ©placer des fichiers images), puis sur <B>Envoyer</B> pour les charger sur le serveur."
+		  	. "<BR>Pour utiliser l'<U>ancienne mÃ©thode</U> d'upload d'image, <a href='upload.php'>cliquez ici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Java n\'est pas installÃ© sur votre ordinateur. L\'applet d\'upload a besoin de java. Vous pouvez facilement l\'installer depuis le <a href="http:\\java.sun.com\jre\">site web de java</a>.',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Cliquez sur ce lien, et entrez des valeurs dans les champs ci-dessous, si vous voulez qu\'elles s\'appliquent Ã  toutes les images du prochain upload (tÃ©lÃ©chargement) de fichiers.',
+		  'quota_used' => 'Vous utilisez actuellement $1 MB ($2%) de votre quota de $3 MB de stockage.',
+		  'quota_about_full' => 'Supprimez des photos, ou demandez une augmentation de votre quota Ã  l\'administrateur.',
+		  //Since 3.2.0
+		  'need_approval' => 'L\'administrateur de la galerie doit approuver les images uploadÃ©es, avant que vous puissiez les voir sur le site.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Cliquez ici, pour voir les URL des images uploadÃ©es, visibles sur cette page'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_nl.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_nl.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_nl.properties.apt	(revision 3951)
@@ -0,0 +1,251 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Dutch)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Dutch
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = dutch
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bladeren ...
+buttonRemoveSelected = Selectie verwijderen
+buttonRemoveAll = Alles verwijderen
+buttonRotateLeft = Roteer linksom
+buttonRotateRight = Roteer rechtsom
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Bestand klaarmaken %1$d/%2$d
+infoUploading = Bestanden uploaden %1$s
+infoUploaded = Bestand(en) %1$s geuploaded. Wachten op server ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d bestanden geuploaded
+errDuringUpload = Upload afgebroken met fouten
+errHttpResponse = Verkeerde HTTP reactie van de server. Upload mislukt.
+questionSendMailOnError = Er is een fout opgetreden tijdens de upload. Wilt u een mail met alle relevante informatie naar de webmaster versturen?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Naam
+colSize = Bestandsgrootte
+colDirectory = Map
+colModified = Gewijzigd
+colReadable = Leesbaar?
+errForbiddenExtension = Verboden bestandstype.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Er is een fout opgetreden tijdens logboek beheer
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Selecteer eerst een album.
+coppermineUploadOk = De afbeeldingen zijn succesvol geplaatst op de server, in het geslecteerde album. \n\nKlik OK om bestandsnamen en opmerkingen te koppelen aan deze afbeeldingen.\n\nVergeet niet om op de knop âWijzigingen toepassenâ te drukken!
+
+#PictureFileData
+tooBigPicture = Afbeelding '%1$s' is te groot. Het zal ongewijzigd geupload worden (geen rotatie, formaatwijziging...).
+notAPicture = Bestand '%1$s' is geen afbeelding. Het bestand is niet toegevoegd aan de lijst van uploads.
+
+#PictureDialog
+buttonClose = Sluiten
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <dutch.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'U heft niet voldoende rechten voor deze actie.<BR><BR>Gelieve eerst in te loggen: <a href="$1">login</a>',
+		  'select_album' => 'Selecteer een album waar u de nieuwe bestanden wilt plaatsen',
+		  'button_update_album' => 'Album bijwerken',
+		  'button_create_album' => 'Album aanmaken',
+		  'success' => 'Gereed !',
+		  'error_select_album' => 'Selecteer eerst een album',
+		  'error_album_name' => 'Geef het album eerst een naam.',
+		  'error_album_already_exists' => 'Deze naam is reeds in gebruik. <BR><BR>Druk op de <I>Terug</I> knop van uw browser, en voer een nieuwe naam in.',
+		  'album_name' => 'Album naam',
+		  'album_presentation' => 'U dient hier een album te selecteren. De geselecteerde afbeeldingen zullen aan dit album worden toegevoegd. <BR>Middels de knop \'Album aanmaken\' kunt u nieuwe albums aanmaken.',
+		  'album_description' => 'Album omschrijving',
+		  'add_pictures' => 'Afbeeldingen toevoegen aan het geselecteerde album',
+		  'max_upload_size' => 'De maximale bestandsgrootte is $1 Ko',
+		  'upload_presentation' => 'Als de applet niet weergegeven wordt, kan dit verholpen worden door de java runtime plugin te installeren.<BR>Vervolgens is uploaden zeer eenvoudig! Klik op <B>Bladeren</B> om bestanden te selecteren of gebruik de drag\'n\'drop functionaliteit van de verkenner. Klik vervolgens op <B>Upload</B> om afbeeldingen naar de server te verznden.'
+		  	. "<BR>Om de originele <u>upload-functionaliteit</u> te gebruiken, <a href='upload.php'>klik hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hr.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hr.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hr.properties.apt	(revision 3951)
@@ -0,0 +1,246 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Croatian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Croatian
+contributor = Bruno Simic
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = croatian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = PretraÅŸi...
+buttonRemoveSelected = ObriÅ¡i izbor
+buttonRemoveAll = ObriÅ¡i sve
+buttonRotateLeft = Rotiraj lijevo
+buttonRotateRight = Rotiraj desno
+buttonUpload = PoÅ¡alji
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Datoteka %1$s je prevelika (%2$s)
+
+#FileUploadThread
+preparingFile = Pripremam datoteku %1
+infoUploading = Å aljem datoteku %1
+infoUploaded = Datoteka %1 poslana. Äekam informacije sa servera ...
+infoAborted = Slanje prekinuto nakon %1. datoteke.
+nbUploadedFiles = %1 datoteka poslano
+errDuringUpload = Slanje prekinuto sa greÅ¡kom
+errHttpResponse = Slanje neuspjeÅ¡no: nepoznati HTTP odgovor
+questionSendMailOnError = GreÅ¡ka priliko slanja datoteka. Da li do informacije o greÅ¡ki poÅ¡aljem webmasteru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = VeliÄina
+colDirectory = Direktorij
+colModified = Promjenjeno
+colReadable = Äitljivo?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = GreÅ¡ka u log zapisu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Molimo prvo izaberite album.
+coppermineUploadOk = Slike uspjeÅ¡no poslane na server u izabrani album.\n\nKliknite OK za pridruÅŸenje imena i komentara tim slikama.\n\nNe zaboravite potvrditi promjene klikom na 'Primijeni izmjene'. Samo nakon toga Äe promjene biti pohranjene na server !
+
+#PictureFileData
+tooBigPicture = Datoteka %1 je prevelika i biti Äe poslana nepromijenjena (bez rotacije, promjene veliÄine...).
+notAPicture = '%1' nije u grafiÄkom formatu i neÄe biti dodana u listu za slanje.
+
+#PictureDialog
+buttonClose = Zatvori
+
+#DateRenderer
+dateformat = dd.MM.yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <croatian.php> file.
+
+--------------
+
+ï»¿<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File croatian.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nedostaju prava za izvrÅ¡enje.<BR><BR>Prijaviti se moÅŸete <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ovdje</a>.',
+		  'select_album' => 'Molimo izaberite album u koji ÅŸelite spremiti slike.',
+		  'button_update_album' => 'OsvjeÅŸi album',
+		  'button_create_album' => 'Otvori novi album',
+		  'success' => 'UspjeÅ¡no izvrÅ¡eno!',
+		  'error_select_album' => 'Molim prvo izaberite album',
+		  'error_album_name' => 'Molim upiÅ¡ite ime albuma.',
+		  'error_album_already_exists' => 'Album sa tim imenom veÄ postoji.<BR><BR>Molim kliknite izbornik <I>Nazad</I> u pregledniku te upiÅ¡ite drugo ime albuma.',
+		  'album_name' => 'Naslov albuma',
+		  'album_presentation' => 'Molim izaberite album. Datoteke koje su izabrane za slanje na server biti Äe pohranjene u ovaj album. <BR>Ako album joÅ¡ ne postoji, izaberite opciju \'Otvori novi album\'.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'PridruÅŸi nove slike albumu',
+		  'max_upload_size' => 'NajveÄa dopiÅ¡tena veliÄina slike iznosi $1 KB',
+		  'upload_presentation' => 'Ukoliko se Applet ne prikaÅŸe i/ili preglednik vrati greÅ¡ku, molim provjerite da li koristite zadnju verziju java runtime plugin-a.<BR>Nakon aktualiziranja applet Äe raditi znatno bolje. Za slanje slika na server kliknite na <B>PretraÅŸi...</B> i izberite datoteke ili \'povucite\' datoteke miÅ¡em iz direktorija u applet. Nakon toga kliknite na <B>PoÅ¡alji</B> da biste pokrenuli slanje.'
+		  	. "<BR>Ako ÅŸelite koristiti <U>staru</U> funkciju slanja, kliknite molim <a href='upload.php'>ovdje</a>.",
+		  'album' => 'album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pl.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pl.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pl.properties.apt	(revision 3951)
@@ -0,0 +1,262 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Polish)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Polish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = polish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = PrzeglÄ
+daj ...
+buttonRemoveSelected = UsuÅ zaznaczone
+buttonRemoveAll = UsuÅ wszystkie
+buttonRotateLeft = ObrÃ³Ä w lewo
+buttonRotateRight = ObrÃ³Ä w prawo
+buttonUpload = PrzeÅlij
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Uruchamianie transferu %1$d/%2$d
+infoUploading = PrzesyÅanie plikÃ³w %1$s
+infoUploaded = Plik(i) %1$s przesÅane. Oczekiwanie na odpowiedÅº serwera ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d pliki przesÅane
+errDuringUpload = PrzesyÅanie przerwane z powodu bÅÄdÃ³w
+errHttpResponse = Nie oczekiwana odpowiedÅº serwera HTTP. PrzesyÅanie przerwane.
+questionSendMailOnError = W czasie przesyÅania pojawiÅ siÄ bÅÄ
+d. Czy chcesz przesÅaÄ do administratora informacje dotyczÄ
+ce okolicznoÅci awarii?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nazwa
+colSize = WielkoÅÄ
+colDirectory = Katalog
+colModified = Czas
+colReadable = DostÄpny?
+errForbiddenExtension = Ulovlig filending.
+
+#DefaultUploadPolicy
+errDuringLogManagement = BÅÄ
+d w czasie zarzÄ
+dzania logiem
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ProszÄ najpierw wybraÄ album..
+coppermineUploadOk = ZdjÄcia z wybranego albumu zostaÅy pomyÅlnie przesÅane na serwer. \n\nNaciÅnij przycisk Ok aby dodaÄ nazwy i komentarze do tych zdjÄÄ. \n\nNie zapomnij nacisnÄ
+Ä przycisku 'Zapisz modyfikacjÄ' aby zachowaÄ zmiany na serwerze !
+
+#PictureFileData
+tooBigPicture = ZdjÄcie '%1$s' jest za duÅŒe. Zostanie przesÅane bez zmian (bez obracania, zmiany rozmiaru ...).
+notAPicture = Plik o nazwie '%1$s' nie jest zdjÄciem. Nie zostanie dodany do listy plikÃ³w do przesÅania.
+
+#PictureDialog
+buttonClose = Zamknij
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <polish.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nie masz uprawnieÅ do wykonania tej operacji.<BR><BR>JeÅŒeli nie jesteÅ poÅÄ
+czony, proszÄ siÄ najpierw <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">zalogowaÄ</a>',
+		  'select_album' => 'ProszÄ wybraÄ album, do ktÃ³rego zostanÄ
+ przesÅane pliki',
+		  'button_update_album' => 'Aktualizuj album',
+		  'button_create_album' => 'StwÃ³rz album',
+		  'success' => 'Operacja zakoÅczona sukcesem',
+		  'error_select_album' => 'ProszÄ najpierw wybraÄ album.',
+		  'error_album_name' => 'ProszÄ nazwaÄ album.',
+		  'error_album_already_exists' => 'Istnieje juÅŒ album o takiej nazwie w Twojej kolekcji.<BR><BR>UÅŒyj przycisku <I>PowrÃ³t</I>w Twojej przeglÄ
+darce, aby wpisaÄ innÄ
+ nazwÄ albumu.',
+		  'album_name' => 'Nazwa albumu',
+		  'album_presentation' => 'Musisz teraz wybraÄ album, w ktÃ³rym bÄdÄ
+ przechowywane zdjÄcia, ktÃ³re przeÅlesz na serwer. <BR>JeÅŒeli jeszcze nie utworzyÅeÅ ÅŒadnego albumu, lista albumÃ³w bÄdzie pusta. UyÅŒj przycisku \'StwÃ³rz album\' aby utworzyÄ nowy album.',
+		  'album_description' => 'Opis albumu',
+		  'add_pictures' => 'Dodaj zdjÄcia do wybranego albumu',
+		  'max_upload_size' => 'Maksymalny rozmiar pliku ze zdjÄciem to $1 Ko',
+		'upload_presentation' => 'JeÅŒeli nie moÅŒesz wyÅwietliÄ apletu i przeglÄ
+darka informuje o bÅÄdach na stronie, najprawdopodobniej nie masz zainstalowanego Årodowiska uruchomieniowego Javy (Java JRE).<BR>Jak tylko je zainstalujesz, przesyÅanie plikÃ³w bÄdzie naprawdÄ proste! NaciÅniesz przycisk <B>PrzeglÄ
+daj</B> aby wybraÄ pliki albo po prostu przeciÄ
+gniesz je z menadÅŒera plikÃ³w, potem naciÅniesz przycisk <B>PrzeÅlij</B> i pliki zostanÄ
+ wysÅane na serwer.'
+		  	. "<BR>Aby korzystaÄ ze <U>starej strony przesyÅania</U>, <a href='upload.php'>kliknij tutaj</a>.",
+		  'album' => 'Album'  ,
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_no.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_no.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_no.properties.apt	(revision 3951)
@@ -0,0 +1,251 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Norwegian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Norwegian
+contributor = Unkown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = norwegian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bla gjennom ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter venstre
+buttonRotateRight = Roter hÃžyre
+buttonUpload = Last opp
+buttonStop = STOPP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d tim., %2$d min. and %3$d sek.
+timefmt_ms = %1$d min. and %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ukjent
+status_msg = JUpload %1$d%% ferdig, overfÃžringshastighet: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Filen '%1$s' er for stor (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Laster opp filer %1$s
+infoUploaded = %1$s fil(er) lastet opp. Venter pÃ¥ serverrespons ...
+infoAborted = Opplasting avbrutt etter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) lastet opp
+errDuringUpload = Opplastingen stoppet med feil
+errHttpResponse = Opplastingen feilet: uventet HTTP respons
+questionSendMailOnError = Det skjedde en feil under opplasting. Ãnsker du Ã¥ sende all relevant informasjon til webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = StÃžrrelse
+colDirectory = Katalog
+colModified = Endret
+colReadable = Lesbar?
+errForbiddenExtension = Ugyldig filetternavn.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Det skjedde en feil under loggbehandlingen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = VÃŠr vennlig og velg et album fÃžrst
+coppermineUploadOk = Bildene har blitt korrekt lastet opp til serveren, i det valgte albumet.\n\nKlikk OK nÃ¥ for Ã¥ fullfÃžre opplastingen.\n\nIkke glem Ã¥ lagre eventuelle endringer du har gjort.
+
+#PictureFileData
+tooBigPicture = Bilde '%1$s' er for stort. Bildet vil bli lastet opp uten endringer (ingen rotering eller endring av stÃžrrelse ...).
+notAPicture = Filen '%1$s' er ikke en gyldig bildefil. Den er ikke lagt til i listen over filer som skal lastes opp.
+
+#PictureDialog
+buttonClose = Lukk
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Bekreft
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <norwegian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+	      'link_title' => 'JUpload',
+	      'link_comment' => 'Last opp filer til galleriet, ved hjelp av en applet',    
+	      'perm_denied' => 'Du har ikke tillatelse til Ã¥ utfÃžre den opprasjonen.<BR><BR>Hvis du ikke er innlogget, vÃŠr vennlig og <a href="$1">logg inn</a> fÃžrst',
+	      'select_album' => 'Du mÃ¥ velge et album du Ãžnsker Ã¥ laste opp bilder til',
+	      'button_update_album' => 'Oppdater album',
+	      'button_create_album' => 'Lag album',
+	      'success' => 'Handling utfÃžrt !',
+	      'error_select_album' => 'Du mÃ¥ velge et album fÃžrst',
+	      'error_album_name' => 'Du mÃ¥ gi albumet et navn',
+	      'error_album_already_exists' => 'Det fines allerede et album med dette navnet.<BR><BR>VÃŠr vennlig Ã¥ klikke <I>Tilbake</I> knappen pÃ¥ nettleseren for Ã¥ skrive inn en nytt navn pÃ¥ ditt album.',
+	      'album_name' => 'Album navn',
+	      'album_presentation' => 'Du mÃ¥ velge et album her. Bildene du laster opp vil bli lagret I dette albumet. <BR>Hvis du ikke har et album, er albumlisten tom. Bruk "Lage" knappen til Ã¥ lage ditt fÃžrste album.',
+	      'album_description' => 'Album beskrivelse',
+	      'add_pictures' => 'Legg til bilder i valgte album',
+	      'max_upload_size' => 'Maksimum stÃžrrelse for et bilde er $1 kB',
+	      'upload_presentation' => 'Hvis rammen nedenfor ikke kan vises, og nettleseren indikerer at det er feil pÃ¥ siden, mÃ¥ du installere Java plugin.<BR>Etter dette er opplasting veldig enkelt! Klikk pÃ¥ <B>Bla gjennom</B> for Ã¥ velge filer eller bruk dra og slipp fra filutforskeren, velg sÃ¥ <B>Last opp</B> for Ã¥ sende bildene til nettsiden.'
+	    . "<BR>For Ã¥ bruke <U>den vanlige filopplastingen</U>, <a href='upload.php'>klikk her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din nettleser tillater ikke Java. Opplastingsprogrammet krever Java. Du kan enkelt laste det ned fra <a href="http:\\java.sun.com\jre\">Java nettsidene</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk pÃ¥ denne lenken og fyll inn informasjon i feltene nedenfor, dersom du Ãžnkser at denne skal legges til alle bildene i neste opplasting.',
+		  'quota_used' => 'Du bruker nÃ¥ $1 MB ($2%) av din $3 MB store lagringsplass.',
+		  'quota_about_full' => 'Fjern noen bilder, eller be administrator om Ã¥ gjÃžre kontoen din stÃžrre.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'  	
+		  )
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hu.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hu.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_hu.properties.apt	(revision 3951)
@@ -0,0 +1,254 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Hungarian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hungarian
+contributor = RÃ©zsÃ³ GÃ¡bor <gabor.rezso@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hungarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = TallÃ³z ...
+buttonRemoveSelected = KivÃ¡lasztott eltÃ¡volÃ­tÃ¡sa
+buttonRemoveAll = Mind eltÃ¡volÃ­tÃ¡sa
+buttonRotateLeft = Forgat balra
+buttonRotateRight = Forgat Jobbra
+buttonUpload = FeltÃ¶lt
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d Ã³ra, %2$d perc Ã©s %3$d mÃ¡sodperc.
+timefmt_ms = %1$d perc Ã©s %2$d mÃ¡sodperc.
+timefmt_s = %1$d mÃ¡sodperc
+timefmt_unknown = ismeretlen
+status_msg = JUpload %1$d%% kÃ©sz, Ãtvitel: %2$s, HÃ¡tralÃ©vÅ idÅ: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = A '%1$s' mÃ©retÅ± kÃ©p nagyobb mint a megengedett (%2$s)
+
+#FileUploadThread
+preparingFile = ElÅkÃ©szÃ­tÃ©s %1$d/%2$d
+infoUploading = KÃ©pek feltÃ¶ltÃ©se %1$s
+infoUploaded = %1$s kÃ©p feltÃ¶ltve. VÃ¡rakozÃ¡s szerver vÃ¡laszra ...
+infoAborted = FeltÃ¶ltÃ©s %1$d fÃ¡jl utÃ¡n megszakÃ­tva.
+nbUploadedFiles = %1$d kÃ©p feltÃ¶ltve
+errDuringUpload = A feltÃ¶ltÃ©s hiba miatt leÃ¡llt
+errHttpResponse = A feltÃ¶ltÃ©s sikertelen: vÃ¡ratlan HTTP hiba
+questionSendMailOnError = A feltÃ¶ltÃ©s sorÃ¡n hiba tÃ¶rtÃ©nt. ElkÃŒldjÃŒk a hibajelentÃ©st a webmesternek?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = NÃ©v
+colSize = MÃ©ret
+colDirectory = KÃ¶nyvtÃ¡r
+colModified = MÃ³dosÃ­tva
+colReadable = OlvashatÃ³?
+errForbiddenExtension = Tiltott kiterjesztÃ©s.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Hiba tÃ¶rtÃ©nt a naplÃ³zÃ¡s kÃ¶zben
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ElÅszÃ¶r vÃ¡lassz albumot.
+coppermineUploadOk = A kÃ©pek feltÃ¶ltÃ©se a megfelelÅ albumba sikeres volt.\n\nklikk az OK gombra a nevek beÃ¡llÃ­tÃ¡sÃ¡hoz.\n\nNe felejts az alkalmaz gombra kattintani az adatok mentÃ©sÃ©hez !
+
+#PictureFileData
+tooBigPicture = A '%1$s' kÃ©p mÃ©rete tÃºl nagyi. Ez a kÃ©p mÃ³dosÃ­tÃ¡s nÃ©lkÃŒl kerÃŒl feltÃ¶ltÃ©sre(nincs forgatÃ©s, Ã¡tmÃ©retezÃ©s).
+notAPicture = A '%1$s' fÃ¡jl nem kÃ©p tÃ­pusÃº. Ãgy nem kerÃŒl a feltÃ¶ltÃ©sre vÃ¡rÃ³ listÃ¡ba.
+
+#PictureDialog
+buttonClose = BezÃ¡r
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Add meg %1$s jelszÃ³t
+itm_prompt_pass = %1$s jelszÃ³:
+itm_cert_alert = SSL BizonyÃ­tvÃ¡ny figyelmeztetÃ©s
+itm_cert_details = BizonyÃ­tvÃ¡ny adatai:
+itm_cert_subject = TÃ¡rgy:
+itm_cert_issuer = KibocsÃ¡tÃ³:
+itm_cert_nbefore = Nem korÃ¡bban:
+itm_cert_nafter = Nem kÃ©sÅbb:
+itm_cert_serial = SorozatszÃ¡m:
+itm_cert_fprint = %1$s ujjlenyomat :
+itm_cert_C = OrszÃ¡g:
+itm_cert_CN = NÃ©v:
+itm_cert_L = SzÃ¡rmazÃ¡s:
+itm_cert_ST = Megye:
+itm_cert_O = Szervezet:
+itm_cert_OU = Szervezeti egysÃ©g:
+itm_reasons = Ok:
+itm_reason_cnmatch = A bizonyÃ­tvÃ¡ny neve nem egyezik a szerver cÃ­mÃ©vel (%1$s).
+itm_reason_itrust = A bizonyÃ­tvÃ¡ny kibocsÃ¡tÃ³ nem megbÃ­zhatÃ³.
+itm_reason_expired = A bizonyÃ­tvÃ¡ny lejÃ¡rt.
+itm_reason_notyet = A bizonyÃ­tvÃ¡ny mÃ©g nem Ã©rvÃ©nyes.
+itm_fail_verify = A bizonyÃ­tvÃ¡ny, nem ellenÅrÃ­zhetÅ.
+itm_accept_prompt = Elfogadod a bizonyÃ­tvÃ¡nyt?
+itm_accept_always = mindig
+itm_accept_now = csak a jelenlegi munkafÃ¡zisban
+itm_accept_no = Nem
+itm_new_tstore = Ãj BizalomTÃ¡r
+itm_tstore = BizalomTÃ¡r
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <hungarian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+ 
+ //     Hungarian translation:
+ //     GÃ¡bor RÃ©zsÃ³
+ //     gabor.rezso at gmail dot com
+ 
+// ------------------------------------------------------------------------- //
+// File hungarian.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload-KÃ©p FeltÃ¶ltÃ©s+',
+		  'link_comment' => 'KÃ©pek feltÃ¶ltÃ©se a galÃ©riÃ¡ba',
+		  'perm_denied' => 'Nincs megfelelÅ jogosultsÃ¡god.<BR><BR>Ha nem vagy belÃ©pve, <a href="$1">itt</a> megteheted',
+		  'select_album' => 'VÃ¡lassz albumot, ahova a kÃ©peket tÃ¶ltenÃ©d',
+		  'button_update_album' => 'Album frissÃ­tÃ©se',
+		  'button_create_album' => 'Album lÃ©trehozÃ¡sa',
+		  'success' => 'Sikeres mÅ±velet!',
+		  'error_select_album' => 'KÃ©rlek, elÅszÃ¶r vÃ¡lassz albumot',
+		  'error_album_name' => 'KÃ©rlek, elÅszÃ¶r adj nevet az albumnak.',
+		  'error_album_already_exists' => 'MÃ¡r van ilyen nevÅ± album.<BR><BR>KLikk a <I>vissza</I> nyilra, Ãºj album nÃ©v megadÃ¡sÃ¡hoz.',
+		  'album_name' => 'Album nÃ©v',
+		  'album_presentation' => 'VÃ¡lassz albumot. A feltÃ¶ltÃ¶tt kÃ©pek . <BR>Ha nincs mÃ©g album lÃ©trehozva, a lista ÃŒres. Az Ãj album gomra kattintva hozhatod lÃ©tre elsÅ albumodat.',
+		  'album_description' => 'Album leÃ­rÃ¡s',
+		  'add_pictures' => 'KÃ©pek feltÃ¶ltÃ©se a kijelÃ¶lt albumba',
+		  'max_upload_size' => 'A kÃ©pek maximÃ¡lis mÃ©rete 1 KB',
+		  'upload_presentation' => 'Ha az alÃ¡bbi nÃ©gyzetben nem tÃ¶ltÅdik be a program, ill a bÃ¶ngÃ©szÅ hibaÃŒzenetet jelenÃ­t meg, ajÃ¡nlatos ÃºjratelepÃ­teni a java runtime plugin -t.<BR>A feltÃ¶ltÃ©s, sokkal gyorsabb Ã©s kÃ¶nnyebb! Klikk <B>TallÃ³z</B> kÃ©pek kivÃ¡lasztÃ¡sÃ¡hoz vagy hÃºzd bele a kÃ©peket az egÃ©rrel az intÃ©zÅbÅl, majd klikk <B>FeltÃ¶lt</B> gombra a feltÃ¶ltÃ©s elindÃ­tÃ¡sÃ¡hoz.'
+		. "<BR>a <U>rÃ©gi feltÃ¶ltÃ©si mÃ³d</U>, hasznÃ¡latÃ¡hoz <a href='upload.php'>Klikk ide</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk ide Ã©s add meg az alapvetÅ kÃ©p informÃ¡ciÃ³kat ha minden most feltÃ¶ltÃ¶tt kÃ©pre szeretnÃ©d alkalmazni azokat.',
+		  'quota_used' => 'Jelenleg $1 MB ($2%) tÃ¡rhelyet hasznÃ¡lsz, a rendelkezÃ©sre Ã¡llÃ³ $3 MB -bÃ³l.',
+		  'quota_about_full' => 'TÃ¶rÃ¶lj pÃ¡r kÃ©pet vagy bÅvÃ­tsd a tÃ¡rhelyet.',
+		  //Since 3.2.0
+		  'need_approval' => 'A galÃ©ria adminisztrÃ¡torÃ¡nak engedÃ©lyeznie kell a feltÃ¶ltÃ©st, mielÅtt megjelenne a galÃ©riÃ¡ban.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_it.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_it.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_it.properties.apt	(revision 3951)
@@ -0,0 +1,250 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Italian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Italian
+contributor = Manuele Grueff mgrueff@atipica.it
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = italian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Sfoglia...
+buttonRemoveSelected = Rimuovi selezionati
+buttonRemoveAll = Rimuovi tutto
+buttonRotateLeft = Ruota a sinistra
+buttonRotateRight = Ruota a destra
+buttonUpload = Carica
+buttonStop = FERMA
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d ore, %2$d min. e %3$d sec.
+timefmt_ms = %1$d min. e %2$d sec.
+timefmt_s = %1$d secondi
+timefmt_unknown = sconosciuto
+status_msg = JUpload %1$d%% eseguito, Velocit&#225;: %2$s, Tempo rimanente: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = La lunghezza del file '%1$s' &#232; eccessiva (%2$s)
+
+#FileUploadThread
+preparingFile = Preparazione file %1$d/%2$d
+infoUploading = Caricamento dei file %1$s
+infoUploaded = File %1$s pubblicato/i. In attesa della risposta del server ...
+infoAborted = Upload interrotto dopo %1$d file.
+nbUploadedFiles = %1$d file pubblicati
+errDuringUpload = Upload bloccato per errori
+errHttpResponse = La risposta del server HTTP ha segnalato un errore. L'upload &#232; fallito.
+questionSendMailOnError = Si &#232; verificato un errore durante l'upload. Vuoi segnalarlo al tuo webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Dimensioni
+colDirectory = Cartella
+colModified = Ultima modifica
+colReadable = Leggibile?
+errForbiddenExtension = Estensione file non consentita.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Si &#232; verificato un errore durante il log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Per favore scegli prima un album.
+coppermineUploadOk = Le immagini sono state caricate correttamente nel server, nell'album selezionato\n\nClicca su Ok per associare nomi e commenti alle immagini.\n\nNon dimenticare di cliccare sul bottone 'Apply modification' per salvare le tue modifiche sul server!
+
+#PictureFileData
+tooBigPicture = L'immagine '%1$s' &#232; troppo grande. Sar&#225; caricato senza modifiche (rotazione, ridimensionamento...).
+notAPicture = Il file chiamato '%1$s' non &#232; un'immagine. Non &#232; stato aggiunto alla lista dei files caricati.
+
+#PictureDialog
+buttonClose = Chiudi
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = Gb
+unitMegabytes = Mb
+unitKilobytes = Kb
+
+#sendDebugInformation
+Confirm = Conferma
+
+#InteractiveTrustManager
+itm_title_pass = Inserisci %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = Avviso certificato SSL
+itm_cert_details = Dettagli del certificato:
+itm_cert_subject = Soggetto:
+itm_cert_issuer = AutoritÃ  che lo rilascia:
+itm_cert_nbefore = Valido a partire da:
+itm_cert_nafter = Valido fino a:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Nazione (C):
+itm_cert_CN = Common name (CN):
+itm_cert_L = Localit&#225; (L):
+itm_cert_ST = Stato o provincia (ST):
+itm_cert_O = Organizzazione (O):
+itm_cert_OU = UnitÃ  organizzazionale (OU):
+itm_reasons = Ragioni:
+itm_reason_cnmatch = Il common name del certificato non corrisponde allo hostname (%1$s).
+itm_reason_itrust = L'autoritÃ  che ha rilasciato il certificato non &#232; affidabile.
+itm_reason_expired = Il certificato &#232; scaduto.
+itm_reason_notyet = Il certificato non &#232; ancora valido.
+itm_fail_verify = Non &#232; stato possibile verificare Il certificato fornito dal server.
+itm_accept_prompt = Volete accettare questo certificato?
+itm_accept_always = Sempre
+itm_accept_now = Solo per questa sessione
+itm_accept_no = No
+itm_new_tstore = Nuovo TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <italian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Pubblicazione di files nella galleria con l\'aiuto di un\'applet',
+		  'perm_denied' => 'Non hai il permesso per eseguire questa operazione.<BR><BR>Se non sei connesso per favore esegui prima il <a href="$1">login</a> ',
+		  'select_album' => 'Scegli l\'album dove postare le tue immagini',
+		  'button_update_album' => 'Aggiorna album',
+		  'button_create_album' => 'Crea album',
+		  'success' => 'Azione eseguita !',
+		  'error_select_album' => 'Per favore scegli prima un album',
+		  'error_album_name' => 'Inserisci il nome dell\'album',
+		  'error_album_already_exists' => 'Esiste gi&#225; un album con questo nome.<BR><BR>Clicca sul tasto <I>Back</I> del tuo browser, e scegli un\'altro nome.',
+		  'album_name' => 'Nome dell\'album',
+		  'album_presentation' => 'Puoi selezionare un\'album. Le immagini che invierai al server saranno salvate in questo album. <BR>Non hai nessun album, la lista album &#232 vuota. Usa il bottone \'Create\' per creare il tuo primo album.',
+		  'album_description' => 'Descrizione album',
+		  'add_pictures' => 'Aggiungi immagini nell\'album selezionato',
+		  'max_upload_size' => 'La massima dimensione delle immagini &#232 $1 Ko',
+		  'upload_presentation' => 'Se il riquadro in basso non visualizza l\'applet e il vostro browser segnala un errore nella pagina dovrete installare le runtime Java.<BR>Dopo, la pubblicazione sar&#225; molto semplice! Clicca su <B>Browse</B> per selezionare i files o usa Copia e Incolla da explorer, cilicca su <B>Upload</B> per inviare le immagini al server.'
+		. "<BR>Per usare <U>la vecchia pagina di upload </U>, <a href='upload.php'>clicca qui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sk.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sk.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sk.properties.apt	(revision 3951)
@@ -0,0 +1,251 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Slovak)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovak
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovak
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = HÄŸadaÅ¥ ...
+buttonRemoveSelected = OdstrÃ¡niÅ¥ VybranÃ©
+buttonRemoveAll = OdstrÃ¡niÅ¥ VÅ¡etky
+buttonRotateLeft = OtoÄiÅ¥ vÄŸavo
+buttonRotateRight = OtoÄiÅ¥ vpravo
+buttonUpload = OdoslaÅ¥
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. a %3$d sec.
+timefmt_ms = %1$d min. a %2$d sec.
+timefmt_s = %1$d sekÃºnd
+timefmt_unknown = neznÃ¡my
+status_msg = JUpload %1$d%% hotovo, RÃœchlosÅ¥ prenosu: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = VeÄŸkosÅ¥ sÃºboru pre '%1$s' je priveÄŸkÃ¡ (%2$s)
+
+#FileUploadThread
+preparingFile = Pripravujem sÃºbor %1$d/%2$d
+infoUploading = Odosielam sÃºbory %1$s
+infoUploaded = %1$s sÃºbor(y/ov) odoslanÃœch. ÄakÃ¡ sa na odpoveÄ servera ...
+infoAborted = Odosielanie zruÅ¡enÃ© po %1$d SÃºbore(och).
+nbUploadedFiles = %1$d sÃºbor(y/ov) odoslanÃœch
+errDuringUpload = Odosielanie zastavenÃ© chybami
+errHttpResponse = Odosielanie neÃºspeÅ¡nÃ©: neoÄakÃ¡vanÃ¡ HTTP odpoveÄ
+questionSendMailOnError = PoÄas odosielania sa vyskytla chyba. Chcete zaslaÅ¥ potrebnÃ© informÃ¡cie sprÃ¡vcovi strÃ¡nok?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = NÃ¡zov
+colSize = VeÄŸkosÅ¥
+colDirectory = AdresÃ¡r
+colModified = ZmenenÃ©
+colReadable = ÄitateÄŸnÃ©?
+errForbiddenExtension = NepovolenÃ¡ koncovka sÃºboru.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ProsÃ­m, vyberte najskÃŽr album.
+coppermineUploadOk = ObrÃ¡zky boli v poriadku nahratÃ© na server, do vybranÃ©ho albumu.\n\nKliknite na OK, pre doplnenie nÃ¡zvov a komentÃ¡rov k tÃœmto obrÃ¡zkom.\n\nNezabudnite kliknÃºÅ¥ na tlaÄidlo 'VykonaÅ¥ zmeny' pre uloÅŸenie vaÅ¡ich zmien na server !
+
+#PictureFileData
+tooBigPicture = ObrÃ¡zok '%1$s' je prÃ­liÅ¡ veÄŸkÃœ. Bude odoslanÃœ bez zmien (bez otoÄenÃ­, zmeny rozmerov...).
+notAPicture = SÃºbor s nÃ¡zvom '%1$s' nie je obrÃ¡zok. Nie je preto pridanÃœ do zoznamu sÃºborov na odoslanie.
+
+#PictureDialog
+buttonClose = ZatvoriÅ¥
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = PotvrdiÅ¥
+
+#InteractiveTrustManager
+itm_title_pass = VloÅŸiÅ¥ %1$s heslo
+itm_prompt_pass = %1$s heslo:
+itm_cert_alert = Upozornenie SSL CertifikÃ¡tu
+itm_cert_details = Detaily certifikÃ¡tu:
+itm_cert_subject = Predmet:
+itm_cert_issuer = VydavateÄŸ:
+itm_cert_nbefore = PlatnÃœ od:
+itm_cert_nafter = PlatnÃœ do:
+itm_cert_serial = SÃ©riovÃ© ÄÃ­slo:
+itm_cert_fprint = %1$s OtlaÄok prsta:
+itm_cert_C = Krajina:
+itm_cert_CN = Å tandardnÃœ nÃ¡zov:
+itm_cert_L = Lokalita:
+itm_cert_ST = Å tÃ¡t Äi provincia:
+itm_cert_O = OrganizÃ¡cia:
+itm_cert_OU = Organizational unit:
+itm_reasons = DÃŽvod(y):
+itm_reason_cnmatch = Å tandardnÃœ nÃ¡zov certifikÃ¡tu nezodpovedÃ¡ nÃ¡zvu hostu (%1$s).
+itm_reason_itrust = VydavateÄŸ certifikÃ¡tu nie je dÃŽveryhodnÃœ.
+itm_reason_expired = PlatnosÅ¥ certifikÃ¡tu vyprÅ¡ala.
+itm_reason_notyet = CertifikÃ¡t eÅ¡te nie je platnÃœ.
+itm_fail_verify = CertifikÃ¡t prijatÃœ od serveru nebolo moÅŸnÃ© overiÅ¥.
+itm_accept_prompt = Chcete prijaÅ¥ tento certifikÃ¡t?
+itm_accept_always = VÅŸdy
+itm_accept_now = Iba pre tentokrÃ¡t
+itm_accept_no = Nie
+itm_new_tstore = NovÃœ TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <slovak.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Odosielajte sÃºbory do galÃ©rie s pomocou Java appletu',
+		  'perm_denied' => 'NemÃ¡te oprÃ¡vnenie pre vykonanie tejto akcie.<BR><BR>Ak nie ste prihlÃ¡senÃœ, prosÃ­m <a href="$1">prihlÃ¡ste sa</a> najskÃŽr',
+		  'select_album' => 'ProsÃ­m vyberte album, do ktorÃ©ho chcete odoslaÅ¥ obrÃ¡zky',
+		  'button_update_album' => 'UpraviÅ¥ album',
+		  'button_create_album' => 'VytvoriÅ¥ album',
+		  'success' => 'Akcia bola vykonanÃ¡ ÃºspeÅ¡ne !',
+		  'error_select_album' => 'ProsÃ­m, vyberte najskÃŽr album',
+		  'error_album_name' => 'ProsÃ­m, zadajte nÃ¡zov albumu.',
+		  'error_album_already_exists' => 'Album s takÃœmto nÃ¡zvom uÅŸ mÃ¡te.<BR><BR>ProsÃ­m kliknite na tlaÄidlo <I>SpÃ€Å¥</I> na svojom prehliadaÄi, pre napÃ­sanie inÃ©ho nÃ¡zvu vÃ¡Å¡ho novÃ©ho albumu.',
+		  'album_name' => 'NÃ¡zov albumu',
+		  'album_presentation' => 'Tu je potrebnÃ© vybraÅ¥ album. ObrÃ¡zky, ktorÃ© poÅ¡lete server, budÃº uloÅŸenÃ© prÃ¡ve do tohto albumu. <BR>Ak nemÃ¡te vytvorenÃœ album, zoznam albumov je prÃ¡zdny. PouÅŸite tlaÄidlo \'VytvoriÅ¥ album\' na vytvorenie prvÃ©ho albumu.',
+		  'album_description' => 'Popis albumu',
+		  'add_pictures' => 'PridaÅ¥ obrÃ¡zky do vybranÃ©mu albumu',
+		  'max_upload_size' => 'MaximÃ¡lny veÄŸkost obrÃ¡zku mÃŽÅŸe byÅ¥ $1 KB',
+		  'upload_presentation' => 'Ak sa oblasti dole odmietne zobraziÅ¥ applet a prehliadaÄ oznamuje, ÅŸe na strÃ¡nke sa objavili chyby, pravdepodobne potrebujete nainÅ¡talovaÅ¥ java runtime plugin.<BR>Potom je uÅŸ odoslanie jednoduchÃ©! Kliknite na <B>HÄŸadaÅ¥</B> pre zvolenie sÃºborov, alebo ich cez drag\'n\'drop preneste kurzorom, nÃ¡sledne kliknite na <B>OdoslaÅ¥</B> pre odoslanie sÃºborov na server.'
+		. "<BR>Pre pouÅŸitie <U>starej strÃ¡nky pre upload</U>, <a href='upload.php'>kliknite sem</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'VÃ¡Å¡ prehliadaÄ nepodporuje Javu. Applet pre odosielanie vyÅŸaduje Javu. MÃŽÅŸete si ju zdarma stiahnuÅ¥ zo <a href="http:\\java.sun.com\jre\">strÃ¡nok Javy</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Kliknite na tento odkaz a vyplÅte informÃ¡cie do polÃ­Äok dole, ak chcete aby boli pouÅŸitÃ© na vÅ¡etky obrÃ¡zky v ÄalÅ¡om odoslanÃ­.',
+		  'quota_used' => 'AktuÃ¡lne puÅŸÃ­vate $1 MB ($2%) z $3 MB vÃ¡Å¡ho priestoru.',
+		  'quota_about_full' => 'OdstrÃ¡Åte nejakÃ© obrÃ¡zky, alebo poÅŸiadajte administrÃ¡tora aby vÃ¡m poskytol viac priestoru.',
+		  //Since 3.2.0
+		  'need_approval' => 'OdoslanÃ© obrÃ¡zky sa zobrazia v galÃ©rii aÅŸ po potvrdenÃ­ administrÃ¡torom galÃ©rie.'
+		)
+	);
+}
+
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sl.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sl.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sl.properties.apt	(revision 3951)
@@ -0,0 +1,247 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Slovenian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovenian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovenian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = IÅ¡Äi ...
+buttonRemoveSelected = Odstrani oznaÄene
+buttonRemoveAll = Odstrani vse
+buttonRotateLeft = Zasukaj levo
+buttonRotateRight = Zasukaj desno
+buttonUpload = NaloÅŸi
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Datoteka v pripravi %1$d/%2$d
+infoUploading = Nalaganje datotek %1$s
+infoUploaded = Datoteke %1$s so naloÅŸene. Äakam na odziv streÅŸnika ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d datoteke so naloÅŸene
+errDuringUpload = Nalaganje zaustavljeno zaradi napake
+errHttpResponse = HTTP odgovor streÅŸnika ne ustreza kriterijem. Nalaganje se ni posreÄilo.
+questionSendMailOnError = Med nalaganjem je priÅ¡lo do napake. Åœelite to informacijo poslati skrbniku strani?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Velikost
+colDirectory = Mapa
+colModified = Spremenjeno
+colReadable = Berljivo?
+errForbiddenExtension = NapaÄna konÄnica datoteke.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Med prijavo je priÅ¡lo do napake
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosim, najprej izberi album.
+coppermineUploadOk = Slike so se pravilno naloÅŸile v izbrani album.\n\nKlikni OK za objavo imen in komentarjev k slikam.\n\nNe pozabi klikniti na gumb 'UpoÅ¡tevaj spremembo'. Le tako bodo spremembe shranjene na streÅŸniku!
+
+#PictureFileData
+tooBigPicture = Slika '%1$s' je prevelika. NaloÅŸena bo brez sprememb (brez zasuka, spremembe velikosti ...).
+notAPicture = Datoteka z imenom '%1$s' ni slika in ni vkljuÄena na seznam datotek za nalaganje.
+
+#PictureDialog
+buttonClose = Zapri
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <slovenian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'NimaÅ¡ pooblastil za izvedbo tega opravila.<BR><BR>Äe ni povezave, se najprej <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">prijavi</a>',
+		  'select_album' => 'Prosim, izberi album, v katerega ÅŸeliÅ¡ naloÅŸiti slike',
+		  'button_update_album' => 'OsveÅŸi album',
+		  'button_create_album' => 'Ustvari album',
+		  'success' => 'Postopek je uspel!',
+		  'error_select_album' => 'Prosim, najprej izberi album',
+		  'error_album_name' => 'Prosim, poimenuj album.',
+		  'error_album_already_exists' => 'V galeriji ÅŸe imaÅ¡ album s tem imenom.<BR><BR>Prosim, klikni gumb <I>Nazaj</I> v svojem brskalniku in vpiÅ¡i drugo ime za svoj novi album.',
+		  'album_name' => 'Ime albuma',
+		  'album_presentation' => 'Izbrati moraÅ¡ album, v katerega ÅŸeliÅ¡ naloÅŸiti slike. <BR>Äe albumov ni, je seznam prazen. Uporabi gumb \'Ustvari album\' in ustvari svoj prvi album.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'Dodaj slike v izbrani album',
+		  'max_upload_size' => 'NajveÄja dovoljena velikost slike je $1 KB',
+		  'upload_presentation' => 'Äe se v spodnjem polju ne pokaÅŸe programÄek, brskalnik pa opozarja na napako na strani, moraÅ¡ namestiti <a href=\'http://www.java.com\'>javo</a>.<BR>Uporaba je preprosta! Klikni <B>IÅ¡Äi</B> in izberi datoteke ali pa uporabi \'povleci in spusti\' v raziskovalcu ter nato klikni <B>NaloÅŸi</B> in poÅ¡lji slike na streÅŸnik.'
+		        . "<BR><U>Staro stran za nalaganje</U>, <a href='upload.php'>najdeÅ¡ tukaj</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang.properties.apt	(revision 3951)
@@ -0,0 +1,252 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (English (default language file))
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = English (default language file)
+contributor = Core translation file (no contributor)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+dialogUploadRetryTitle = Retry the upload?
+buttonDetails = Details
+buttonYes = Yes
+buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   The translation for English (default language file) doesn't exist. Please create a new one, based on the English translation below... 
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Upload files to the gallery, with the help of an applet',
+		  'perm_denied' => 'You don\'t have permission to perform this operation.<BR><BR>If you\'re not connected, please <a href="$1">login</a> first',
+		  'select_album' => 'Please, choose an album, where you want to upload pictures',
+		  'button_update_album' => 'Update album',
+		  'button_create_album' => 'Create album',
+		  'success' => 'Action success !',
+		  'error_select_album' => 'Please, choose an album first',
+		  'error_album_name' => 'Please give a name to the album.',
+		  'error_album_already_exists' => 'You already own an album with this name.<BR><BR>Please click on the <I>Back</I> button of your navigator, to type another title for your new album.',
+		  'album_name' => 'Album name',
+		  'album_presentation' => 'You must select an album here. The pictures you\'ll send to the server will be stored in this album. <BR>If you don\'t have any album, the album list is empty. Use the \'Create\' button to create your first album.',
+		  'album_description' => 'Album description',
+		  'add_pictures' => 'Add pictures to the selected album',
+		  'max_upload_size' => 'The maximum size for a picture is $1 KB',
+		  'upload_presentation' => 'If the square below definitely refuses to display the applet, and the navigator indicates that there are errors on this page, a good idea would be to install the java runtime plugin.<BR>After, upload is really simple! Click on <B>Browse</B> to select files or use drag\'n\'drop from the explorer, then click on <B>Upload</B> to send the pictures to the server.'
+		. "<BR>To use the <U>old upload page</U>, <a href='upload.php'>click here</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Click here, to see the URL of the uploaded pictures, contained on this page'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ro.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ro.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ro.properties.apt	(revision 3951)
@@ -0,0 +1,250 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Romanian (idem to Moldova))
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Romanian (idem to Moldova)
+contributor = Adrian (nickname: ady1503) (mail: gallery@butnarumd.com)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = romanian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = RÄsfoire ...
+buttonRemoveSelected = ÃnlÄturaÅ£i selectat
+buttonRemoveAll = EliminÄ Tot
+buttonRotateLeft = Rotire stÃ®nga
+buttonRotateRight = Rotire dreapta
+buttonUpload = ÃncarcÄ
+buttonStop = OPREÅTE
+messageLogWindowCopiedToClipboard = Mesaje de depanare au fost copiate Ã®n clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d secunde
+timefmt_unknown = neÅtiut
+status_msg = JUpload %1$d%% a terminat, ratÄ de transfer: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Lungimea de fiÅier pentru '%1$s' este prea mare (%2$s)
+
+#FileUploadThread
+preparingFile = Pregatirea de fiÅier %1$d/%2$d
+infoUploading = ÃncÄrcare de fiÅiere %1$s
+infoUploaded = %1$s fiÅier(e) Ã®ncÄrcate. Ãn aÅteptare pentru rÄspunsul serverului ...
+infoAborted = ÃncÄrcare opritÄ dupÄ %1$d FiÅier(e).
+nbUploadedFiles = %1$d fiÅier(e) Ã®ncÄrcate
+errDuringUpload = ÃncÄrcare opritÄ cu erori
+errHttpResponse = ÃncÄrcare eÅuatÄ: rÄspuns neaÅteptat HTTP
+questionSendMailOnError = A apÄrut o eroare Ã®n timpul Ã®ncÄrcÄrii. Vrei sÄ trimitÄ toate informaÅ£iile relevante pentru webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = A apÄrut urmÄtoarea eroare Ã®n timpul Ã®ncÄrcÄrii:\n%1$s\n\nVrei sÄ mergi mai departe cu Ã®ncÄrcare curentÄ?
+
+#FilePanelDataModel
+colName = Nume
+colSize = Volum
+colDirectory = Director
+colModified = Modificat
+colReadable = Poate fi citit?
+errForbiddenExtension = InterzisÄ extensiunea de fiÅier.
+
+#DefaultUploadPolicy
+errDuringLogManagement = O eroare a apÄrut Ã®n timpul de gestionare a Ã®nregistrÄrii
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = VÄ rugÄm, alegeÅ£i un album prima datÄ.
+coppermineUploadOk = Fotografiile au fost corect Ã®ncÄrcate pe server, Ã®n albumul selectat.\n\nFaceÅ£i clic pe OK acum pentru a asocia numele Åi comentariile la aceste imagini.\n\nNu uitaÅ£i sÄ faceÅ£i clic pe butonul 'Apply modification button' pentru a salva modificÄrile dvs. de pe server!
+
+#PictureFileData
+tooBigPicture = Imaginea '%1$s' este prea mare. Acesta va fi Ã®ncÄrcatÄ neschimbatÄ (fÄrÄ rotaÅ£ie, redimensionare ...).
+notAPicture = FiÅier numit '%1$s' nu este o imagine. El nu se adaugÄ la lista de fiÅiere care urmeazÄ sÄ fie Ã®ncÄrcate.
+
+#PictureDialog
+buttonClose = Ãnchide
+
+#DateRenderer
+dateformat = hh:mm dd-MM-yyyy aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = ConfirmaÅ£i
+
+#InteractiveTrustManager
+itm_title_pass = IntroduceÅ£i %1$s parola
+itm_prompt_pass = %1$s parola:
+itm_cert_alert = SSL Certificat alertÄ
+itm_cert_details = Detaliile certificatului:
+itm_cert_subject = Subiect:
+itm_cert_issuer = Emitentul:
+itm_cert_nbefore = Nu Ã®nainte de:
+itm_cert_nafter = Nu dupÄ:
+itm_cert_serial = Serie:
+itm_cert_fprint = %1$s AmprentÄ digitalÄ:
+itm_cert_C = Å¢arÄ:
+itm_cert_CN = Nume comun:
+itm_cert_L = Localitatea:
+itm_cert_ST = Statul sau provincia:
+itm_cert_O = OrganizaÅ£ia:
+itm_cert_OU = Unitate organizaÅ£ionalÄ:
+itm_reasons = Motiv(e):
+itm_reason_cnmatch = Certificatul cu denumirea comunÄ nu se potriveÅte cu numele de host (%1$s).
+itm_reason_itrust = Emitentului Certificatul nu este de Ã®ncredere.
+itm_reason_expired = Certificatul este expirat.
+itm_reason_notyet = Certificatul nu este Ã®ncÄ valabil.
+itm_fail_verify = Certificatul, prezentat de server nu a putut fi verificat.
+itm_accept_prompt = DoriÅ£i sÄ acceptaÅ£i acest certificat?
+itm_accept_always = Ãntotdeauna
+itm_accept_now = Numai pentru aceastÄ sesiune
+itm_accept_no = Nu
+itm_new_tstore = Nou TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <romanian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'ÃncÄrcaÅ£i fiÅiere Ã®n galerie, cu ajutorul unui applet',
+		  'perm_denied' => 'Nu aveÅ£i permisiunea de a efectua aceastÄ operaÅ£ie.<BR><BR>DacÄ nu eÅti conectat, vÄ rugÄm sÄ vÄ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '"> autentificaÅ£i </ a> prima datÄ',
+		  'select_album' => 'VÄ rugÄm, alegeÅ£i un album, Ã®n cazul Ã®n care doriÅ£i sÄ Ã®ncÄrcaÅ£i imagini',
+		  'button_update_album' => 'Actualizare album',
+		  'button_create_album' => 'Creare album',
+		  'success' => 'AcÅ£iune cu succes !',
+		  'error_select_album' => 'VÄ rugÄm, alegeÅ£i un album prima datÄ',
+		  'error_album_name' => 'VÄ rugÄm sÄ daÅ£i un nume albumului.',
+		  'error_album_already_exists' => 'AveÅ£i deja un album cu acest nume.<BR><BR>VÄ rugÄm sÄ faceÅ£i clic pe <I>Ãnapoi</I> butonul de Navigator-ul tÄu, pentru a da un alt titlu albumul nou.',
+		  'album_name' => 'Nume album',
+		  'album_presentation' => 'Trebuie sÄ selectaÅ£i un album aici. Imaginile pe care le trimiteÅ£i la server vor fi stocate Ã®n acest album. <BR> DacÄ nu ai nici un album, sau lista de albume este goalÄ. UtilizaÅ£i butonul \'CreaÅ£i\' pentru a crea primul album.',
+		  'album_description' => 'Descriere album',
+		  'add_pictures' => 'AdaugÄ poze la albumul selectat',
+		  'max_upload_size' => 'Dimensiunea maximÄ pentru o imagine este $1 KB',
+		  'upload_presentation' => 'Ãn cazul Ã®n care se refuzÄ categoric pentru a afiÅa appletul pÄtrat de mai jos, Åi navigatorul indicÄ faptul cÄ existÄ erori pe aceastÄ paginÄ, o idee bunÄ ar fi sÄ instalaÅ£i plugin-ul Java Runtime.<a href="http://java.sun.com/" target="_blank">Java&#8482;</a><BR>DupÄ ce, Ã®ncÄrcaÅ£i este foarte simplu! FaceÅ£i clic pe <B>RÄsfoire</B> pentru a selecta fiÅiere sau utilizaÅ£i glisare \'n\' de la explorator, apoi faceÅ£i clic pe <B>ÃncÄrcare</B> pentru a trimite imagini pe server.'
+		. "<BR>Pentru a utiliza <U>pagina de Ã®ncÄrcare veche</U>, <a href='upload.php'>click aici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Navigator tÄu nu permite Java. Ai nevoie de Java Applet. AveÅ£i posibilitatea sÄ descÄrcaÅ£i cu uÅurinÅ£Ä de la <a href="http:\\java.sun.com\jre\">site-ul web de java</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'FaceÅ£i clic pe acest link, Åi introduceÅ£i datele Ã®n cÃ¢mpurile de mai jos, dacÄ doriÅ£i ca acestea sÄ fie aplicate la toate imaginile din Ã®ncÄrcare urmÄtoare.',
+		  'quota_used' => 'Ãn prezent utilizaÅ£i $1 MB ($2%) din $3 MB de volum.',
+		  'quota_about_full' => 'ScoateÅ£i niÅte poze, sau cereÅ£i de la  admin pentru a mÄri cota mai mare.',
+		  //Since 3.2.0
+		  'need_approval' => 'Administradorul Galeriei trebuie sÄ aprobe aceste imagini Ã®ncÄrcate, Ã®nainte de a le putea vedea pe galerie.'
+		)
+	);
+
+}
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh.properties.apt	(revision 3951)
@@ -0,0 +1,277 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Chinese simplified)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = çèŠœ ...
+buttonRemoveSelected = ç§»é€éžæçæªæ¡
+buttonRemoveAll = ç§»é€æææªæ¡
+buttonRotateLeft = éæéæèœ
+buttonRotateRight = é æéæèœ
+buttonUpload = äžå³
+buttonStop = äž­æ­¢äžå³
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$då°æ%2$då%3$dç§
+timefmt_ms = %1$då%2$dç§
+timefmt_s = %1$dç§
+timefmt_unknown = æªç¥
+status_msg = JUploadå·²å®æ%1$d%%, å³èŒžéç: %2$s, é äŒ°æé: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = æªæ¡å€§å° '%1$s' å·²è¶
+åºäžéïŒ(%2$s)
+
+#FileUploadThread
+preparingFile = æªæ¡%1$d/%2$dæºåäž­...
+infoUploading = æ­£åšäžå³%1$s
+infoUploaded = %1$sæªæ¡å·²äžå³ïŒç­åŸ
+äŒºæåšåæäž­âŠ
+infoAborted = äžå³äž­æ·ïŒå·²å³é%1$dæªæ¡
+nbUploadedFiles = %1$dæªæ¡å·²äžå³
+errDuringUpload = å³èŒžé¯èª€ïŒäžå³å·²äž­æ­¢
+errHttpResponse = äžå³å€±æïŒé¯èª€çHTTPåæ
+questionSendMailOnError = äžå³æçŒçé¯èª€ãæ¯åŠå³éçžéè³èšçµŠç¶²ç«ç®¡çå¡ïŒ
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = åçš±
+colSize = å€§å°
+colDirectory = ç®é
+colModified = ä¿®æ¹æ¥æ
+colReadable = è®åæ¬é
+errForbiddenExtension = äžå
+èš±çå¯æªå
+
+#DefaultUploadPolicy
+errDuringLogManagement = èšéæªç®¡ççŒçé¯èª€
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = è«å
+éžæçžç°¿
+coppermineUploadOk = æªæ¡å·²æ­£ç¢ºäžå³ïŒè«æç¢ºå®éµç¹Œçºç·šèŒ¯æªæ¡å
+§å®¹\n\nè«æ³šæïŒä¿®æ¹åŸè«æäžãå¥çšä¿®æ¹ãéµä»¥æŽæ°è³æïŒ
+
+#PictureFileData
+tooBigPicture = åæª'%1$s'å€§å°è¶
+éäžéïŒäžå³ç¡æ³å¥çšä»»äœä¿®æ¹
+notAPicture = æªæ¡'%1$s'äžæ¯åæªïŒäžåå
+¥äžå³æž
+å®
+
+#PictureDialog
+buttonClose = éé
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = ç¢ºèª
+
+#InteractiveTrustManager
+itm_title_pass = èŒžå
+¥%1$så¯ç¢Œ
+itm_prompt_pass = %1$så¯ç¢Œ:
+itm_cert_alert = SSL æè­è­Šå
+itm_cert_details = æè­å
+§å®¹ïŒ
+itm_cert_subject = æšé¡ïŒ
+itm_cert_issuer = çŒè¡è
+ïŒ
+itm_cert_nbefore = çŒè¡æ¥ïŒ
+itm_cert_nafter = å°ææ¥ïŒ
+itm_cert_serial = åºèïŒ
+itm_cert_fprint = %1$sæè­ç°œç« ïŒ
+itm_cert_C = åå¥ïŒ
+itm_cert_CN = äžè¬åçš±ïŒ
+itm_cert_L = å
+¬åžåçš±
+itm_cert_ST = å·/çïŒ
+itm_cert_O = çµç¹åçš±ïŒ
+itm_cert_OU = çµç¹å®äœïŒ
+itm_reasons = çç±
+itm_reason_cnmatch = æè­äžè¬åçš±èäž»æ©åçš±äžç¬Š(%1$s).
+itm_reason_itrust = æè­çŒè¡è
+äžåä¿¡ä»»
+itm_reason_expired = æè­å·²éæ
+itm_reason_notyet = æè­å°æªçŒè¡
+itm_fail_verify = ç¡æ³é©è­äŒºæåšæäŸçæè­
+itm_accept_prompt = æ¯åŠæ¥åæ­€æè­ïŒ
+itm_accept_always = æ°žé æ¥å
+itm_accept_now = æ¬æ¬¡æ¥å
+itm_accept_no = æçµ
+itm_new_tstore = æ°çä¿¡è³Žé»å­ååº
+itm_tstore = ä¿¡è³Žé»å­ååº
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <chinese_gb.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_pt.properties.apt	(revision 3951)
@@ -0,0 +1,249 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Portugese)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Portugese
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor nÃ£o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. VocÃª quer enviar informaÃ§Ãµes ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = DiretÃ³rio
+colModified = Modificado
+colReadable = LegÃ­vel
+errForbiddenExtension = Extenâ¡Ão de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e comentÃ¡rios a esta imagem.\n\nNÃ£o esqueÃ§a de clicar em 'Aplicar modificaÃ§Ãµes' para salvar suas modificaÃ§Ãµes no servidor.
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' Ã© muito grande. SerÃ¡ enviada sem modificaÃ§Ãµes.
+notAPicture = O arquivo '$1%s' nÃ£o Ã© uma imagem. NÃ£o serÃ¡ adicionada Ã  lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <portuguese.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_da.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_da.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_da.properties.apt	(revision 3951)
@@ -0,0 +1,249 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Danish)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Danish
+contributor = Jeppe Bundsgaard
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = danish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = SÃžg ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter mod uret
+buttonRotateRight = Roter med uret
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Uploader filer %1$s
+infoUploaded = Filen/filerne %1$s er uploadet. Venter pÃ¥ serversvar ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d filer uploadet
+errDuringUpload = Upload stoppede med fejl
+errHttpResponse = Serverens HTTP-svar mÃžder ikke succeskriterierne. Uploaden fejlede.
+questionSendMailOnError = En fejl opstod under upload. Vil du sende al relevant information til webmasteren?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = StÃžrrelse
+colDirectory = Mappe
+colModified = Ãndret
+colReadable = LÃŠsbar?
+errForbiddenExtension = Ulovlig fil endelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = En fejl opstod under log-hÃ¥ndteringen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = VÃŠlg venligst et album fÃžrst.
+coppermineUploadOk = Billederne er blevet lagt op pÃ¥ serveren i det valgte album.\n\nKlik pÃ¥ Ok nu for at associere navne og kommentarer til disse billeder.\n\nGlem ikke at klikke pÃ¥ âUdfÃžr ÃŠndringerâ-knappen for at gemme dine ÃŠndringer pÃ¥ serveren!
+
+#PictureFileData
+tooBigPicture = Billedet '%1$s' er for stort. Det bliver uploadet uÃŠndret (ingen rotation, stÃžrrelsesÃŠndring...).
+notAPicture = Filen med navnet '%1$s' er ikke et billede. Det er ikke tilfÃžjet til listen af filer der skal uploades.
+
+#PictureDialog
+buttonClose = Luk
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <danish.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php   in Danish
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du har ikke tilladelse til at udfÃžre denne operation. BR><BR>Hvis du ikke er forbundet, sÃ¥ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">login</a> fÃžrst',
+		  'select_album' => 'VÃŠlg venligst et album, hvori du vil uploade billeder',
+		  'button_update_album' => 'Opdater album',
+		  'button_create_album' => 'Opret album',
+		  'success' => 'Handlingen lykkedes!',
+		  'error_select_album' => 'VÃŠlg venligst et album fÃžrst',
+		  'error_album_name' => 'Giv venligst albummet et navn.',
+		  'error_album_already_exists' => 'Du ejer allerede et album med dette navn.<BR><BR>Klik venligst pÃ¥ <I>Tilbage</I>-knappen i din browser for at skrive en titel pÃ¥ dit nye album.',
+		  'album_name' => 'Albumnavn',
+		  'album_presentation' => 'Du skal vÃŠlge et album her. Billederne du sender til serveren, vil blive gemt i dette album. <BR>Hvis du ikke har et album, er albumlisten tom. Brug âOpretâ-knappen til at oprette dit fÃžrste album.',
+		  'album_description' => 'Albumbeskrivelse',
+		  'add_pictures' => 'TilfÃžj billeder til det valgte album',
+		  'max_upload_size' => 'Den maximale stÃžrrelse for et billede er $1 Kb',
+		  'upload_presentation' => 'Hvis firkanten nedenfor fuldstÃŠnding nÃŠgter at vise appletten, og navigatoren indikerer at der er fejl pÃ¥ denne side, er det en god ide at installere java runtime plugin-et.<BR>NÃ¥r det er gjort, er upload virkelig enkelt ! Klik pÃ¥ <B>SÃžg...</B> for at vÃŠlge filer eller brug trÃŠk-og-slip fra stifinderen. Klik sÃ¥ pÃ¥ <b>Upload</b> for at sende billederne til serveren.'
+		  	. "<BR>For at bruge den <U>gamle uploadside</U>, <a href='upload.php'>klik her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar_SA.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar_SA.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ar_SA.properties.apt	(revision 3951)
@@ -0,0 +1,378 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Arabic)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Ø§Ø³ØªØ¹Ø±Ø§Ø¶ ...
+buttonRemoveSelected = Ø§ÙØºØ§Ø¡ Ø§ÙØ§Ø®ØªÙØ§Ø±
+buttonRemoveAll = Ø§ÙØºØ§Ø¡ Ø§ÙÙÙ
+buttonRotateLeft = Ø§Ø¯Ø§Ø±Ø© ÙÙÙØ³Ø§Ø±
+buttonRotateRight = Ø§Ø¯Ø§Ø±Ø© ÙÙÙÙ
+ÙÙ
+buttonUpload = Ø±ÙØ¹
+buttonStop = Ø§ÙÙØ§Ù
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d Ø¯ÙÙÙØ©. Ù %3$d Ø«Ø§ÙÙØ©.
+timefmt_ms = %1$d Ø¯ÙÙÙØ©. Ù %2$d Ø«Ø§ÙÙØ©.
+timefmt_s = %1$d Ø«ÙØ§ÙÙ
+timefmt_unknown = ØºÙØ± Ù
+Ø¹Ø±ÙÙ
+status_msg = Ø¬Ù Ø§ØšÙÙØ¯ %1$d%% Ø§ÙØªÙÙ, Ø³Ø±Ø¹Ø© Ø§ÙÙÙÙ: %2$s, ØªÙØ±ÙØšØ§: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ø­Ø¬Ù
+ Ø§ÙÙ
+ÙÙ ÙÙ '%1$s' ÙØšÙØ± (%2$s)
+
+#FileUploadThread
+preparingFile = ØªØ­Ø¶ÙØ± Ø§ÙÙ
+ÙÙ %1$d/%2$d
+infoUploading = Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª %1$s
+infoUploaded = %1$s Ù
+ÙÙ Ø±ÙØ¹Ø©. Ø§ÙØªØžØ§Ø± Ø±Ø¯ Ø§ÙØ³ÙØ±ÙØ± ...
+infoAborted = ØªÙ
+ Ø§ÙØºØ§Ø¡ Ø§ÙØ±ÙØ¹ %1$d Ù
+ÙÙ.
+nbUploadedFiles = %1$d Ø§ÙÙ
+ÙÙ Ø§Ù Ø§ÙÙÙØ§Øª Ø±ÙØ¹Ø©
+errDuringUpload = ØªÙ
+ Ø§ÙØºØ§Ø¡ Ø§ÙØ±ÙØ¹ ØšØ£Ø®Ø·Ø§Ø¡
+errHttpResponse = Ø§ÙØ±ÙØ¹ ÙØŽÙ: Ø±Ø¯ Ø§ÙØ³ÙØ±ÙØ± ØºÙØ± Ù
+ØªÙÙØ¹
+questionSendMailOnError = Ø­Ø¯Ø« Ø®Ø·Ø§Ø¡ Ø§Ø«ÙØ§Ø¡ Ø§ÙØ±ÙØ¹. ÙÙ ØªØ±ÙØ¯ Ø§Ø±Ø³Ø§Ù ØšÙØ§ÙØ§Øª Ø§ÙØ®Ø·Ø£ Ø§ÙÙ Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ø§ÙØ§Ø³Ù
+
+colSize = Ø§ÙØ­Ø¬Ù
+
+colDirectory = Ø§ÙÙ
+Ø¬ÙØ¯
+colModified = Ø¹Ø¯Ù
+colReadable = ÙØ§ØšÙ ÙÙÙØ±Ø§Ø¡Ø©?
+errForbiddenExtension = Ø§Ù
+ØªØ¯Ø§Ø¯Ø§Øª ØºÙØ± Ù
+Ø³Ù
+ÙØ­Ø©.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ø­Ø¯Ø« Ø®Ø·Ø£ Ø§Ø«ÙØ§Ø¡ Ø§Ø¯Ø§Ø±Ø© Ø§ÙØ³Ø¬Ù
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§.
+coppermineUploadOk = ØªÙ
+ Ø±ÙØ¹ Ø§ÙØµÙØ± ØšÙØ¬Ø§Ø­, ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø®ØªØ§Ø±.\n\n Ø§ÙÙØ± Ø§ÙÙÙØ© ÙØªØ¹Ø¯ÙÙ Ø§Ø³Ù
+ Ù Ù
+Ø¹ÙÙÙ
+Ø§Øª Ø§ÙØµÙØ±.\n\n ÙØ§ ØªÙØ³Ù Ø§ÙÙÙØ± Ø¹ÙÙ 'Ø²Ø± ØªÙÙÙØ° Ø§ÙØªØ¹Ø¯ÙÙØ§Øª' ÙÙØªÙ
+ Ø­ÙØž Ø§ÙØªØ¹Ø¯ÙÙØ§Øª ÙÙ Ø§ÙØ³ÙØ±ÙØ± !
+
+#PictureFileData
+tooBigPicture = Ø§ÙØµÙØ±Ø© '%1$s' ÙØšÙØ±Ø© Ø¬Ø¯Ø§. Ø³ÙÙ ÙØªÙ
+ Ø±ÙØ¹ÙØ§ ØšØ¯ÙÙ ØªØ¹Ø¯ÙÙ (ØªØµØºÙØ± Ø§Ù ØžØºØ·...).
+notAPicture = Ø§ÙÙ
+ÙÙ ØšØ£Ø³Ù
+ '%1$s' ÙÙØ³ ØµÙØ±Ø©. ÙÙ ÙØªÙ
+ Ø§Ø¶Ø§ÙØªÙ Ø§ÙÙ Ø§ÙÙ
+ÙÙØ§Øª Ø§ÙÙ
+Ø±ÙÙØ¹Ø©.
+
+#PictureDialog
+buttonClose = Ø§ØºÙØ§Ù
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = ØªØ£ÙÙØ¯
+
+#InteractiveTrustManager
+itm_title_pass = Ø§Ø¯Ø®Ù %1$s ÙÙÙ
+Ø© Ø§ÙØ³Ø±
+itm_prompt_pass = %1$s ÙÙÙ
+Ø© Ø§ÙØ³Ø±:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Ø§ÙÙ
+ÙØ¶ÙØ¹:
+itm_cert_issuer = Ø§ÙÙ
+ØŽÙÙØ©:
+itm_cert_nbefore = ÙÙØ³ ÙØšÙ:
+itm_cert_nafter = ÙÙØ³ ØšØ¹Ø¯:
+itm_cert_serial = Ø§ÙØ±ÙÙ
+ Ø§ÙØªØ³ÙØ³ÙÙ:
+itm_cert_fprint = %1$s ØšØµÙ
+Ø©:
+itm_cert_C = Ø§ÙØšÙØ¯:
+itm_cert_CN = Ø§ÙØ§Ø³Ù
+ Ø§ÙØŽØ§ØŠØ¹:
+itm_cert_L = Ø§ÙÙ
+ÙÙØ¹:
+itm_cert_ST = Ø§ÙÙÙØ§ÙØ© Ø§Ù Ø§ÙÙ
+ÙØ§Ø·Ø¹Ø©:
+itm_cert_O = Ø§ÙÙ
+Ø€Ø³Ø³Ø©:
+itm_cert_OU = Organizational unit:
+itm_reasons = Ø§ÙØ§Ø³ØšØ§Øš:
+itm_reason_cnmatch = Ø§ÙØ§Ø³Ù
+ Ø§ÙØŽØ§ØŠØ¹ ÙØ§ ÙØ·Ø§ØšÙ Ø§Ø³Ù
+ Ø§ÙÙ
+Ø³ØªØ¶ÙÙ (%1$s).
+itm_reason_itrust = Ø§ÙØªØ±Ø®ÙØµ ØºÙØ± Ù
+ÙØ«ÙÙ.
+itm_reason_expired = Ø§ÙØªØ±Ø®ÙØµ Ø§ÙØªÙÙ.
+itm_reason_notyet = ÙÙ
+ ÙØªÙ
+ Ø§ÙØªØ£ÙØ¯ Ù
+Ù Ø§ÙØªØ±Ø®ÙØµ.
+itm_fail_verify = Ø§ÙØªØ±Ø®ÙØµ, Ù
+Ù Ø§ÙØ³ÙØ±ÙØ± ÙÙ
+ ÙØªÙ
+ ØªØ£ÙÙØ¯Ù.
+itm_accept_prompt = ÙÙ ØªØ±ÙØ¯ ÙØšÙÙ Ø§ÙØªØ±Ø®ÙØµ?
+itm_accept_always = Ø¯Ø§ØŠÙ
+Ø§
+itm_accept_now = ÙÙØ°Ù Ø§ÙØ¬ÙØ³Ø© ÙÙØ·
+itm_accept_no = ÙØ§
+itm_new_tstore = Ù
+ÙØ§Ù ØªØ®Ø²ÙÙ Ù
+ÙØ«ÙÙ Ø¬Ø¯ÙØ¯
+itm_tstore = Ù
+ÙØ§Ù ØªØ®Ø²ÙÙ
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <arabic.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// Maintainer: "Abdulrhman Alkhodiry" <almooheb@gmail.com>  
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'Ø¬Ù Ø§ØšÙÙØ¯',
+		  'link_comment' => 'Ø±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹, ØšØ³ØªØ®Ø¯Ø§Ù
+ Ø¬Ù Ø§ØšÙÙØ¯',
+		  'perm_denied' => 'ÙÙØ³Øª ÙØ¯ÙÙ Ø§ÙØµÙØ§Ø­ÙØ© ÙØªÙÙÙØ° ÙØ°Ø§ Ø§ÙØ§Ù
+Ø±.<BR><BR>Ø§Ø°Ø§ ÙÙ
+ ØªØ³Ø¬Ù Ø§ÙØ¯Ø®ÙÙ, Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ø¬ÙÙ <a href="$1">Ø§ÙØ¯Ø®ÙÙ</a> Ø§ÙÙØ§',
+		  'select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+, Ø§ÙØ°Ù Ø³ØªÙÙÙ
+ ØšØ±ÙØ¹ Ø§ÙØµÙØ± Ø¥ÙÙÙ',
+		  'button_update_album' => 'ØªØ­Ø¯ÙØ« Ø§ÙØ§ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÙØŽØ§Ø¡ Ø§ÙØ§ÙØšÙÙ
+',
+		  'success' => 'ØªÙ
+ Ø§ÙØªÙÙÙØ° ØšÙØ¬Ø§Ø­ !',
+		  'error_select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§',
+		  'error_album_name' => 'Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ù
+ÙØ© Ø§ÙØ§ÙØšÙÙ
+.',
+		  'error_album_already_exists' => 'ÙÙØ¬Ø¯ Ø§ÙØšÙÙ
+ ØšÙØ§Ø°Ø§ Ø§ÙØ§Ø³Ù
+.<BR><BR>Ø§ÙØ±Ø¬Ø§Ø¡ Ø§ÙØ±Ø¬ÙØ¹ Ø§ÙÙ <I>Ø§ÙØ®ÙÙ</I> ØšØ§ÙÙ
+ØªØµÙØ­ ÙØ§Ø®ØªÙØ§Ø± Ø§Ø³Ù
+ Ø¢Ø®Ø± ÙÙØ§ÙØšÙÙ
+.',
+		  'album_name' => 'Ø§Ø³Ù
+ Ø§ÙØ§ÙØšÙÙ
+',
+		  'album_presentation' => 'ÙØ¬Øš Ø¹ÙÙÙ Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+. Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±Ø³Ù Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹ Ø³ÙØªÙ
+ ØªØ®Ø²ÙÙÙØ§ ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯. <BR>Ø§Ø°Ø§ ÙØ§Ù ÙØ§ ÙÙØ¬Ø¯ ÙØ¯ÙÙ Ø§Ù Ø¥ÙØšÙÙ
+, ÙØ§ØŠÙ
+Ø© Ø§ÙØ§ÙØšÙÙ
+Ø§Øª Ø®Ø§ÙÙØ©. Ø§ÙÙØ± Ø¹ÙÙ \'Ø§ÙØŽØ§Ø¡\' button to create your first album.',
+		  'album_description' => 'ÙØµÙ Ø§ÙØ§ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§Ø¶Ø§ÙØ© ØµÙØ±Ø© Ø§ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯',
+		  'max_upload_size' => 'Ø§ÙØ­Ø¬Ù
+ Ø§ÙØ§ÙØµÙ ÙÙØµÙØ±Ø© ÙÙ $1 KB',
+		  'upload_presentation' => 'Ø§Ø°Ø§ Ø§ÙÙ
+Ø±ØšØ¹ ØšØ§ÙØ§Ø³ÙÙ ÙØ§ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§, ÙØŽØ±ÙØ· Ø§ÙØ­Ø§ÙØ© ØšØ§ÙØ§Ø³ÙÙ ÙÙØ¶Ø­ ÙØ¬ÙØ¯ Ø®Ø·Ø£, Ø§ÙØ­Ù Ø§ÙØ§ÙØ¶Ù ÙÙ ØªØ«ØšÙØª Ù
+ÙÙØ§Øª Ø§ÙØ¬Ø§ÙØ§.<BR>ØšØ¹Ø¯ Ø°ÙÙ, Ø±ÙØ¹ Ø§ÙØµÙØ± ÙÙÙ
+ÙÙØ¹ Ø³ÙÙ Ø¬Ø¯Ø§! ÙÙØ· ÙÙ
+ ØšØ§ÙÙÙØ± Ø¹ÙÙ <B>Ø§Ø³ØªØ¹Ø±Ø§Ø¶</B> ÙØ§Ø®ØªÙØ§Ø± Ø§ÙÙ
+ÙÙØ§Øª Ø§Ù ÙÙ
+ ØšØ³Ø­Øš Ø§ÙÙ
+ÙÙ Ù Ø§ÙÙØ§Ø¡Ù Ø¹ÙÙ Ø§ÙÙ
+Ø³ØªØ¹Ø±Ø¶ , Ø«Ù
+ Ø§ÙÙØ± Ø¹ÙÙ <B>Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª</B> ÙØ±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		. "<BR>ÙØ³ØªØ®Ø¯Ø§Ù
+ <U>ØµÙØ­Ø© Ø§ÙØ±ÙØ¹ Ø§ÙÙØ¯ÙÙ
+Ø©</U>, <a href='upload.php'>Ø§Ø¶ØºØ· ÙÙØ§</a>.",
+		  'album' => 'Ø§ÙØšÙÙ
+ Ø§ÙØµÙØ±',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø§ÙÙ
+ØªØµÙØ­ ÙØ§ ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±Ø§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§ _ Ø§ØšÙÙØª. ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ±ÙØ¹ ÙØ­ØªØ§Ø¬ Ø¬Ø§ÙØ§. ØªØ³ØªØ·ÙØ¹ ØªØ­Ù
+ÙÙ Ù
+ØŽØºÙ Ø§ÙØ¬Ø§ÙØ§ ØšØ³ÙÙÙØ© Ù
+Ù <a href="http:\\java.sun.com\jre\">Ù
+ÙÙØ¹ Ø¬Ø§ÙØ§</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Ø§Ø¶ØºØ· Ø¹ÙÙ Ø§ÙØ±Ø§ØšØ·, ÙÙÙ
+ ØšØ£Ø¯Ø®Ø§Ù Ø§ÙØšÙØ§ÙØ§Øª ÙÙ Ø§ÙØ§Ø³ÙÙ, Ø§Ø°Ø§ Ø§Ø±Ø¯Øª Ø­ÙØž Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙ Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±ÙØ¹.',
+		  'quota_used' => 'Ø§ÙØª ØªØ³ØªØ®Ø¯Ù
+ $1 MB ($2%) Ù
+Ù $3 MB Ø§ÙÙ
+Ø³Ø§Ø­Ø© Ø§ÙØ§Ø¬Ù
+Ø§ÙÙØ©.',
+		  'quota_about_full' => 'Ø§Ø­Ø°Ù ØšØ¹Ø¶ Ø§ÙØµÙØ±, Ø§Ù ÙÙ
+ ØšØ·ÙØš Ø²ÙØ§Ø¯Ø© Ø§ÙÙ
+Ø³Ø§Ø­Ø© ÙÙÙ
+ÙÙØ¹ Ù
+Ù Ø§ÙØŽØ±ÙØ© Ø§ÙÙ
+Ø³ØªØ¶ÙÙØ©.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÙÙ Ø§ÙØªØžØ§Ø± Ù
+ÙØ§ÙÙØ© Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹ Ø¹ÙÙ Ø§ÙØµÙØ±, ÙØšÙ Ø§Ù ØªØ³ØªØ·ÙØ¹ Ø±Ø£ÙØªÙÙ
+ ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/available_translations.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/available_translations.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/available_translations.apt	(revision 3951)
@@ -0,0 +1,45 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (list of available translations)
+           --------------------
+           --------------------
+           --------------------
+
+   This page contains the list of available translation, with the relevant contributors (thanks to them). Each line contains 
+   a link to the page which contains this translation. Each page contains both the applet translation (for this package), and a 
+   translation for the JUPload plugin for Coppermine. This second translation is not used, if you directly use the applet. But, 
+   as it is a free and open source project, it would be nice that translators also translate it...
+
+   Please read all details in the {{{../howto-translate.html}howto-translate}} page.
+
+*--------------------*--------------------*
+|| Language || Contributor |
+| {{{./lang.properties.html}English (default language file)}} | Core translation file (no contributor) |
+| {{{./lang_ar.properties.html}Arabic}} | "Abdulrhman Alkhodiry" <almooheb@gmail.com> |
+| {{{./lang_ar_SA.properties.html}Arabic}} | "Abdulrhman Alkhodiry" <almooheb@gmail.com> |
+| {{{./lang_bg.properties.html}Bulgarian}} | ÐÐ»ÐžÐ°Ðœ Ð¥ÑÐžÑÑÐŸÐŽÐŸÑÐŸÐ² (zulix@zulix.net) |
+| {{{./lang_cs.properties.html}Czech}} | Vladan Zajda |
+| {{{./lang_da.properties.html}Danish}} | Jeppe Bundsgaard |
+| {{{./lang_de.properties.html}German}} | Fritz Elfert <felfert@users.sourceforge.net> |
+| {{{./lang_en.properties.html}English}} | No maintainer (same content as lang.properties) |
+| {{{./lang_eo.properties.html}Esperanto}} | Chuck Smith |
+| {{{./lang_es.properties.html}Spanish}} | Unknown |
+| {{{./lang_fr.properties.html}French}} | Etienne <etienne_sf@users.sourceforge.net> |
+| {{{./lang_he.properties.html}Hebrew}} | liorda@gmail.com |
+| {{{./lang_hr.properties.html}Croatian}} | Bruno Simic |
+| {{{./lang_hu.properties.html}Hungarian}} | RÃ©zsÃ³ GÃ¡bor <gabor.rezso@gmail.com> |
+| {{{./lang_it.properties.html}Italian}} | Manuele Grueff mgrueff@atipica.it |
+| {{{./lang_ja.properties.html}Japanese}} | Takashi Yukawa: takashi_922 at yahoo dot co dot jp |
+| {{{./lang_nl.properties.html}Dutch}} | Unknown |
+| {{{./lang_no.properties.html}Norwegian}} | Unkown |
+| {{{./lang_pl.properties.html}Polish}} | Unknown |
+| {{{./lang_pt.properties.html}Portugese}} | Filipe Teixeira <filipesteixeira@gmail.com> |
+| {{{./lang_pt_BR.properties.html}Brasilian (Protugese)}} | Filipe Teixeira <filipesteixeira@gmail.com> |
+| {{{./lang_ro.properties.html}Romanian (idem to Moldova)}} | Adrian (nickname: ady1503) (mail: gallery@butnarumd.com) |
+| {{{./lang_ru.properties.html}Russian}} | Unknown |
+| {{{./lang_sk.properties.html}Slovak}} | Unknown |
+| {{{./lang_sl.properties.html}Slovenian}} | Unknown |
+| {{{./lang_sv.properties.html}Swedish}} | Erik Lindahl erik@fisensmosse.se |
+| {{{./lang_tr.properties.html}Turkish}} | Unknown |
+| {{{./lang_zh.properties.html}Chinese simplified}} | bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw) |
+| {{{./lang_zh_TW.properties.html}Chinese simplified}} | bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw) |
+*--------------------*--------------------*
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_tr.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_tr.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_tr.properties.apt	(revision 3951)
@@ -0,0 +1,250 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Turkish)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Turkish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = turkish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = GÃ¶zat...
+buttonRemoveSelected = SeÃ§ileni ÃÄ±kar
+buttonRemoveAll = Hepsini ÃÄ±kar
+buttonRotateLeft = Sola Ãevir
+buttonRotateRight = SaÄa Ãevir
+buttonUpload = GÃ¶nder
+buttonStop = DURDUR
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d Dosya HazÄ±rlanÄ±yor
+infoUploading = Dosyalar gÃ¶nderiliyor %1$s
+infoUploaded = %1$s Dosya gÃ¶nderildi. Sunucudan yanÄ±t bekleniyor
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+#MISSING  nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = GÃ¶nderim hata verip sona erdi.
+errHttpResponse = Sunucu HTTP cevabÄ± kriterlere uymadÄ±. GÃ¶nderim baÅarÄ±sÄ±z.
+questionSendMailOnError = GÃ¶nderim sÄ±rasÄ±nda hatayla karÅÄ±laÅÄ±ldÄ±. Bu durumla ilgili bilgileri webmasterâa gÃ¶ndermek istermisiniz?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ad
+colSize = Boyut
+colDirectory = Dizin
+colModified = DeÄiÅtirilme
+colReadable = Okunabilir mi?
+errForbiddenExtension = Yasak olan uzantÄ±.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ä°Ålem kayÄ±t yÃ¶netiminde bir sorun oluÅtu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = LÃŒtfen Ã¶nce bir albÃŒm seÃ§iniz.
+coppermineUploadOk = Resimler sunucuda seÃ§ili albÃŒme baÅarÄ±yla gÃ¶nderildi. \n\n YapacaÄÄ±nÄ±z deÄiÅiklikleri kaydetmek iÃ§in âDeÄiÅiklikleri Kaydetâe tÄ±klamayÄ± unutmayÄ±nÄ±z!
+
+#PictureFileData
+tooBigPicture = '%1$s' adlÄ± gÃ¶rÃŒntÃŒ dosyasÄ± Ã§ok bÃŒyÃŒk. Herhangi bir deÄiÅiklik yapmadan (dÃ¶ndÃŒrme, boyut deÄiÅtirme vb.) gÃ¶nderilecek.
+notAPicture = '%1$s' adlÄ± dosya bir gÃ¶rÃŒntÃŒ dosyasÄ± deÄildir. Bu dosya, gÃ¶nderilecek dosyalar listesine eklenmedi.
+
+#PictureDialog
+buttonClose = Kapat
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <turkish.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Bu iÅlemi yapmaya yetkili deÄilsiniz.<BR><BR>EÄer baÄlÄ± deÄilseniz lÃŒtfen Ã¶nce <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">giriÅ yapÄ±n</a>',
+		  'select_album' => 'LÃŒtfen resimleri gÃ¶ndereceÄiniz albÃŒmÃŒ seÃ§iniz. ',
+		  'button_update_album' => 'AlbÃŒmÃŒ gÃŒncelle',
+		  'button_create_album' => 'AlbÃŒm Yarat',
+		  'success' => 'Ä°Ålem BaÅarÄ±lÄ± !',
+		  'error_select_album' => 'LÃŒtfen Ã¶nce albÃŒm seÃ§iniz',
+		  'error_album_name' => 'LÃŒtfen AlbÃŒm adÄ±nÄ± girin.',
+		  'error_album_already_exists' => 'Bu isimde bir albÃŒm zaten var<BR><BR>AlbÃŒmÃŒnÃŒze baÅka bir isim vermek iÃ§in lÃŒtfen tarayÄ±cÄ±nÄ±zdaki <I>Geri</I> dÃŒÄmesine basÄ±nÄ±z.',
+		  'album_name' => 'AlbÃŒm adÄ±',
+		  'album_presentation' => 'Burada bir albÃŒm seÃ§melisiniz. GÃ¶ndereceÄiniz resimler sunucuda bu albÃŒm iÃ§erisine kaydedilecektir. <BR>EÄer bir albÃŒmÃŒnÃŒz yoksa albÃŒm listesi boÅ gÃ¶zÃŒkecektir. Ãnce \'Yarat\' dÃŒÄmesine basÄ±p ilk albÃŒmÃŒnÃŒzÃŒ yaratabilirsiniz.',
+		  'album_description' => 'AlbÃŒm tanÄ±mÄ±',
+		  'add_pictures' => 'SeÃ§ili albÃŒme resim ekle',
+		  'max_upload_size' => 'Maksimum resim boyutu: $1 Ko',
+		  'upload_presentation' => 'EÄer aÅaÄÄ±daki kare appleti gÃ¶stermiyor ve tarayÄ±cÄ±nÄ±z sayfada sÃŒrekli olarak hata mesajlarÄ± veriyorsa, java runtime plugin\'i yÃŒklemek gerekecektir..<BR>SonrasÄ±nda gÃ¶nderim gerÃ§ekten basit olacaktÄ±r! <B>GÃ¶zat</B> a basÄ±p dosyalarÄ± seÃ§in ya da dosyalarÄ± bilgisaranÄ±zdan sÃŒrÃŒkleyip bÄ±rakÄ±n. SonrasÄ±nda <B> GÃ¶nder </B> e basÄ±p resimleri sunucuya gÃ¶nderin.'
+		  	. "<BR><U>Eski gÃ¶nderim sayfasÄ±</U>nÄ± kullanmak iÃ§in, <a href='upload.php'>tÄ±klayÄ±nÄ±z</a>.",
+		  'album' => 'AlbÃŒm',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ru.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ru.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ru.properties.apt	(revision 3951)
@@ -0,0 +1,256 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Russian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Russian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = russian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = ÐÐ±Ð·ÐŸÑ ...
+buttonRemoveSelected = Ð£ÐŽÐ°Ð»ÐžÑÑ Ð²ÑÐ±ÑÐ°ÐœÐœÐŸÐµ
+buttonRemoveAll = Ð£ÐŽÐ°Ð»ÐžÑÑ Ð²ÑÐµ
+buttonRotateLeft = ÐÐŸÐ²ÐµÑÐœÑÑÑ Ð²Ð»ÐµÐ²ÐŸ
+buttonRotateRight = ÐÐŸÐ²ÐµÑÐœÑÑÑ Ð²Ð¿ÑÐ°Ð²ÐŸ
+buttonUpload = ÐÐ°Ð³ÑÑÐ·ÐžÑÑ
+buttonStop = Ð¡Ð¢ÐÐ
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ð Ð°Ð·ÐŒÐµÑ ÑÐ°Ð¹Ð»Ð° '%1$s' ÑÐ»ÐžÑÐºÐŸÐŒ Ð²ÐµÐ»ÐžÐº (%2$s)
+
+#FileUploadThread
+preparingFile = ÐÐŸÐŽÐ³ÐŸÑÐŸÐ²ÐºÐ° ÑÐ°Ð¹Ð»Ð° %1$d/%2$d
+infoUploading = ÐÐ°Ð³ÑÑÐ·ÐºÐ° ÑÐ°Ð¹Ð»ÐŸÐ² %1$s
+infoUploaded = Ð€Ð°Ð¹Ð»(Ñ) %1$s Ð·Ð°Ð³ÑÑÐ¶ÐµÐœ(Ñ). ÐÐ¶ÐžÐŽÐ°ÐœÐžÐµ ÐŸÑÐ²ÐµÑÐ° ÑÐµÑÐ²ÐµÑÐ° ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = ÐÐ°Ð³ÑÑÐ¶ÐµÐœÐŸ ÑÐ°Ð¹Ð»ÐŸÐ²: %1$d
+errDuringUpload = ÐÐ°Ð³ÑÑÐ·ÐºÐ° Ð¿ÑÐµÑÐ²Ð°ÐœÐ° Ñ ÐŸÑÐžÐ±ÐºÐ°ÐŒÐž
+errHttpResponse = ÐÐµÐ¿ÑÐ°Ð²ÐžÐ»ÑÐœÑÐ¹ HTTP-ÐŸÑÐ²ÐµÑ ÑÐµÑÐ²ÐµÑÐ°. ÐÐ°Ð³ÑÑÐ·ÐºÐ° ÐœÐµ ÑÐŽÐ°Ð»Ð°ÑÑ.
+questionSendMailOnError = ÐÐŸ Ð²ÑÐµÐŒÑ Ð·Ð°Ð³ÑÑÐ·ÐºÐž Ð¿ÑÐŸÐžÐ·ÐŸÑÐ»Ð° ÐŸÑÐžÐ±ÐºÐ°. ÐÑ Ñ
+ÐŸÑÐžÑÐµ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÑ ÑÑÑ ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ Ð²ÐµÐ±ÐŒÐ°ÑÑÐµÑÑ?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = ÐÐŒÑ
+colSize = Ð Ð°Ð·ÐŒÐµÑ
+colDirectory = ÐÐžÑÐµÐºÑÐŸÑÐžÑ
+colModified = ÐÐ·ÐŒÐµÐœÐµÐœ
+colReadable = ÐÐŸÑÑÑÐ¿ÐµÐœ?
+errForbiddenExtension = ÐÐ°Ð¿ÑÐµÑÐµÐœÐœÐŸÐµ ÑÐ°ÑÑÐžÑÐµÐœÐžÐµ ÑÐ°Ð¹Ð»Ð°.
+
+#DefaultUploadPolicy
+errDuringLogManagement = ÐÑÐž ÐŸÐ±ÑÐ°Ð±ÐŸÑÐºÐµ Ð»ÐŸÐ³ÐŸÐ² Ð¿ÑÐŸÐžÐ·ÐŸÑÐ»Ð° ÐŸÑÐžÐ±ÐºÐ°
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.
+coppermineUploadOk = ÐÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑ Ð±ÑÐ»Ðž ÑÑÐ¿ÐµÑÐœÐŸ Ð·Ð°Ð³ÑÑÐ¶ÐµÐœÑ ÐœÐ° ÑÐµÑÐ²ÐµÑ Ð² Ð²ÑÐ±ÑÐ°ÐœÐœÑÐ¹ Ð°Ð»ÑÐ±ÐŸÐŒ.\n\nÐÐ°Ð¶ÐŒÐžÑÐµ Ok, ÑÑÐŸÐ±Ñ ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ ÐœÐ°Ð·Ð²Ð°ÐœÐžÑ Ðž ÐºÐŸÐŒÐŒÐµÐœÑÐ°ÑÐžÐž Ðº ÑÑÐžÐŒ ÐžÐ·ÐŸÐ±ÑÐ°Ð¶ÐµÐœÐžÑÐŒ.\n\nÐÐµ Ð·Ð°Ð±ÑÐŽÑÑÐµ ÐœÐ°Ð¶Ð°ÑÑ ÐºÐœÐŸÐ¿ÐºÑ 'Ð¡ÐŸÑ
+ÑÐ°ÐœÐžÑÑ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ' ÐŽÐ»Ñ ÑÐŸÑ
+ÑÐ°ÐœÐµÐœÐžÑ ÐžÑ
+ ÐœÐ° ÑÐµÑÐ²ÐµÑÐµ!
+
+#PictureFileData
+tooBigPicture = ÐÐ°ÑÑÐžÐœÐºÐ° '%1$s' ÑÐ»ÐžÑÐºÐŸÐŒ Ð²ÐµÐ»ÐžÐºÐ°. ÐÐœÐ° Ð±ÑÐŽÐµÑ Ð·Ð°Ð³ÑÑÐ¶ÐµÐœÐ° Ð±ÐµÐ· ÐžÐ·ÐŒÐµÐœÐµÐœÐžÐ¹ (Ð¿ÐŸÐ²ÐŸÑÐŸÑ, ÐžÐ·ÐŒÐµÐœÐµÐœÐžÐµ ÑÐ°Ð·ÐŒÐµÑÐŸÐ²...).
+notAPicture = Ð€Ð°Ð¹Ð» '%1$s' ÐœÐµ ÐµÑÑÑ ÐºÐ°ÑÑÐžÐœÐºÐ°. ÐÐœ ÐœÐµ Ð±ÑÐŽÐµÑ ÐŽÐŸÐ±Ð°Ð²Ð»ÐµÐœ Ð² ÑÐ¿ÐžÑÐŸÐº ÑÐ°Ð¹Ð»ÐŸÐ² ÐŽÐ»Ñ Ð·Ð°Ð³ÑÑÐ·ÐºÐž.
+
+#PictureDialog
+buttonClose = ÐÐ°ÐºÑÑÑÑ
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <russian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Ð£ ÐÐ°Ñ ÐœÐµÑ Ð¿ÑÐ°Ð² ÐœÐ° Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ ÑÑÐŸÐ¹ ÐŸÐ¿ÐµÑÐ°ÑÐžÐž.<br /><br />ÐÑÐ»Ðž Ð²Ñ ÐœÐµ Ð°Ð²ÑÐŸÑÐžÐ·ÐŸÐ²Ð°ÐœÑ, Ð¿ÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">Ð°Ð²ÑÐŸÑÐžÐ·ÑÐ¹ÑÐµÑÑ</a>.',
+		  'select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ, Ð² ÐºÐŸÑÐŸÑÑÐ¹ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž.',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²ÐžÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'button_create_album' => 'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'success' => 'ÐÐŸÑÐŸÐ²ÐŸ!',
+		  'error_select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_name' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÐœÐ°Ð·ÐŸÐ²ÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_already_exists' => 'Ð£ ÐÐ°Ñ ÑÐ¶Ðµ ÐµÑÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ Ñ ÑÐ°ÐºÐžÐŒ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµÐŒ.<br /><br />ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, <a href="javascript:history.back()">Ð²ÐµÑÐœÐžÑÐµÑÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ (ÐžÐ»Ðž ÐœÐ°Ð¶ÐŒÐžÑÐµ <i>ÐÐ°Ð·Ð°ÐŽ</i> Ð² ÐœÐ°Ð²ÐžÐ³Ð°ÑÐŸÑÐµ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°) Ðž ÐŽÐ°Ð¹ÑÐµ ÐŽÑÑÐ³ÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐÐ°ÑÐµÐŒÑ ÐœÐŸÐ²ÐŸÐŒÑ Ð°Ð»ÑÐ±ÐŸÐŒÑ.',
+		  'album_name' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'album_presentation' => 'ÐÐŽÐµÑÑ ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ Ð²ÑÐ±ÑÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ. ÐÐ°ÑÑÐžÐœÐºÐž, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ Ð±ÑÐŽÐµÑÐµ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑ ÐœÐ° ÑÐµÑÐ²ÐµÑ, Ð±ÑÐŽÑÑ ÑÐŸÑ
+ÑÐ°ÐœÐµÐœÑ Ð² ÑÑÐŸÐŒ Ð°Ð»ÑÐ±ÐŸÐŒÐµ.<br />ÐÑÐ»Ðž Ñ ÐÐ°Ñ ÐµÑÐµ ÐœÐµÑ Ð°Ð»ÑÐ±ÐŸÐŒÐŸÐ², ÑÐ¿ÐžÑÐŸÐº Ð¿ÑÑÑÐŸÐ¹. ÐÐ°Ð¶ÐŒÐžÑÐµ \'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ\' ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐœÐŸÐ²ÐŸÐ³ÐŸ Ð°Ð»ÑÐ±ÐŸÐŒÐ°.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž Ð² Ð²ÑÐ±ÑÐ°ÐœÐœÑÐ¹ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÑÐ¹ ÑÐ°Ð·ÐŒÐµÑ ÑÐ°Ð¹Ð»Ð° ÐºÐ°ÑÑÐžÐœÐºÐž $1 ÐÐ±',
+		  'upload_presentation' => 'ÐÑÐ»Ðž ÐŸÐ±Ð»Ð°ÑÑÑ ÑÐºÑÐ°ÐœÐ° ÐœÐžÐ¶Ðµ ÐŸÐŽÐœÐŸÐ·ÐœÐ°ÑÐœÐŸ ÐŸÑÐºÐ°Ð·ÑÐ²Ð°ÐµÑÑÑ ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ Ð°Ð¿Ð¿Ð»ÐµÑ Ðž Ð±ÑÐ°ÑÐ·ÐµÑ ÑÐŸÐŸÐ±ÑÐ°ÐµÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ, Ð¿ÐŸÐ¿ÑÐŸÐ±ÑÐ¹ÑÐµ ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ Ð¿Ð»Ð°Ð³ÐžÐœ <a href="http://java.sun.com/" target="_blank">Java&#8482;</a> ÐŽÐ»Ñ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°.<br />ÐÐŸÑÐ»Ðµ ÑÑÐŸÐ³ÐŸ Ð·Ð°Ð³ÑÑÐ·ÐºÐ° ÐºÐ°ÑÑÐžÐœÐŸÐº Ð±ÑÐŽÐµÑ ÐœÐ°ÐŒÐœÐŸÐ³ÐŸ Ð¿ÑÐŸÑÐµ! ÐÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ±Ð·ÐŸÑ</b>, ÑÑÐŸÐ±Ñ Ð²ÑÐ±ÑÐ°ÑÑ ÑÐ°Ð¹Ð»Ñ, ÐžÐ»Ðž ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ drag\'n\'drop ÐžÐ· Explorer\'Ð°, Ð·Ð°ÑÐµÐŒ ÐœÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ°Ð³ÑÑÐ·ÐžÑÑ</b> ÑÑÐŸÐ±Ñ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÑ ÑÐ°Ð¹Ð»Ñ ÐœÐ° ÑÐµÑÐ²ÐµÑ.'
+		        . '<br />ÐÐŸÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ <u>ÑÑÐ°ÑÑÐŒ ÑÐ¿ÐŸÑÐŸÐ±ÐŸÐŒ Ð·Ð°Ð³ÑÑÐ·ÐºÐž</u> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ <a href="upload.php">Ð·ÐŽÐµÑÑ</a>.',
+		  'album' => 'ÐÐ»ÑÐ±ÐŸÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_de.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_de.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_de.properties.apt	(revision 3951)
@@ -0,0 +1,247 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (German)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = German
+contributor = Fritz Elfert <felfert@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = german
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Durchsuchen ...
+buttonRemoveSelected = AusgewÃ€hlte entfernen
+buttonRemoveAll = Alle entfernen
+buttonRotateLeft = Gegen den Uhrzeigersinn drehen
+buttonRotateRight = Im Uhrzeigersinn drehen
+buttonUpload = Hochladen
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d Std., %2$d Min. und %3$d Sec.
+timefmt_ms = %1$d Min. und %2$d Sek.
+timefmt_s = %1$d Sekunden
+timefmt_unknown = unbekannt
+status_msg = JUpload %1$d%% abgeschlossen, Transferrate: %2$s, Verbleibend: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Die Datei '%1$s' ist zu groÃ (%2$s)
+
+#FileUploadThread
+preparingFile = Datei vorbereiten:  %1$d/%2$d
+infoUploading = Ãbertrage Datei: %1$s
+infoUploaded = %1$s Datei(en) hochgeladen. Warte auf Server Antwort ...
+infoAborted = Upload nach %1$d Dateien(en) abgebrochen.
+nbUploadedFiles = %1$d Datei(en) hochgeladen
+errDuringUpload = Upload-Vorgang wegen eines Fehlers gestoppt
+errHttpResponse = Die HTTP Antwort erfÃŒllt nicht die Kriterien. Vorgang fehlgeschlagen.
+questionSendMailOnError = Es ist ein Fehler aufgetreten. Soll das\nFehlerprotokoll an den Webmaster gesendet werden?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = GrÃ¶Ãe
+colDirectory = Verzeichnis
+colModified = GeÃ€ndert
+colReadable = Lesbar?
+errForbiddenExtension = Keine erlaubte Dateiendung.
+
+#DefaultUploadPolicy
+errDuringLogManagement = WÃ€hrend des Log Managements ist ein Fehler aufgetreten
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bitte zuerst ein Album auswÃ€hlen.
+coppermineUploadOk = Die Dateien wurden erfolgreich in das ausgewÃ€hlte Album hochgeladen. \n\nBitte auf OK klicken um zu den Dateien Name und Beschreibung hinzuzufÃŒgen.\n\nNach der Eingabe auf 'Ãnderungen Ãbernehmen' klicken, um die Informationen zu speichern !
+
+#PictureFileData
+tooBigPicture = Das Bild '%1$s' ist zu groÃ und wird ohne Ãnderungen hochgeladen (ohne Drehung, GrÃ¶ÃenÃ€nderung...).
+notAPicture = Die Datei '%1$s' ist kein Bild. Sie wird nicht der Liste der hochzuladenden Dateien hinzugefÃŒgt.
+
+#PictureDialog
+buttonClose = SchlieÃen
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = BestÃ€tigen
+
+#InteractiveTrustManager
+itm_title_pass = %1$s Password eingeben
+itm_prompt_pass = %1$s Passwort:
+itm_cert_alert = SSL Zertificats-Warnung
+itm_cert_details = Zertifikats-Details:
+itm_cert_subject = Inhaber:
+itm_cert_issuer = Aussteller:
+itm_cert_nbefore = GÃŒltig ab:
+itm_cert_nafter = GÃŒltig bis:
+itm_cert_serial = Seriennr.:
+itm_cert_fprint = %1$s Fingerabdruck:
+itm_cert_C = Land:
+itm_cert_CN = Allgemeiner Name:
+itm_cert_L = Stadt:
+itm_cert_ST = Staat oder Provinz:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations-Abteilung:
+itm_reasons = GrÃŒnde:
+itm_reason_cnmatch = Der allgemaine Name passt nicht zum Hostnamen (%1$s).
+itm_reason_itrust = Dem Aussteller des Zertifikats wird nicht vertraut.
+itm_reason_expired = Das Zertifikat ist abgelaufen.
+itm_reason_notyet = Das Zertifikat ist noch nicht gÃŒltig.
+itm_fail_verify = Das Zertifikat des Servers konnte nicht ÃŒberprÃŒft werden.
+itm_accept_prompt = Wollen Sie dieses Zertifikat annehmen?
+itm_accept_always = Immer
+itm_accept_now = Nur fÃŒr diese Sitzung
+itm_accept_no = Nein
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <german.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File german.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du hast keine Berechtigung fÃŒr diesen Vorgang.<BR><BR>Bitte <a href="$1">melde</a> Dich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hle ein Album aus, in das Du Dateien hochladen mÃ¶chtest',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erzeugen',
+		  'success' => 'Vorgang erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte gib dem Album einen Namen.',
+		  'error_album_already_exists' => 'Du hast bereits ein Album mit diesem Namen.<BR><BR>Bitte klicke auf den <I>ZurÃŒck</I> Button Deines Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hle ein Album aus. Die Dateien, die Du hochladen mÃ¶chtest, werden in diesem Album gespeichert. <BR>Wenn Du noch kein Album erstellt hast, dann benutze bitte die \'Album erzeugen\' Funktion um Dein erstes Album zu erstellen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem Album hinzufÃŒgen',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 KB',
+		  'upload_presentation' => 'Wenn die unteren Box leer bleibt und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfe bitte, ob Du die neueste Version des Java runtime plugins installiert hast.<BR>Um Dateien hochzuladen klicke auf <B>Durchsuchen</B> und wÃ€hle die Dateien aus oder fÃŒge sie per drag\'n\'drop aus Deinem Ordner ein. AnschlieÃend auf <B>Hochladen</B> klicken um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte</U> Datei hochladen-Funktion zu nutzen, klicke bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Dein Browser erlaubt kein java. Das Jupload Applet braucht java. Du kannst es unter <a href="http:\\java.sun.com\jre\">java web site</a> kostenlos herunterladen',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicke auf diesen Link und gib die gewÃŒnschten Daten in die Felder ein wenn Du sie zu allen Bildern des nÃ€chsten Uploads hinzufÃŒgen mÃ¶chtest.',
+		  'quota_used' => 'Du nutzt momentan $1 MB ($2%) von maximal $3 MB Speicher.',
+		  'quota_about_full' => 'Entferne einige Bilder oder bitte den Administrator Deinen Speicherplatz zu erhÃ¶hen.',
+		  //Since 3.2.0
+		  'need_approval' => 'Der Galerieadministrator muss die hochgeladenen Bilder genehmigen und freischalten, bevor sie gesehen werden kÃ¶nnen.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_bg.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_bg.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_bg.properties.apt	(revision 3951)
@@ -0,0 +1,256 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Bulgarian)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Bulgarian
+contributor = ÐÐ»ÐžÐ°Ðœ Ð¥ÑÐžÑÑÐŸÐŽÐŸÑÐŸÐ² (zulix@zulix.net)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = bulgarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = ÐÑÐµÐ³Ð»ÐµÐŽ ...
+buttonRemoveSelected = ÐÐ·ÑÑÐžÐ¹ ÐžÐ·Ð±ÑÐ°ÐœÐŸÑÐŸ
+buttonRemoveAll = ÐÐ·ÑÐžÐ¹ Ð²ÑÐžÑÐºÐŸ
+buttonRotateLeft = ÐÐ°Ð²ÑÑÑÐž ÐœÐ° Ð»ÑÐ²ÐŸ
+buttonRotateRight = ÐÐ°Ð²ÑÑÑÐž ÐœÐ° ÐŽÑÑÐœÐŸ
+buttonUpload = ÐÐ°ÑÐ²Ð°ÐœÐµ
+buttonStop = Ð¡Ð¢ÐÐ
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = ÐÐ±/Ñ
+speedunit_mb_per_second = ÐÐ±/Ñ
+speedunit_kb_per_second = ÐÐ±/Ñ
+speedunit_b_per_second = Ð±/Ñ
+timefmt_hms = %1$dÑ, %2$d ÐŒÐžÐœ. Ðž %3$d ÑÐµÐº.
+timefmt_ms = %1$d ÐŒÐžÐœ. Ðž %2$d ÑÐµÐº.
+timefmt_s = %1$d ÑÐµÐºÑÐœÐŽÐž
+timefmt_unknown = ÐœÐµÐŸÐ¿ÑÐµÐŽÐµÐ»ÐµÐœÐŸ
+status_msg = ÐÐ°ÑÐ²Ð°ÐœÐµÑÐŸ %1$d%% Ð¿ÑÐžÐºÐ»ÑÑÐž, Ð¢ÑÐ°ÐœÑÑÐµÑ ÑÑÐ°ÑÑÑ: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = ÐÐŸÐ»ÐµÐŒÐžÐœÐ°ÑÐ° ÐœÐ° Ñ
+Ð°Ð¹Ð»Ð° '%1$s' Ðµ ÐŒÐœÐŸÐ³ÐŸ Ð³ÐŸÐ»ÑÐŒÐ° (%2$s)
+
+#FileUploadThread
+preparingFile = ÐÐŸÐŽÐ³ÐŸÑÐŸÐ²ÐºÐ° ÐœÐ° ÑÐ°Ð¹Ð»Ð° %1$d/%2$d
+infoUploading = ÐÐ°ÑÐ²Ð°ÐœÐµ ÐœÐ° ÑÐ°Ð¹Ð»ÐŸÐ²Ðµ %1$s
+infoUploaded = %1$s ÑÐ°Ð¹Ð»(Ð°) ÐºÐ°ÑÐ²Ð°ÐœÐµ. Ð§Ð°ÐºÐ°ÐœÐµ ÐŸÑÐ³ÐŸÐ²ÐŸÑ ÐŸÑ ÑÑÑÐ²Ð°ÑÐ° ...
+infoAborted = ÐÐ°ÑÐ²Ð°ÐœÐµÑÐŸ Ð¿ÑÐµÐºÑÐ°ÑÐµÐœÐŸ ÑÐ»ÐµÐŽ %1$d Ð€Ð°Ð¹Ð»(Ð°).
+nbUploadedFiles = %1$d ÑÐ°Ð¹Ð»(Ð°) ÐºÐ°ÑÐµÐœÐž
+errDuringUpload = ÐÐ°ÑÐ²Ð°ÐœÐµÑÐŸ ÑÐ¿ÑÑ Ð·Ð°ÑÐ°ÐŽÐž Ð³ÑÐµÑÐºÐž
+errHttpResponse = ÐÐ°ÑÐ²Ð°ÐœÐµÑÐŸ Ð¿ÑÐŸÐ¿Ð°ÐŽÐœÐ°: ÐœÐµÐŸÑÐ°ÐºÐ²Ð°ÐœÐž HTTP ÐŸÑÐ³ÐŸÐ²ÐŸÑÐž
+questionSendMailOnError = ÐÑÐ·ÐœÐžÐºÐœÐ° Ð³ÑÐµÑÐºÐ° Ð¿ÐŸ Ð²ÑÐµÐŒÐµ ÐœÐ° ÐºÐ°ÑÐ²Ð°ÐœÐµÑÐŸ. ÐÑÐºÐ°ÑÐµ Ð»Ðž ÐŽÐ° ÐžÐ·Ð¿ÑÐ°ÑÐžÑÐµ ÑÑÐ»Ð°ÑÐ° ÐœÐµÐŸÐ±Ñ
+ÐŸÐŽÐžÐŒÐ° ÐžÐœÑÐŸÑÐŒÐ°ÑÐžÑ Ð·Ð° ÑÐµÐ±ÐŒÐ°ÑÑÑÑÐ°?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = ÐÐŒÐµ
+colSize = Ð Ð°Ð·ÐŒÐµÑ
+colDirectory = ÐÐžÑÐµÐºÑÐŸÑÐžÑ
+colModified = ÐÑÐŸÐŒÐµÐœÐµÐœÐŸ
+colReadable = Ð§ÐµÑÐ»ÐžÐ²ÐŸ?
+errForbiddenExtension = ÐÐ°Ð±ÑÐ°ÐœÐµÐœÐŸ ÑÐ°Ð¹Ð»ÐŸÐ²ÐŸ ÑÐ°Ð·ÑÐžÑÐµÐœÐžÐµ.
+
+#DefaultUploadPolicy
+errDuringLogManagement = ÐÑÐ·ÐœÐžÐºÐœÐ° Ð³ÑÐµÑÐºÐ° Ð¿ÐŸ Ð²ÑÐµÐŒÐµ ÐœÐ° ÑÐ¿ÑÐ°Ð²Ð»ÐµÐœÐžÐµÑÐŸ
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ÐÐŸÐ»Ñ, ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ.
+coppermineUploadOk = Ð¡ÐœÐžÐŒÐºÐžÑÐµ ÑÐ° Ð·Ð°ÑÐµÐŽÐµÐœÐž Ð¿ÑÐ°Ð²ÐžÐ»ÐœÐŸ ÐœÐ° ÑÑÑÐ²ÑÑÐ°, Ð² ÐžÐ·Ð±ÑÐ°ÐœÐžÑ Ð°Ð»Ð±ÑÐŒ. .\n\nÐÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° Ok ÑÐµÐ³Ð° Ð·Ð° ÐŽÐ° ÑÐµ Ð°ÑÐŸÑÐžÐžÑÐ°Ñ ÐžÐŒÐµÐœÐ°ÑÐ° Ðž ÐºÐŸÐŒÐµÐœÑÐ°ÑÐžÑÐµ ÐœÐ° ÑÐµÐ·Ðž ÑÐœÐžÐŒÐºÐž.\n\nÐÐµ Ð·Ð°Ð±ÑÐ°Ð²ÑÐ¹ÑÐµ ÐŽÐ° ÐºÐ»ÐžÐºÐœÐµÑÐµ Ð²ÑÑÑ
+Ñ'Apply modification button' , Ð·Ð° ÐŽÐ° Ð·Ð°Ð¿Ð°Ð·ÐžÑÐµ ÐžÐ·ÐŒÐµÐœÐµÐœÐžÑ ÐœÐ° ÑÑÑÐ²ÑÑÐ°!
+
+#PictureFileData
+tooBigPicture = Ð¡ÐœÐžÐŒÐºÐ°ÑÐ° '%1$s' Ðµ Ð¿ÑÐµÐºÐ°Ð»ÐµÐœÐŸ Ð³ÐŸÐ»ÑÐŒÐ°. Ð¢Ñ ÑÐµ Ð±ÑÐŽÐµ ÐºÐ°ÑÐµÐœÐ° ÐœÐµÐ¿ÑÐŸÐŒÐµÐœÐµÐœÐ° (ÐœÑÐŒÐ° Ð²ÑÑÑÐµÐœÐµ, Ð¿ÑÐµÐŸÑÐ°Ð·ÐŒÐµÑÑÐ²Ð°ÐœÐµ ...).
+notAPicture = ÐÐŒÐµÑÐŸÐœÐ° ÑÐ°Ð¹Ð»Ð° '%1$s' ÐœÐµ Ðµ ÑÐœÐžÐŒÐºÐ°. Ð¢ÐŸÐ²Ð° ÐœÐµ Ðµ ÐŽÐŸÐ±Ð°Ð²ÐµÐœÐŸ ÐºÑÐŒ ÑÐ¿ÐžÑÑÐºÐ° ÐœÐ° Ð¿ÐŸÐŽÑÑÐ¶Ð°ÐœÐžÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²Ðµ.
+
+#PictureDialog
+buttonClose = ÐÐ°ÑÐ²ÐŸÑÐž
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = ÐÐŸÑÐ²ÑÑÐŽÐž
+
+#InteractiveTrustManager
+itm_title_pass = ÐÐ°Ð¿ÐžÑÐž %1$s Ð¿Ð°ÑÐŸÐ»Ð°
+itm_prompt_pass = %1$s Ð¿Ð°ÑÐŸÐ»Ð°:
+itm_cert_alert = SSL Ð¡ÐµÑÑÐžÑÐžÐºÐ°Ñ Ð¿ÑÐµÐŽÐŸÐ¿ÑÐµÐ¶ÐŽÐµÐœÐžÐµ
+itm_cert_details = ÐÐµÑÐ°ÐžÐ»Ðž ÐœÐ° ÑÐµÑÑÐžÑÐžÐºÐ°ÑÐ°:
+itm_cert_subject = Ð¢ÐµÐŒÐ°:
+itm_cert_issuer = ÐÐŒÐžÑÐµÐœÑ:
+itm_cert_nbefore = ÐÐµ, Ð¿ÑÐµÐŽÐž ÐŽÐ°:
+itm_cert_nafter = ÐÐµ ÑÐ»ÐµÐŽ:
+itm_cert_serial = Ð¡ÐµÑÐžÐµÐœ:
+itm_cert_fprint = %1$s ÐÑÐ¿ÐµÑÐ°ÑÑÐº:
+itm_cert_C = ÐÑÑÐ¶Ð°Ð²Ð°:
+itm_cert_CN = ÐÐ±ÑÐŸÐ¿ÑÐžÐµÑÐŸ ÐœÐ°ÐžÐŒÐµÐœÐŸÐ²Ð°ÐœÐžÐµ:
+itm_cert_L = ÐÐµÑÑÐœÐŸÑÑ:
+itm_cert_ST = Ð©Ð°Ñ ÐžÐ»Ðž Ð¿ÑÐŸÐ²ÐžÐœÑÐžÑ:
+itm_cert_O = ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÑ:
+itm_cert_OU = ÐÑÐ³Ð°ÐœÐžÐ·Ð°ÑÐžÐŸÐœÐœÐŸ Ð·Ð²ÐµÐœÐŸ:
+itm_reasons = ÐÑÐžÑÐžÐœÐ°(Ðž):
+itm_reason_cnmatch = Ð¡ÐµÑÑÐžÑÐžÐºÐ°ÑÑÑ ÐŸÐ±ÑÐŸÑÐŸ ÐžÐŒÐµ ÐœÐµ ÑÑÐ²Ð¿Ð°ÐŽÐ° Ñ ÐžÐŒÐµÑÐŸ ÐœÐ° Ñ
+ÐŸÑÑÐ° (%1$s).
+itm_reason_itrust = Ð¡ÐµÑÑÐžÑÐžÐºÐ°Ñ ÐžÐ·ÐŽÐ°ÑÐµÐ»ÑÑ ÐœÐµ Ðµ ÐœÐ°ÐŽÐµÐ¶ÐŽÐµÐœ.
+itm_reason_expired = Ð¡ÐµÑÑÐžÑÐžÐºÐ°ÑÑÑ Ðµ Ñ ÐžÐ·ÑÐµÐºÑÐ» ÑÑÐŸÐº.
+itm_reason_notyet = Ð¡ÐµÑÑÐžÑÐžÐºÐ°ÑÑÑ Ð²ÑÐµ ÐŸÑÐµ ÐœÐµ Ðµ Ð²Ð°Ð»ÐžÐŽÐµÐœ.
+itm_fail_verify = Ð¡ÐµÑÑÐžÑÐžÐºÐ°ÑÑÑ, Ð¿ÑÐµÐŽÑÑÐ°Ð²ÐµÐœ ÐŸÑ ÑÑÑÐ²ÑÑÐ° ÐœÐµ ÐŒÐŸÐ¶Ðµ ÐŽÐ° Ð±ÑÐŽÐµ Ð¿ÑÐŸÐ²ÐµÑÐµÐœ.
+itm_accept_prompt = ÐÑÐºÐ°ÑÐµ Ð»Ðž ÐŽÐ° Ð¿ÑÐžÐµÐŒÐµÑÐµ ÑÐŸÐ·Ðž ÑÐµÑÑÐžÑÐžÐºÐ°Ñ?
+itm_accept_always = ÐÐžÐœÐ°Ð³Ðž
+itm_accept_now = Ð¡Ð°ÐŒÐŸ Ð·Ð° ÑÐ°Ð·Ðž ÑÐµÑÐžÑ
+itm_accept_no = ÐÐµ
+itm_new_tstore = ÐÐŸÐ²Ð° TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <bulgarian.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'ÐÑÑÐ·ÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ',
+		  'link_comment' => 'ÐÐ°ÑÐµÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²Ðµ Ð»ÐµÑÐœÐŸ Ðž Ð±ÑÑÐ·ÐŸ',
+		  'perm_denied' => 'ÐÑÐŒÐ°ÑÐµ Ð¿ÑÐ°Ð²Ð° Ð·Ð° ÑÐ°Ð·Ðž ÐŸÐ¿ÐµÑÐ°ÑÐžÑ.<BR><BR>ÐÑÐŸÐ²ÐµÑÐµÑÐµ ÐŽÐ°Ð»Ðž ÑÑÐµ Ð²Ð»ÐµÐ·Ð»Ðž, Ð°ÐºÐŸ ÐœÐµ ÐœÐ°ÑÐžÑÐœÐµÑÐµ:<a href="$1">ÐÑ
+ÐŸÐŽ</a> first',
+		  'select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ ÐºÑÐŽÐµÑÐŸ ÐžÐ·ÐºÐ°ÑÐµ ÐŽÐ° ÐºÐ°ÑÐžÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²ÐµÑÐµ',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²Ðž Ð°Ð»Ð±ÑÐŒÐ°',
+		  'button_create_album' => 'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ',
+		  'success' => 'ÐÐ¿ÐµÑÐ°ÑÐžÑÑÐ° ÑÑÐ¿ÐµÑÐœÐ° !',
+		  'error_select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ',
+		  'error_album_name' => 'ÐÐŸÐ»Ñ ÐŽÐ°Ð¹ÑÐµ ÐžÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°.',
+		  'error_album_already_exists' => 'ÐÐµÑÐµ ÐžÐŒÐ° Ð°Ð»Ð±ÑÐŒ Ñ ÑÐŸÐ²Ð° ÐžÐŒÐµ.<BR><BR>ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <I>Back</I> Ð±ÑÑÐŸÐœ Ð² Ð±ÑÐ°ÑÐ·Ð°ÑÐ°, ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ ÐŽÑÑÐ³ÐŸ ÐžÐŒÐµ Ð·Ð° Ð°Ð»Ð±ÑÐŒÐ° Ð²Ðž.',
+		  'album_name' => 'ÐÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'album_presentation' => 'ÐÐžÐµ ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ. Ð¡ÐœÐžÐŒÐºÐžÑÐµ ÐºÐŸÐžÑÐŸ ÑÑÐµ ÐžÐ·Ð¿ÑÐ°ÑÐžÐ»Ðž ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ° ÑÐµ ÑÐµ ÑÑÑ
+ÑÐ°ÐœÑÐ²Ð°Ñ Ð² ÑÐŸÐ·Ðž Ð°Ð»Ð±ÑÐŒ. <BR>ÐÐºÐŸ ÐœÑÐŒÐ°ÑÐµ ÐœÐžÐºÐ°ÐºÐ²Ðž Ð°Ð»Ð±ÑÐŒÐž, Ð»ÐžÑÑÐ° Ñ Ð°Ð»Ð±ÑÐŒÐž Ð²Ðž Ðµ Ð¿ÑÐ°Ð·ÐµÐœ. ÐÐ·Ð¿ÐŸÐ»Ð·Ð²Ð°Ð¹ÑÐµ \'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ\' Ð±ÑÑÐŸÐœÐ° Ð·Ð° ÐŽÐ° ÑÑÐ·ÐŽÐ°ÐŽÐµÑÐµ Ð²Ð°ÑÐžÑÑ Ð¿ÑÑÐ²Ðž Ð°Ð»Ð±ÑÐŒ.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐµÑÐµ ÑÐœÐžÐŒÐºÐž Ð² ÐžÐ·Ð±ÑÐ°ÐœÐžÑ Ð°Ð»Ð±ÑÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÐœÐžÑ ÑÐ°Ð·ÐŒÐµÑ ÐœÐ° ÑÐœÐžÐŒÐºÐžÑÐµ Ðµ $1 KB',
+		  'upload_presentation' => 'ÐÐºÐŸ ÐœÐµ Ð²Ðž ÑÐµ Ð¿ÐŸÑÐ²ÑÐ²Ð° Ð°Ð¿Ð»ÐµÑÐ° Ð·Ð° ÐºÐ°ÑÐ²Ð°ÐœÐµ ÐžÐ»Ðž ÐžÐŒÐ° ÐœÑÐºÐ°ÐºÐ²Ðž Ð³ÑÐµÑÐºÐž Ð² ÑÑÑÐ°ÐœÐžÑÐ°ÑÐ° Ðµ ÐŽÐŸÐ±ÑÐ° ÐžÐŽÐµÑ ÐŽÐ° Ð¿ÑÐŸÐ²ÐµÑÐžÑÐµ ÐŽÐ°Ð»Ðž ÐžÐŒÐ°ÑÐµ ÐžÐœÑÑÐ°Ð»ÐžÑÐ°Ðœ java runtime plugin.<BR>ÐÐ°ÑÐ²Ð°ÐœÐµÑÑÐŸ Ðµ Ð»ÐµÑÐœÐŸ! ÐÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Browse</B> ÐžÐ·Ð±ÐµÑÐµÑÐµ ÑÐ°Ð¹Ð» ÐžÐ»Ðž ÐžÐ·ÐŽÑÑÐ¿Ð°Ð¹ÑÐµ ÑÐ°Ð¹Ð»Ð° ÐŸÑ ÐµÐºÑÐ¿Ð»ÐŸÑÐµÑÐ°, ÑÐ»ÐµÐŽ ÑÐŸÐ²Ð° ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Upload</B> ÐŽÐ° ÐžÐ·Ð¿ÑÐ°ÑÐžÑÐµ ÑÐœÐžÐŒÐºÐ°ÑÐ° ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ°.'
+		. "<BR>ÐÐ° ÐŽÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ  <U>ÐŽÑÑÐ³ÐžÑ Ð²Ð°ÑÐžÐ°ÐœÑ</U>, <a href='upload.php'>ÐºÐ»ÐžÐºÐœÐµÑÐµ ÑÑÐº</a>.",
+		  'album' => 'ÐÐ»Ð±ÑÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'ÐÐ°ÑÐžÑ Ð±ÑÐ°ÑÐ·ÐµÑ ÐœÐµ Ð¿ÐŸÐŽÑÑÐ¶Ð° Java. ÐÐ° ÐŽÐ° ÑÐ°Ð±ÐŸÑÐž Ð°Ð¿Ð»ÐµÑÐ° Ð²Ðž ÑÑÑÐ±Ð²Ð° Java. ÐÐŸÐ²ÐµÑÐµ Ð»ÐµÑÐœÐŸ ÐŽÐ° Ñ ÑÐ²Ð°Ð»ÐžÑÐµ ÐŸÑ: <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'ÐÐ»ÐžÐºÐœÐµÑÐµ ÐœÐ° ÑÐŸÐ·Ðž Ð»ÐžÐœÐº, Ðž Ð²ÑÐ²ÐµÐŽÐµÑÐµ ÐŽÐ°ÐœÐœÐž Ð² Ð¿ÐŸÐ»ÐµÑÐ°ÑÐ° Ð¿ÐŸ-ÐŽÐŸÐ»Ñ, Ð°ÐºÐŸ ÐžÑÐºÐ°ÑÐµ ÑÐµ ÐŽÐ° ÑÐµ Ð¿ÑÐžÐ»Ð°Ð³Ð°Ñ ÐºÑÐŒ Ð²ÑÐžÑÐºÐž ÑÐœÐžÐŒÐºÐž Ð² ÑÐ»ÐµÐŽÐ²Ð°ÑÐŸÑÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ.',
+		  'quota_used' => 'Ð ÐŒÐŸÐŒÐµÐœÑÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ $1 MB ($2%) ÐŸÑ  $3 MB ÐŽÐžÑÐºÐŸÐ²ÐŸ Ð¿ÑÐŸÑÑÑÐ°ÐœÑÑÐ²ÐŸ.',
+		  'quota_about_full' => 'ÐžÐ·ÑÑÐžÐ¹ÑÐµ ÐœÑÐºÐŸÑ ÑÐœÐžÐŒÐºÐ°, ÐžÐ»Ðž Ð¿ÐžÑÐµÑÐµ ÐœÐ° Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÐŽÐ° Ð²Ðž Ð²ÐŽÐžÐ³ÐœÐµ ÐºÐ²ÐŸÑÐ°ÑÐ°.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÐÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐŸÐŽÐŸÐ±ÑÐž ÐºÐ°ÑÐµÐœÐžÑÐµ ÑÐœÐžÐŒÐºÐž, Ð¿ÑÐµÐŽÐž ÐŽÐ° Ð³Ðž Ð²ÐžÐŽÐžÑÐµ Ð² Ð³Ð°Ð»ÐµÑÐžÑÑÐ°.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sv.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sv.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_sv.properties.apt	(revision 3951)
@@ -0,0 +1,252 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Swedish)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Swedish
+contributor = Erik Lindahl erik@fisensmosse.se
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = swedish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = BlÃ€ddra ...
+buttonRemoveSelected = Ta bort markerad
+buttonRemoveAll = Ta bort alla
+buttonRotateLeft = Rotera vÃ€nster
+buttonRotateRight = Rotera hÃ¶ger
+buttonUpload = Ladda upp
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. och %3$d sek.
+timefmt_ms = %1$d min. och %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = okÃ€nd
+status_msg = %1$d%% klart, Ã¶verfÃ¶ringshastighet: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = '%1$s' Ã€r fÃ¶r stor (%2$s)
+
+#FileUploadThread
+preparingFile = FÃ¶rbreder fil %1$d/%2$d
+infoUploading = Laddar upp filer %1$s
+infoUploaded = %1$s fil(er) uppladdade. VÃ€ntar pÃ¥ att server ska svara...
+infoAborted = AvbrÃ¶ts efter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) uppladdade
+errDuringUpload = Stannade med fel.
+errHttpResponse = Uppladdningen misslyckades: ovÃ€ntade HTTP respons
+questionSendMailOnError = Ett fel uppstod. Vill du sÃ€nda ett mail med felet till ansvarig?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Namn
+colSize = Storlek
+colDirectory = Mapp
+colModified = Senast Ã€ndrad
+colReadable = LÃ€sbar?
+errForbiddenExtension = Ogiltig filÃ€ndelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ett fel uppstod med logghanteringen.
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = VÃ€lj ett album fÃ¶rst.
+coppermineUploadOk = Bilden har blivit Ã¶verfÃ¶rd och sparad i \n\nKlicka pÃ¥ OK fÃ¶r att namnge och kommentera bilderna.\n\nGlÃ¶m inte att verkstÃ€lla namnÃ€ndringar fÃ¶r att de ska sparas pÃ¥ servern.
+
+#PictureFileData
+tooBigPicture = Bilden '%1$s' Ã€r fÃ¶r stor. Den kommer laddas upp ofÃ¶rÃ€ndrad (rotation, storlek...).
+notAPicture = Filen '%1$s' Ã€r ingen bild. Den kommer inte att laddas upp.
+
+#PictureDialog
+buttonClose = StÃ€ng
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = GodkÃ€nn
+
+#InteractiveTrustManager
+itm_title_pass = Ange %1$s lÃ¶senord
+itm_prompt_pass = %1$s lÃ¶senord:
+itm_cert_alert = SSL Certifikat varning
+itm_cert_details = Certifikat detaljer:
+itm_cert_subject = Ãmne:
+itm_cert_issuer = UtfÃ€rdat av:
+itm_cert_nbefore = Inte fÃ¶re:
+itm_cert_nafter = Inte efter:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s fingeravtryck:
+itm_cert_C = Land:
+itm_cert_CN = Gemensamt namn:
+itm_cert_L = Plats:
+itm_cert_ST = Region:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations nummer:
+itm_reasons = SkÃ€l:
+itm_reason_cnmatch = Certifikatet matchar inte servern (%1$s).
+itm_reason_itrust = Certifikat utfÃ€rdaren Ã€r inte trovÃ€rdig.
+itm_reason_expired = Certifikatet har gÃ¥tt ut.
+itm_reason_notyet = Certifikatet Ã€r inte giltigt.
+itm_fail_verify = Certifikatet frÃ¥n servern kunde inte verifieras.
+itm_accept_prompt = Vill du acceptera certifikatet?
+itm_accept_always = Alltid
+itm_accept_now = Bara fÃ¶r den hÃ€r sessionen
+itm_accept_no = Nej
+itm_new_tstore = Ny TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <swedish.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ Maintainer: Erik Lindahl erik@fisensmosse.se
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Ladda upp bilder till galleriet med hjÃ€lp av appleten',
+		  'perm_denied' => 'Du har inte behÃ¶righet att utfÃ¶ra Ã¥tgÃ€rden<BR><BR>Om du inte Ã€r ansluten, <a href="$1">logga in</a> fÃ¶rst',
+		  'select_album' => 'VÃ€lj ett album dÃ€r du vill spara bilderna',
+		  'button_update_album' => 'Uppdatera album',
+		  'button_create_album' => 'Skapa album',
+		  'success' => 'UtfÃ¶rt!',
+		  'error_select_album' => 'VÃ€lj ett album fÃ¶rst',
+		  'error_album_name' => 'Namnge album',
+		  'error_album_already_exists' => 'Du har redan ett album med de namnet.<BR><BR>Klicka pÃ¥ <I>bÃ¥kÃ¥t</I> knappen i webblÃ€saren, fÃ¶r att vÃ€lja ett annat namn.',
+		  'album_name' => 'Album namn',
+		  'album_presentation' => 'Du mÃ¥ste vÃ€lja ett album hÃ€r. Bilderna du laddar upp kommer sparas dÃ€r.<BR>Om du inte har ett album Ã€r listan tom. AnvÃ€nd \'Skapa\' kanppen fÃ¶r att gÃ¶ra ett.',
+		  'album_description' => 'Album fÃ¶rklaring',
+		  'add_pictures' => 'LÃ€gg till bilder i valt album',
+		  'max_upload_size' => 'StÃ¶rsta godkÃ€nda storleken Ã€r $1 KB',
+		  'upload_presentation' => 'Om rutan nedanfÃ¶r inte visar appleten och webblÃ€saren visar att det finns fel mÃ¥ste du installera en Java plugin<BR><BR> FÃ¶r att anvÃ€nda den <U>gamla sidan</U>, <a href="upload.php">tryck hÃ€r</a>.',
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din webblÃ€sare saknar Java, gÃ¥r att ladda ner frÃ¥n <a href="http:\\java.sun.com\jre\">http:\\java.sun.com\jre</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicka pÃ¥ lÃ€nken och fyll i fÃ€lten nedanfÃ¶r. Om du vill att de ska gÃ€lla fÃ¶r alla filer nÃ€sta uppladdning.',
+		  'quota_used' => 'Du anvÃ€nder fÃ¶rnÃ€rvarande $1 MB ($2%) av $3 MB.',
+		  'quota_about_full' => 'Du mÃ¥ste frigÃ¶ra minne, din kvot Ã€r fylld.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ja.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ja.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_ja.properties.apt	(revision 3951)
@@ -0,0 +1,257 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Japanese)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Japanese
+contributor = Takashi Yukawa: takashi_922 at yahoo dot co dot jp
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = japanese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = ãã¡ã€ã«ãéã..
+buttonRemoveSelected = éžæãããã¡ã€ã«ãåé€
+buttonRemoveAll = ãã¹ãŠåé€
+buttonRotateLeft = å·Šãžåè»¢
+buttonRotateRight = å³ãžåè»¢
+buttonUpload = ã¢ããã­ãŒã
+buttonStop = åæ­¢
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d ã®æºåäž­
+infoUploading = %1$s ãã¢ããã­ãŒãäž­
+infoUploaded = %1$s ã®ã¢ããã­ãŒããçµäºããŸããããµãŒãããã®å¿ç­ããåŸ
+ã¡ãã ããã
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d ã®ã¢ããã­ãŒãçµäº
+errDuringUpload = ã¢ããã­ãŒãããšã©ãŒã§åæ­¢ããŸããã
+errHttpResponse = ã¢ããã­ãŒãå€±æ: äžæ­£ãª HTTP ã¬ã¹ãã³ã¹
+questionSendMailOnError = ã¢ããã­ãŒãäž­ã«ãšã©ãŒãçºçããŸããããšã©ãŒæ
+å ±ãWEBç®¡çè
+ãžéä¿¡ããŸãã?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = åå
+colSize = ãµã€ãº
+colDirectory = ãã¡ã€ã«ã®å Žæ
+colModified = æŽæ°æ¥æ
+colReadable = èª­èŸŒå¯?
+errForbiddenExtension = äœ¿çšãèš±å¯ãããŠããªããã¡ã€ã«æ¡åŒµå­ã§ãã
+
+#DefaultUploadPolicy
+errDuringLogManagement = ã­ã°ç®¡çäž­ã«ãšã©ãŒãçºçããŸããã
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = æåã«ã¢ã«ãã ãéžæããŠãã ããã
+coppermineUploadOk = éžæããã¢ã«ãã ã«ãç»åãæ­£ããã¢ããã­ãŒããããŸããã\n\nOk ãã¯ãªãã¯ããŠç»åã«ååãã³ã¡ã³ããè¿œå ããŠãã ããã\n\n'Apply modification button' ãã¯ãªãã¯ããŠãµãŒãã®æ
+å ±ãå€æŽããŠãã ããã
+
+#PictureFileData
+tooBigPicture = '%1$s' ã®ãã¡ã€ã«ãµã€ãºãå€§ããããŸãããã¡ã€ã«ã¯å€æŽãããã«ã¢ããã­ãŒããããŸã (åè»¢, ãµã€ãºå€æŽãªã©ãªã)ã
+notAPicture = '%1$s' ã¯ç»åãã¡ã€ã«ã§ã¯ãããŸãããã¢ããã­ãŒããªã¹ãã«ã¯è¿œå ãããŸããã
+
+#PictureDialog
+buttonClose = éãã
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <japanese.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Source: $
+ $Revision: ?
+ $Author: etienne_sf $
+ $Date: $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'å®è¡æš©éããããŸããã<BR><BR>æåã«<a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ã­ã°ã€ã³</a>ããŠãã ããã',
+		  'select_album' => 'ç»åãä¿å­ããã¢ã«ãã ãéžæããŠãã ããã',
+		  'button_update_album' => 'ã¢ã«ãã æŽæ°',
+		  'button_create_album' => 'ã¢ã«ãã äœæ',
+		  'success' => 'åŠçæå !',
+		  'error_select_album' => 'æåã«ã¢ã«ãã ãéžæããŠãã ããã',
+		  'error_album_name' => 'ã¢ã«ãã ã®ååãå
+¥åããŠãã ããã',
+		  'error_album_already_exists' => 'åãååã®ã¢ã«ãã ããã§ã«å­åšããŠããŸãã<BR><BR>ãã©ãŠã¶ãŒã®<I>æ»ã</I>ãã¿ã³ãã¯ãªãã¯ããŠãéãååãå
+¥åããŠãã ããã',
+		  'album_name' => 'ã¢ã«ãã ã®åå',
+		  'album_presentation' => 'ã¢ã«ãã ãéžæããŠãã ãããã¢ããã­ãŒãããç»åã¯ãéžæããã¢ã«ãã ã«ä¿å­ãããŸãã<BR>ãªã¹ãã«ã¢ã«ãã ããªãå Žåã¯ãæåã« \'ã¢ã«ãã äœæ\' ãã¿ã³ãã¯ãªãã¯ããŠã¢ã«ãã ãäœæããŠãã ããã',
+		  'album_description' => 'ã¢ã«ãã ã®èª¬æ',
+		  'add_pictures' => 'éžæããã¢ã«ãã ã«ç»åãè¿œå ',
+		  'max_upload_size' => 'ç»åã®æå€§ãµã€ãºã¯ $1 KB ã§ã',
+		  'upload_presentation' => 'äžã«ã¢ãã¬ãããè¡šç€ºãããã«ãšã©ãŒãè¡šç€ºãããå Žåã¯ãJavaãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŠãã ããã<BR>ã€ã³ã¹ããŒã«ããåŸã«ã¯ã <B>ãã¡ã€ã«ãéã</B> ãã¿ã³ãã¯ãªãã¯ããŠãã¡ã€ã«ãéžæãããããšã¯ã¹ãã­ãŒã©ãããã©ãã°ïŒãã­ããããŠã<B>ã¢ããã­ãŒã</B> ãã¿ã³ãã¯ãªãã¯ããããšã§ãµãŒãã«ãã¡ã€ã«ãã¢ããã­ãŒãã§ããŸãã'
+		  	. "<BR><U>old upload page</U>ãäœ¿çšããã«ã¯<a href='upload.php'>ãã</a>ãã¯ãªãã¯ããŠãã ããã",
+		  'album' => 'ã¢ã«ãã ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh_TW.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh_TW.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_zh_TW.properties.apt	(revision 3951)
@@ -0,0 +1,277 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Chinese simplified)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = çèŠœ ...
+buttonRemoveSelected = ç§»é€éžæçæªæ¡
+buttonRemoveAll = ç§»é€æææªæ¡
+buttonRotateLeft = éæéæèœ
+buttonRotateRight = é æéæèœ
+buttonUpload = äžå³
+buttonStop = äž­æ­¢äžå³
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$då°æ%2$då%3$dç§
+timefmt_ms = %1$då%2$dç§
+timefmt_s = %1$dç§
+timefmt_unknown = æªç¥
+status_msg = JUploadå·²å®æ%1$d%%, å³èŒžéç: %2$s, é äŒ°æé: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = æªæ¡å€§å° '%1$s' å·²è¶
+åºäžéïŒ(%2$s)
+
+#FileUploadThread
+preparingFile = æªæ¡%1$d/%2$dæºåäž­...
+infoUploading = æ­£åšäžå³%1$s
+infoUploaded = %1$sæªæ¡å·²äžå³ïŒç­åŸ
+äŒºæåšåæäž­âŠ
+infoAborted = äžå³äž­æ·ïŒå·²å³é%1$dæªæ¡
+nbUploadedFiles = %1$dæªæ¡å·²äžå³
+errDuringUpload = å³èŒžé¯èª€ïŒäžå³å·²äž­æ­¢
+errHttpResponse = äžå³å€±æïŒé¯èª€çHTTPåæ
+questionSendMailOnError = äžå³æçŒçé¯èª€ãæ¯åŠå³éçžéè³èšçµŠç¶²ç«ç®¡çå¡ïŒ
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = åçš±
+colSize = å€§å°
+colDirectory = ç®é
+colModified = ä¿®æ¹æ¥æ
+colReadable = è®åæ¬é
+errForbiddenExtension = äžå
+èš±çå¯æªå
+
+#DefaultUploadPolicy
+errDuringLogManagement = èšéæªç®¡ççŒçé¯èª€
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = è«å
+éžæçžç°¿
+coppermineUploadOk = æªæ¡å·²æ­£ç¢ºäžå³ïŒè«æç¢ºå®éµç¹Œçºç·šèŒ¯æªæ¡å
+§å®¹\n\nè«æ³šæïŒä¿®æ¹åŸè«æäžãå¥çšä¿®æ¹ãéµä»¥æŽæ°è³æïŒ
+
+#PictureFileData
+tooBigPicture = åæª'%1$s'å€§å°è¶
+éäžéïŒäžå³ç¡æ³å¥çšä»»äœä¿®æ¹
+notAPicture = æªæ¡'%1$s'äžæ¯åæªïŒäžåå
+¥äžå³æž
+å®
+
+#PictureDialog
+buttonClose = éé
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = ç¢ºèª
+
+#InteractiveTrustManager
+itm_title_pass = èŒžå
+¥%1$så¯ç¢Œ
+itm_prompt_pass = %1$så¯ç¢Œ:
+itm_cert_alert = SSL æè­è­Šå
+itm_cert_details = æè­å
+§å®¹ïŒ
+itm_cert_subject = æšé¡ïŒ
+itm_cert_issuer = çŒè¡è
+ïŒ
+itm_cert_nbefore = çŒè¡æ¥ïŒ
+itm_cert_nafter = å°ææ¥ïŒ
+itm_cert_serial = åºèïŒ
+itm_cert_fprint = %1$sæè­ç°œç« ïŒ
+itm_cert_C = åå¥ïŒ
+itm_cert_CN = äžè¬åçš±ïŒ
+itm_cert_L = å
+¬åžåçš±
+itm_cert_ST = å·/çïŒ
+itm_cert_O = çµç¹åçš±ïŒ
+itm_cert_OU = çµç¹å®äœïŒ
+itm_reasons = çç±
+itm_reason_cnmatch = æè­äžè¬åçš±èäž»æ©åçš±äžç¬Š(%1$s).
+itm_reason_itrust = æè­çŒè¡è
+äžåä¿¡ä»»
+itm_reason_expired = æè­å·²éæ
+itm_reason_notyet = æè­å°æªçŒè¡
+itm_fail_verify = ç¡æ³é©è­äŒºæåšæäŸçæè­
+itm_accept_prompt = æ¯åŠæ¥åæ­€æè­ïŒ
+itm_accept_always = æ°žé æ¥å
+itm_accept_now = æ¬æ¬¡æ¥å
+itm_accept_no = æçµ
+itm_new_tstore = æ°çä¿¡è³Žé»å­ååº
+itm_tstore = ä¿¡è³Žé»å­ååº
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <chinese_gb.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_he.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_he.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_apt/lang_he.properties.apt	(revision 3951)
@@ -0,0 +1,260 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (Hebrew)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hebrew
+contributor = liorda@gmail.com
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hebrew
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = ×¢×××...
+buttonRemoveSelected = ××¡×š ×€×š×××× ××¡××× ××
+buttonRemoveAll = ××¡×š ×××
+buttonRotateLeft = ×¡××× ×©××××
+buttonRotateRight = ×¡××× ×××× ×
+buttonUpload = ××¢××
+buttonStop = ×¢×Š××š
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = ×'×××××× ××©× ×××
+speedunit_mb_per_second = ×××××× ××©× ×××
+speedunit_kb_per_second = ×§×××××× ××©× ×××
+speedunit_b_per_second = ××× ××©× ×××
+timefmt_hms = %1$d×©, %2$d ××§××ª ×-  %3$d ×©× ×××ª
+timefmt_ms = %1$d ××§××ª -×  %2$d ×©× ×××ª
+timefmt_s = %1$d ×©× ×××ª
+timefmt_unknown = ×× ××××¢
+status_msg = JUpload %1$d%% ×××©×××, ×§×Š× ××¢××š×: %2$s, × ××ª×š: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = ×××× ××§×××¥ '%1$s' ×××× ××× (%2$s)
+
+#FileUploadThread
+preparingFile = ×××× ×§×××¥ %1$d/%2$d
+infoUploading = ××¢×× ×§××Š×× %1$s
+infoUploaded = %1$s ×§××Š×× ×××¢××. ×××ª×× ××ª××××ª ××©×š×ª...
+infoAborted = ××¢××× ×××€×¡×§× ××××š %1$d ×§××Š××.
+nbUploadedFiles = %1$d ×§××Š×× ×××¢××
+errDuringUpload = ××¢××× ×××€×¡×§× ×¢× ×©×××××ª
+errHttpResponse = ××¢××× × ××©××: ×ª××××ª HTTP ××-×Š×€×××
+questionSendMailOnError = ××ª×š××©× ×©×××× ×××× ×××¢×××. ××× ×ª×š×Š× ××©××× ××ª ×× ×××××¢ ××š×××× ×× ××× ×× ×××ª×š?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = ×©×
+colSize = ××××
+colDirectory = ×¡×€×š××
+colModified = ×ª××š×× ×©×× ××
+colReadable = × ××ª× ××§×š×××?
+errForbiddenExtension = ×¡××××ª ××§×××¥ ××¡××š×.
+
+#DefaultUploadPolicy
+errDuringLogManagement = ××ª×š××©× ×©×××× ×××× × ×××× ×××××
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = ×× ×, ×××š ××××× ×ª××××.
+coppermineUploadOk = ××ª××× ××ª ×××¢×× ××©×š×ª ×××Š×××, ×××××× ×× ×××š.\n\n×××¥ ×¢× OK ×× ××š×Š×× × ××©××× ×©×××ª ×××¢×š××ª ××ª××× ××ª ×××.\n\n×× ×ª×©×× ×××××¥ ×¢× ××€×ª××š '××× ×©×× ××××' ××× ××©×××š ××ª ××× ××©×× ×××× ××©×š×ª!
+
+#PictureFileData
+tooBigPicture = ××ª××× × '%1$s' ××××× ×××. ××× ×ª××¢×× ××× ×× ×©×× ×× (×¡××××, ×©×× ×× ××××...).
+notAPicture = ××§×××¥ '%1$s' ××× × ×ª××× ×. ××× ×× ××ª×××¡×£ ××š×©×××ª ××§××Š×× ××©××××.
+
+#PictureDialog
+buttonClose = ×¡×××š
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = ×××
+unitGigabytes = ×'××××××
+unitMegabytes = ××××××
+unitKilobytes = ×§××××××
+
+#sendDebugInformation
+Confirm = ×××©××š
+
+#InteractiveTrustManager
+itm_title_pass = ××× ×¡ ×¡××¡×× ×¢×××š %1$s
+itm_prompt_pass = ×¡××¡×× ×¢×××š %1$s:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = ××× ××š×Š×× × ××§×× ×ª×¢××× ××?
+itm_accept_always = ×ª×××
+itm_accept_now = ×š×§ ×¢×××š ××€×¢××× ×× ×××××ª
+itm_accept_no = ××
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
+
+
+--------------
+
+
+Translation for the CopperminePlugin part
+
+   Content of the <hebrew.php> file.
+
+--------------
+
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => '××¢×××ª ×§××Š×× ××××š××× ××¢××š×ª ××©××××',
+		  'perm_denied' => '××× ×× ××š×©×× ××××Š××¢ ×€×¢××× ××.<BR /><BR />×× ××× × ×××××š, × ×¡× <a href="$1">×××ª×××š</a> ×ª××××.',
+		  'select_album' => '×× × ×××š ××××× ××××¡×× ××ª××× ××ª.',
+		  'button_update_album' => '×¢××× ×××××',
+		  'button_create_album' => '××Š××š×ª ××××× ×××©',
+		  'success' => '×€×¢××× ××Š××××!',
+		  'error_select_album' => '×× × ×××š ××××× ×ª××××',
+		  'error_album_name' => '×× × ×ª× ×××××× ×©×.',
+		  'error_album_already_exists' => '×××š ×§××× ××××× ×¢× ×©× ××.<BR /><BR />×× × ×××¥ ×¢× <I>××××š×</I> ×××€××€× ××××š ×©× ×××š ×××××× ××.',
+		  'album_name' => '×©× ××××××',
+		  'album_presentation' => '××ª× ××××š× ×××××š ×××××. ××ª××× ××ª ×©×ª×©×× ××©×š×ª ×××××¡× × ×××××× ××.<BR />×× ×× ×§××××× ×××××××, ××š×©××× ×ª××× ×š××§×. ×××¥ ×¢× \'××Š××š×ª ××××× ×××©\' ×ª××××.',
+		  'album_description' => '×ª××××š ××××××',
+		  'add_pictures' => '×××¡×£ ×ª××× ××ª ×××××× ×× ×××š',
+		  'max_upload_size' => '××××× ×××§×¡×××× ××ª××× × ××× × $1 KB',
+		  'upload_presentation' => '×× ××š××××¢ ×××× ××× × ××Š×× ××ª ×××©××××, ××××€××€× ×××××¢ ×¢× ×©×××××ª ××¢××× ××, ×× ×š×× ×©× ××š×©×ª ××ª×§× × ×©× java runtime plugin.<BR />××××š ×××, ××¢×××ª ××ª××× ××ª ×××© ×€×©×××! ×××¥ ×¢× <B>×¢×××</B> ××××š ××ª ××§××Š×× ××š×Š×××× ×× ××š××š ×××ª× ×× ×××©×××× ××× ×××× ×××š. ××××Š× ×¢× <B></B> ×ª×©×× ×××ª× ×× ××©×š×ª.'
+		. "<BR />×× ××š×Š×× × ×××©×ª××© ×<U>×××©×§ ×××¢××× ×××©×</U>, <a href='upload.php'>×××¥ ×××</a>.",
+		  'album' => '×××××',
+		  //Since 2.1.0
+		  'java_not_enabled' => '×××€××€× ×©×× ××× × ×××€×©×š java. ××©×××× ×××¢××× ××××× ×©××××© ×- java. × ××ª× ××€×ª××š ×××ª ××§×××ª ×¢× ××× ××ª×§× × ×-  <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => '×××¥ ×¢× ×§××©××š ×× ×××× ××ª ××©×××ª ×××× ×× ××š×Š×× × ××××× ×©×× ×××× ××× ×¢× ××€×¢× ×××× ×× ×ª×¢×× ×§××Š××',
+		  'quota_used' => '××ª× ×× ×Š× ××¢×ª $1 MB ($2%) ××ª×× $3 MB ×©×××§×Š× ×× ××××¡××.',
+		  'quota_about_full' => '×××§ ×ª××× ××ª ×× ××§×© ××× ×× ×××ª×š ×××§×Š××ª ×× ×××ª×š ××§×× ×××¡××.',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+
+
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/turkish.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/turkish.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/turkish.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Bu iÅlemi yapmaya yetkili deÄilsiniz.<BR><BR>EÄer baÄlÄ± deÄilseniz lÃŒtfen Ã¶nce <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">giriÅ yapÄ±n</a>',
+		  'select_album' => 'LÃŒtfen resimleri gÃ¶ndereceÄiniz albÃŒmÃŒ seÃ§iniz. ',
+		  'button_update_album' => 'AlbÃŒmÃŒ gÃŒncelle',
+		  'button_create_album' => 'AlbÃŒm Yarat',
+		  'success' => 'Ä°Ålem BaÅarÄ±lÄ± !',
+		  'error_select_album' => 'LÃŒtfen Ã¶nce albÃŒm seÃ§iniz',
+		  'error_album_name' => 'LÃŒtfen AlbÃŒm adÄ±nÄ± girin.',
+		  'error_album_already_exists' => 'Bu isimde bir albÃŒm zaten var<BR><BR>AlbÃŒmÃŒnÃŒze baÅka bir isim vermek iÃ§in lÃŒtfen tarayÄ±cÄ±nÄ±zdaki <I>Geri</I> dÃŒÄmesine basÄ±nÄ±z.',
+		  'album_name' => 'AlbÃŒm adÄ±',
+		  'album_presentation' => 'Burada bir albÃŒm seÃ§melisiniz. GÃ¶ndereceÄiniz resimler sunucuda bu albÃŒm iÃ§erisine kaydedilecektir. <BR>EÄer bir albÃŒmÃŒnÃŒz yoksa albÃŒm listesi boÅ gÃ¶zÃŒkecektir. Ãnce \'Yarat\' dÃŒÄmesine basÄ±p ilk albÃŒmÃŒnÃŒzÃŒ yaratabilirsiniz.',
+		  'album_description' => 'AlbÃŒm tanÄ±mÄ±',
+		  'add_pictures' => 'SeÃ§ili albÃŒme resim ekle',
+		  'max_upload_size' => 'Maksimum resim boyutu: $1 Ko',
+		  'upload_presentation' => 'EÄer aÅaÄÄ±daki kare appleti gÃ¶stermiyor ve tarayÄ±cÄ±nÄ±z sayfada sÃŒrekli olarak hata mesajlarÄ± veriyorsa, java runtime plugin\'i yÃŒklemek gerekecektir..<BR>SonrasÄ±nda gÃ¶nderim gerÃ§ekten basit olacaktÄ±r! <B>GÃ¶zat</B> a basÄ±p dosyalarÄ± seÃ§in ya da dosyalarÄ± bilgisaranÄ±zdan sÃŒrÃŒkleyip bÄ±rakÄ±n. SonrasÄ±nda <B> GÃ¶nder </B> e basÄ±p resimleri sunucuya gÃ¶nderin.'
+		  	. "<BR><U>Eski gÃ¶nderim sayfasÄ±</U>nÄ± kullanmak iÃ§in, <a href='upload.php'>tÄ±klayÄ±nÄ±z</a>.",
+		  'album' => 'AlbÃŒm',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/norwegian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/norwegian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/norwegian.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+	      'link_title' => 'JUpload',
+	      'link_comment' => 'Last opp filer til galleriet, ved hjelp av en applet',    
+	      'perm_denied' => 'Du har ikke tillatelse til Ã¥ utfÃžre den opprasjonen.<BR><BR>Hvis du ikke er innlogget, vÃŠr vennlig og <a href="$1">logg inn</a> fÃžrst',
+	      'select_album' => 'Du mÃ¥ velge et album du Ãžnsker Ã¥ laste opp bilder til',
+	      'button_update_album' => 'Oppdater album',
+	      'button_create_album' => 'Lag album',
+	      'success' => 'Handling utfÃžrt !',
+	      'error_select_album' => 'Du mÃ¥ velge et album fÃžrst',
+	      'error_album_name' => 'Du mÃ¥ gi albumet et navn',
+	      'error_album_already_exists' => 'Det fines allerede et album med dette navnet.<BR><BR>VÃŠr vennlig Ã¥ klikke <I>Tilbake</I> knappen pÃ¥ nettleseren for Ã¥ skrive inn en nytt navn pÃ¥ ditt album.',
+	      'album_name' => 'Album navn',
+	      'album_presentation' => 'Du mÃ¥ velge et album her. Bildene du laster opp vil bli lagret I dette albumet. <BR>Hvis du ikke har et album, er albumlisten tom. Bruk "Lage" knappen til Ã¥ lage ditt fÃžrste album.',
+	      'album_description' => 'Album beskrivelse',
+	      'add_pictures' => 'Legg til bilder i valgte album',
+	      'max_upload_size' => 'Maksimum stÃžrrelse for et bilde er $1 kB',
+	      'upload_presentation' => 'Hvis rammen nedenfor ikke kan vises, og nettleseren indikerer at det er feil pÃ¥ siden, mÃ¥ du installere Java plugin.<BR>Etter dette er opplasting veldig enkelt! Klikk pÃ¥ <B>Bla gjennom</B> for Ã¥ velge filer eller bruk dra og slipp fra filutforskeren, velg sÃ¥ <B>Last opp</B> for Ã¥ sende bildene til nettsiden.'
+	    . "<BR>For Ã¥ bruke <U>den vanlige filopplastingen</U>, <a href='upload.php'>klikk her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din nettleser tillater ikke Java. Opplastingsprogrammet krever Java. Du kan enkelt laste det ned fra <a href="http:\\java.sun.com\jre\">Java nettsidene</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk pÃ¥ denne lenken og fyll inn informasjon i feltene nedenfor, dersom du Ãžnkser at denne skal legges til alle bildene i neste opplasting.',
+		  'quota_used' => 'Du bruker nÃ¥ $1 MB ($2%) av din $3 MB store lagringsplass.',
+		  'quota_about_full' => 'Fjern noen bilder, eller be administrator om Ã¥ gjÃžre kontoen din stÃžrre.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'  	
+		  )
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/english.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/english.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/english.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Upload files to the gallery, with the help of an applet',
+		  'perm_denied' => 'You don\'t have permission to perform this operation.<BR><BR>If you\'re not connected, please <a href="$1">login</a> first',
+		  'select_album' => 'Please, choose an album, where you want to upload pictures',
+		  'button_update_album' => 'Update album',
+		  'button_create_album' => 'Create album',
+		  'success' => 'Action success !',
+		  'error_select_album' => 'Please, choose an album first',
+		  'error_album_name' => 'Please give a name to the album.',
+		  'error_album_already_exists' => 'You already own an album with this name.<BR><BR>Please click on the <I>Back</I> button of your navigator, to type another title for your new album.',
+		  'album_name' => 'Album name',
+		  'album_presentation' => 'You must select an album here. The pictures you\'ll send to the server will be stored in this album. <BR>If you don\'t have any album, the album list is empty. Use the \'Create\' button to create your first album.',
+		  'album_description' => 'Album description',
+		  'add_pictures' => 'Add pictures to the selected album',
+		  'max_upload_size' => 'The maximum size for a picture is $1 KB',
+		  'upload_presentation' => 'If the square below definitely refuses to display the applet, and the navigator indicates that there are errors on this page, a good idea would be to install the java runtime plugin.<BR>After, upload is really simple! Click on <B>Browse</B> to select files or use drag\'n\'drop from the explorer, then click on <B>Upload</B> to send the pictures to the server.'
+		. "<BR>To use the <U>old upload page</U>, <a href='upload.php'>click here</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Click here, to see the URL of the uploaded pictures, contained on this page'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/czech.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/czech.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/czech.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'K provedenÃ­ tÃ©to operace nemÃ¡te dostateÄnÃ¡ oprÃ¡vnÄnÃ­.<BR><BR>Pokud nejste pÅipojen, <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">pÅihlaÅ¡te se</a> prosÃ­m',
+		  'select_album' => 'Vyberte prosÃ­m album, do kterÃ©ho si pÅejete pÅenÃ©st obrÃ¡zky',
+		  'button_update_album' => 'Aktualizovat album',
+		  'button_create_album' => 'VytvoÅit album',
+		  'success' => 'ÃspÄÅ¡nÄ provedeno !',
+		  'error_select_album' => 'Nejprve prosÃ­m vyberte album',
+		  'error_album_name' => 'Zadejte prosÃ­m nÃ¡zev alba.',
+		  'error_album_already_exists' => 'Album s tÃ­mto nÃ¡zvem jiÅŸ vlastnÃ­te.<BR><BR>KliknÄte prosÃ­m na tlaÄÃ­tko<I>ZpÄt</I> vaÅ¡eho prohlÃ­ÅŸeÄe, abyste mohli vyplnit jinÃœ nÃ¡zev vaÅ¡eho novÃ©ho alba.',
+		  'album_name' => 'NÃ¡zev alba',
+		  'album_presentation' => 'Zde musÃ­te vybrat album. ObrÃ¡zky, kterÃ© pÅenesete na server budou uloÅŸeny v tomto albu. <BR>Pokud nemÃ¡te ÅŸÃ¡dnÃ© album, je seznam alb prÃ¡zdnÃœ. PouÅŸijte tlaÄÃ­tko \'VytvoÅit album\' k vytvoÅenÃ­ vaÅ¡eho prvnÃ­ho alba.',
+		  'album_description' => 'Popis alba',
+		  'add_pictures' => 'VloÅŸit obrÃ¡zky do vybranÃ©ho alba',
+		  'max_upload_size' => 'MaximÃ¡lnÃ­ velikost obrÃ¡zku je $1 Ko',
+		  'upload_presentation' => 'Pokud prohlÃ­ÅŸeÄ odmÃ­tÃ¡ zobrazit applet a hlÃ¡sÃ­ na tÃ©to strÃ¡nce chyby, je vhodnÃ© nainstalovat rozÅ¡Ã­ÅenÃ­ java runtime.<BR>PotÃ© je jiÅŸ pÅenos souborÅ¯ opravdu jednoduchÃœ! KlikÅete <B>ProchÃ¡zet</B> pro vÃœbÄr souborÅ¯ nebo pouÅŸijte pÅetaÅŸenÃ­ souborÅ¯ (drag\'n\'drop) z PrÅ¯zkumnÃ­ka, potÃ© kliknÄte <B>PÅenÃ©st</B> k odeslÃ¡nÃ­ obrÃ¡zkÅ¯ na server.'
+		  	. "<BR>Pro pouÅŸitÃ­ <U>pÅ¯vodnÃ­ strÃ¡nky pro pÅenos souborÅ¯</U>, <a href='upload.php'>kliknÄte zde</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+		
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/brazilian_portuguese.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/brazilian_portuguese.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/brazilian_portuguese.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovenian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovenian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovenian.php	(revision 3951)
@@ -0,0 +1,67 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'NimaÅ¡ pooblastil za izvedbo tega opravila.<BR><BR>Äe ni povezave, se najprej <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">prijavi</a>',
+		  'select_album' => 'Prosim, izberi album, v katerega ÅŸeliÅ¡ naloÅŸiti slike',
+		  'button_update_album' => 'OsveÅŸi album',
+		  'button_create_album' => 'Ustvari album',
+		  'success' => 'Postopek je uspel!',
+		  'error_select_album' => 'Prosim, najprej izberi album',
+		  'error_album_name' => 'Prosim, poimenuj album.',
+		  'error_album_already_exists' => 'V galeriji ÅŸe imaÅ¡ album s tem imenom.<BR><BR>Prosim, klikni gumb <I>Nazaj</I> v svojem brskalniku in vpiÅ¡i drugo ime za svoj novi album.',
+		  'album_name' => 'Ime albuma',
+		  'album_presentation' => 'Izbrati moraÅ¡ album, v katerega ÅŸeliÅ¡ naloÅŸiti slike. <BR>Äe albumov ni, je seznam prazen. Uporabi gumb \'Ustvari album\' in ustvari svoj prvi album.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'Dodaj slike v izbrani album',
+		  'max_upload_size' => 'NajveÄja dovoljena velikost slike je $1 KB',
+		  'upload_presentation' => 'Äe se v spodnjem polju ne pokaÅŸe programÄek, brskalnik pa opozarja na napako na strani, moraÅ¡ namestiti <a href=\'http://www.java.com\'>javo</a>.<BR>Uporaba je preprosta! Klikni <B>IÅ¡Äi</B> in izberi datoteke ali pa uporabi \'povleci in spusti\' v raziskovalcu ter nato klikni <B>NaloÅŸi</B> in poÅ¡lji slike na streÅŸnik.'
+		        . "<BR><U>Staro stran za nalaganje</U>, <a href='upload.php'>najdeÅ¡ tukaj</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/polish.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/polish.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/polish.php	(revision 3951)
@@ -0,0 +1,76 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// Thanks to Wojtek Semik: wojteks at pvd dot pl
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nie masz uprawnieÅ do wykonania tej operacji.<BR><BR>JeÅŒeli nie jesteÅ poÅÄ
+czony, proszÄ siÄ najpierw <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">zalogowaÄ</a>',
+		  'select_album' => 'ProszÄ wybraÄ album, do ktÃ³rego zostanÄ
+ przesÅane pliki',
+		  'button_update_album' => 'Aktualizuj album',
+		  'button_create_album' => 'StwÃ³rz album',
+		  'success' => 'Operacja zakoÅczona sukcesem',
+		  'error_select_album' => 'ProszÄ najpierw wybraÄ album.',
+		  'error_album_name' => 'ProszÄ nazwaÄ album.',
+		  'error_album_already_exists' => 'Istnieje juÅŒ album o takiej nazwie w Twojej kolekcji.<BR><BR>UÅŒyj przycisku <I>PowrÃ³t</I>w Twojej przeglÄ
+darce, aby wpisaÄ innÄ
+ nazwÄ albumu.',
+		  'album_name' => 'Nazwa albumu',
+		  'album_presentation' => 'Musisz teraz wybraÄ album, w ktÃ³rym bÄdÄ
+ przechowywane zdjÄcia, ktÃ³re przeÅlesz na serwer. <BR>JeÅŒeli jeszcze nie utworzyÅeÅ ÅŒadnego albumu, lista albumÃ³w bÄdzie pusta. UyÅŒj przycisku \'StwÃ³rz album\' aby utworzyÄ nowy album.',
+		  'album_description' => 'Opis albumu',
+		  'add_pictures' => 'Dodaj zdjÄcia do wybranego albumu',
+		  'max_upload_size' => 'Maksymalny rozmiar pliku ze zdjÄciem to $1 Ko',
+		'upload_presentation' => 'JeÅŒeli nie moÅŒesz wyÅwietliÄ apletu i przeglÄ
+darka informuje o bÅÄdach na stronie, najprawdopodobniej nie masz zainstalowanego Årodowiska uruchomieniowego Javy (Java JRE).<BR>Jak tylko je zainstalujesz, przesyÅanie plikÃ³w bÄdzie naprawdÄ proste! NaciÅniesz przycisk <B>PrzeglÄ
+daj</B> aby wybraÄ pliki albo po prostu przeciÄ
+gniesz je z menadÅŒera plikÃ³w, potem naciÅniesz przycisk <B>PrzeÅlij</B> i pliki zostanÄ
+ wysÅane na serwer.'
+		  	. "<BR>Aby korzystaÄ ze <U>starej strony przesyÅania</U>, <a href='upload.php'>kliknij tutaj</a>.",
+		  'album' => 'Album'  ,
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovak.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovak.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/slovak.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Odosielajte sÃºbory do galÃ©rie s pomocou Java appletu',
+		  'perm_denied' => 'NemÃ¡te oprÃ¡vnenie pre vykonanie tejto akcie.<BR><BR>Ak nie ste prihlÃ¡senÃœ, prosÃ­m <a href="$1">prihlÃ¡ste sa</a> najskÃŽr',
+		  'select_album' => 'ProsÃ­m vyberte album, do ktorÃ©ho chcete odoslaÅ¥ obrÃ¡zky',
+		  'button_update_album' => 'UpraviÅ¥ album',
+		  'button_create_album' => 'VytvoriÅ¥ album',
+		  'success' => 'Akcia bola vykonanÃ¡ ÃºspeÅ¡ne !',
+		  'error_select_album' => 'ProsÃ­m, vyberte najskÃŽr album',
+		  'error_album_name' => 'ProsÃ­m, zadajte nÃ¡zov albumu.',
+		  'error_album_already_exists' => 'Album s takÃœmto nÃ¡zvom uÅŸ mÃ¡te.<BR><BR>ProsÃ­m kliknite na tlaÄidlo <I>SpÃ€Å¥</I> na svojom prehliadaÄi, pre napÃ­sanie inÃ©ho nÃ¡zvu vÃ¡Å¡ho novÃ©ho albumu.',
+		  'album_name' => 'NÃ¡zov albumu',
+		  'album_presentation' => 'Tu je potrebnÃ© vybraÅ¥ album. ObrÃ¡zky, ktorÃ© poÅ¡lete server, budÃº uloÅŸenÃ© prÃ¡ve do tohto albumu. <BR>Ak nemÃ¡te vytvorenÃœ album, zoznam albumov je prÃ¡zdny. PouÅŸite tlaÄidlo \'VytvoriÅ¥ album\' na vytvorenie prvÃ©ho albumu.',
+		  'album_description' => 'Popis albumu',
+		  'add_pictures' => 'PridaÅ¥ obrÃ¡zky do vybranÃ©mu albumu',
+		  'max_upload_size' => 'MaximÃ¡lny veÄŸkost obrÃ¡zku mÃŽÅŸe byÅ¥ $1 KB',
+		  'upload_presentation' => 'Ak sa oblasti dole odmietne zobraziÅ¥ applet a prehliadaÄ oznamuje, ÅŸe na strÃ¡nke sa objavili chyby, pravdepodobne potrebujete nainÅ¡talovaÅ¥ java runtime plugin.<BR>Potom je uÅŸ odoslanie jednoduchÃ©! Kliknite na <B>HÄŸadaÅ¥</B> pre zvolenie sÃºborov, alebo ich cez drag\'n\'drop preneste kurzorom, nÃ¡sledne kliknite na <B>OdoslaÅ¥</B> pre odoslanie sÃºborov na server.'
+		. "<BR>Pre pouÅŸitie <U>starej strÃ¡nky pre upload</U>, <a href='upload.php'>kliknite sem</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'VÃ¡Å¡ prehliadaÄ nepodporuje Javu. Applet pre odosielanie vyÅŸaduje Javu. MÃŽÅŸete si ju zdarma stiahnuÅ¥ zo <a href="http:\\java.sun.com\jre\">strÃ¡nok Javy</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Kliknite na tento odkaz a vyplÅte informÃ¡cie do polÃ­Äok dole, ak chcete aby boli pouÅŸitÃ© na vÅ¡etky obrÃ¡zky v ÄalÅ¡om odoslanÃ­.',
+		  'quota_used' => 'AktuÃ¡lne puÅŸÃ­vate $1 MB ($2%) z $3 MB vÃ¡Å¡ho priestoru.',
+		  'quota_about_full' => 'OdstrÃ¡Åte nejakÃ© obrÃ¡zky, alebo poÅŸiadajte administrÃ¡tora aby vÃ¡m poskytol viac priestoru.',
+		  //Since 3.2.0
+		  'need_approval' => 'OdoslanÃ© obrÃ¡zky sa zobrazia v galÃ©rii aÅŸ po potvrdenÃ­ administrÃ¡torom galÃ©rie.'
+		)
+	);
+}
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/croatian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/croatian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/croatian.php	(revision 3951)
@@ -0,0 +1,67 @@
+﻿<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File croatian.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Nedostaju prava za izvršenje.<BR><BR>Prijaviti se možete <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ovdje</a>.',
+		  'select_album' => 'Molimo izaberite album u koji želite spremiti slike.',
+		  'button_update_album' => 'Osvježi album',
+		  'button_create_album' => 'Otvori novi album',
+		  'success' => 'Uspješno izvršeno!',
+		  'error_select_album' => 'Molim prvo izaberite album',
+		  'error_album_name' => 'Molim upišite ime albuma.',
+		  'error_album_already_exists' => 'Album sa tim imenom već postoji.<BR><BR>Molim kliknite izbornik <I>Nazad</I> u pregledniku te upišite drugo ime albuma.',
+		  'album_name' => 'Naslov albuma',
+		  'album_presentation' => 'Molim izaberite album. Datoteke koje su izabrane za slanje na server biti će pohranjene u ovaj album. <BR>Ako album još ne postoji, izaberite opciju \'Otvori novi album\'.',
+		  'album_description' => 'Opis albuma',
+		  'add_pictures' => 'Pridruži nove slike albumu',
+		  'max_upload_size' => 'Najveća dopištena veličina slike iznosi $1 KB',
+		  'upload_presentation' => 'Ukoliko se Applet ne prikaže i/ili preglednik vrati grešku, molim provjerite da li koristite zadnju verziju java runtime plugin-a.<BR>Nakon aktualiziranja applet će raditi znatno bolje. Za slanje slika na server kliknite na <B>Pretraži...</B> i izberite datoteke ili \'povucite\' datoteke mišem iz direktorija u applet. Nakon toga kliknite na <B>Pošalji</B> da biste pokrenuli slanje.'
+		  	. "<BR>Ako želite koristiti <U>staru</U> funkciju slanja, kliknite molim <a href='upload.php'>ovdje</a>.",
+		  'album' => 'album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/esperanto.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/esperanto.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/esperanto.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Vi ne rajtas fari tion.<br><br>If vi ne estas konektita, bonvolu <a href="$1">ensaluti</a> unue',
+		  'select_album' => "Bonvolu elekti fotoalbumon, kie vi volas al\u015Duti fotojn",
+		  'button_update_album' => "\u011Cidatigu albumon",
+		  'button_create_album' => 'Kreu albumon',
+		  'success' => 'Sukceso!',
+		  'error_select_album' => 'Bonvolu elekti fotoalbumon unue',
+		  'error_album_name' => 'Bonvolu nomi la fotoalbumon.',
+		  'error_album_already_exists' => 'Vi jam havas albumon kun tiu nomo.<br><br>Bonvolu klaki sur la <i>Reen</i>-butono de via retumilo, por tajpi alian titolon por via nova fotoalbumo.',
+		  'album_name' => 'Albuma nomo',
+		  'album_presentation' => "Vi devas elekti albumon \u0109i tie.  La bildoj kiujn vi sendis al la servilo konservi/u011Dos en \u0109i tiu albumo.<br>Se vi ne havas albumon, la albuma listo estas malplena. Uzu la 'Kreu'-butonon por krei vian unuan albumon.",
+		  'album_description' => 'Albuma priskribo',
+		  'add_pictures' => 'Aldonu bildojn al la elektita albumo',
+		  'max_upload_size' => 'La maksimuma grandeco por bildo estas $1 Kb',
+		  'upload_presentation' => "Se la kvadrato sube rifuzas montri la apleton, kaj la retumilo indikas ke estas eraroj sur la pa/u011Do, bona ideo estus instali la \"Java Runtime Plugin\".<br>Poste, al\u015Dutado simplos! Klaku sur <b>Foliumi</b> por elekti dosierojn a\u016D uzu \"klaktenu kaj metu\" de la retumilo, tiam klaku sur <b>Al\u015Duti</b> por sendi la bildojn al la servilo."
+		  . "<br>Por uzi la <u>malnova al\u015Duta pa/u011Do</u>, <a href='upload.php'>klaku \u0109i tie</a>.",
+		  'album' => 'Albumo',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/persian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/persian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/persian.php	(revision 3951)
@@ -0,0 +1,119 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ ØšÙ Ú¯Ø§ÙØ±Û ØšØ§ Ø§Ø³ØªÙØ§Ø¯Ù Ø§Ø² Ø§ÙŸÙØª Ø¬Ø§ÙØ§',
+		  'perm_denied' => 'ØŽÙ
+Ø§ Ø§Ø¬Ø§Ø²Ù Ø§ÙØ¬Ø§Ù
+ Ø§ÛÙ Ø¹Ù
+ÙÛØ§Øª Ø±Ø§ ÙØ¯Ø§Ø±ÛØ¯.<BR><BR>ÙØ·ÙØ§ Ø§ØšØªØ¯Ø§ <a href="$1">ÙØ§Ø±Ø¯</a> ØŽÙÛØ¯',
+		  'select_album' => 'ÙØ·ÙØ§ Ø¢ÙØšÙÙ
+Û Ø±Ø§ Ú©Ù Ù
+ÛØ®ÙØ§ÙÛØ¯ ØšÙ Ø¢Ù ÙØ§ÛÙ Ø§Ø±Ø³Ø§Ù Ú©ÙÛØ¯ Ø Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯',
+		  'button_update_album' => 'ØšÙ Ø±ÙØ² Ø±Ø³Ø§ÙÛ Ø¢ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÛØ¬Ø§Ø¯ Ø¢ÙØšÙÙ
+',
+		  'success' => 'Ø¹Ù
+ÙÛØ§Øª ØšØ§ Ù
+ÙÙÙÛØª Ø§ÙØ¬Ø§Ù
+ ØŽØ¯!',
+		  'error_select_album' => 'ÙØ·ÙØ§ Ø§ØšØªØ¯Ø§ Ø¢ÙØšÙÙ
+ Ø±Ø§ Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯.',
+		  'error_album_name' => 'ÙØ·ÙØ§ ÙØ§Ù
+ Ø¢ÙØšÙÙ
+ Ø±Ø§ Ù
+ØŽØ®Øµ Ú©ÙÛØ¯.',
+		  'error_album_already_exists' => 'Ø¢ÙØšÙÙ
+Û ØšØ§ Ø§ÛÙ ÙØ§Ù
+ ÙØ¬ÙØ¯ Ø¯Ø§Ø±Ø¯.<BR><BR>ÙØ·ÙØ§ ØšØ± Ø±ÙÛ Ú©ÙÛØ¯ <I>Back</I> Ù
+Ø±ÙØ±Ú¯Ø±ØªØ§Ù Ú©ÙÛÚ© Ú©ÙÛØ¯, ØªØ§ ÙØ§Ù
+ Ø¯ÛÚ¯Ø±Û ØšØ±Ø§Û Ø¢ÙØšÙÙ
+ Ø§ÙØªØ®Ø§Øš ÙÙ
+Ø§ØŠÛØ¯.',
+		  'album_name' => 'ÙØ§Ù
+ Ø¢ÙØšÙÙ
+',
+		  'album_presentation' => 'ØŽÙ
+Ø§ ØšØ§ÛØ¯ Ø¢ÙØšÙÙ
+Û Ø±Ø§ Ø§ÙØªØ®Ø§Øš ÙÙ
+Ø§ØŠÛØ¯. ÙØ§ÛÙÛ Ø±Ø§ Ú©Ù Ø§Ø±Ø³Ø§Ù Ù
+Û Ú©ÙÛØ¯ Ø¯Ø± Ø§ÛÙ Ø¢ÙØšÙÙ
+ ÙØ±Ø§Ø± Ø®ÙØ§ÙØ¯ Ú¯Ø±ÙØª. <BR>Ø§Ú¯Ø± Ø¢ÙØšÙÙ
+Û ÙØ³Ø§Ø®ØªÙ ØšØ§ØŽÛØ¯ ÙÛØ³Øª Ø¢ÙØšÙÙ
+ ÙØ§ Ø®Ø§ÙÛ Ø§Ø³Øª . Ø§Ø² Ú©ÙÛØ¯ \'Ø³Ø§Ø®Øª\' ØšØ±Ø§Û Ø³Ø§Ø®ØªÙ Ø§ÙÙÛÙ Ø§ÙØšÙÙ
+ Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯.',
+		  'album_description' => 'ØªÙØ¶ÛØ­Ø§Øª Ø¢ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§ÙØ²ÙØ¯Ù ÙØ§ÛÙ ØšÙ Ø¢ÙØšÙÙ
+ Ø§ÙØªØ®Ø§Øš ØŽØ¯Ù',
+		  'max_upload_size' => 'Ø­Ø¬Ù
+ ØšØ²Ú¯ØªØ±ÛÙ ÙØ§ÛÙ ÙØšØ§ÛØ¯ ØšÛØŽØªØ± Ø§Ø² $1 Ú©ÛÙÙØšØ§ÛØª ØšØ§ØŽØ¯.',
+		  'upload_presentation' => 'Ø§Ú¯Ø± Ø§ÙŸÙØª Ø¬Ø§ÙØ§ Ø¯Ø± Ø²ÛØ± ÙÙ
+Ø§ÛØŽ Ø¯Ø§Ø¯Ù ÙÙ
+Û ØŽÙØ¯ Ù Ù
+Ø±ÙØ±Ú¯Ø± Ø®Ø·Ø§ÛÛ Ø±Ø§ ÙÙ
+Ø§ÛØŽ Ù
+Û Ø¯ÙØ¯ ØšÙØªØ±ÛÙ Ú©Ø§Ø± Ø§ÛÙ Ø§Ø³Øª Ú©Ù java runtime plugin Ø±Ø§ ÙØµØš Ú©ÙÛØ¯.<BR>Ø§Ø±Ø³Ø§Ù ØšØ§ÛÙ ØšØ³ÛØ§Ø± Ø¢Ø³Ø§Ù Ø§Ø³Øª . Ú©Ø§ÙÛ Ø§Ø³Øª ØšØ± Ø±ÙÛ Ú©ÙÛØ¯  <B>Browse</B> Ú©ÙÛÚ© Ú©ÙÛØ¯ Ù ÙØ§ÛÙ Ø±Ø§ Ø§ÙØªØ®Ø§Øš Ú©ÙÛØ¯ Ù ÛØ§ Ù
+ÛØªÙØ§ÙÛØ¯ ØšØ§ Ù
+ÙØŽÙØ§Ø±Ù ÙØ§ÛÙÙØ§ Ø±Ø§ ØšØ§ Ø¯Ø§Ø®Ù Ø§ÙŸÙØª ØšÚ©ØŽÛØ¯Ù Ø³ÙŸØ³ ØšØ± Ø±ÙÛ Ú©ÙÛØ¯ <B>Upload</B> Ú©ÙÛÚ© Ú©ÙÛØ¯ ØªØ§ ÙØ§ÛÙ Ø§Ø±Ø³Ø§Ù ØŽÙØ¯.'
+		. "<BR>ØšØ±Ø§Û Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ <U>ØšÙ ØŽÛÙÙ ÙØ¯ÛÙ
+Û</U> <a href='upload.php'>Ø§ÛÙØ¬Ø§</a> Ú©ÙÛÚ© Ú©ÙÛØ¯",
+		  'album' => 'Ø¢ÙØšÙÙ
+',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø¬Ø§ÙØ§ Ø¯Ø± Ù
+Ø±ÙØ±Ú¯Ø± ØŽÙ
+Ø§ ØºÛØ± ÙØ¹Ø§Ù ØŽØ¯Ù Ø§Ø³Øª. Ø§ÙŸÙØª Ø¬Ø§ÙØ§ ØšØ±Ø§Û Ø§Ø±Ø³Ø§Ù ÙØ§ÛÙ ØšÙ Ø¬Ø§ÙØ§ ÙÛØ§Ø² Ø¯Ø§Ø±Ø¯!. ØšØ±Ø§Û ÙØµØš Ø¬Ø§ÙØ§ Ù
+ÛØªÙØ§ÙÛØ¯ Ø§Ø² <a href="http:\\java.sun.com\jre\">java web site</a> Ø§Ø³ØªÙØ§Ø¯Ù Ú©ÙÛØ¯ (Ù
+ØªØ§Ø³ÙØ§ÙÙ Ø§ÛÙ Ø³Ø§ÛØª Ø§Ù
+Ú©Ø§Ù Ø¯Ø±ÛØ§ÙØª ÙØ§ÛÙ ØšØ±Ø§Û Ø§ÛØ±Ø§ÙÛØ§Ù Ø±Ø§ ÙØ±Ø§ÙÙ
+ ÙÙ
+Û Ú©ÙØ¯!)',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/portuguese.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/portuguese.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/portuguese.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Enviar arquivos para galeria, com a ajuda de um applet',
+		  'perm_denied' => 'VocÃª nÃ£o tem permissÃ£o para realizar esta operaÃ§Ã£o.<BR><BR>Se vocÃª nÃ£o estÃ¡ logado por favor <a href="$1">efetue login</a>',
+		  'select_album' => 'Escolha um album onde vocÃª deseja colocar as fotos',
+		  'button_update_album' => 'Atualizar album',
+		  'button_create_album' => 'Criar album',
+		  'success' => 'Feito com sucesso! !',
+		  'error_select_album' => 'Escolha um album',
+		  'error_album_name' => 'DÃª um nome ao album.',
+		  'error_album_already_exists' => 'JÃ¡ existe um Ã¡lbum com esse nome.<BR><BR>Por favor clique  no botÃ£o <I>voltar</I> do seu navegador, para digitar outro nome para o album.',
+		  'album_name' => 'Nome do album',
+		  'album_presentation' => 'Selecione um album aqui. As fotos que vocÃª enviar para o servidor serÃ£o guardadas aqui. <BR>Se vocÃª nÃ£o tem nenhum album a lista estarÃ¡ vazia. Use o botÃ£o \'Criar\' para criar um novo album.',
+		  'album_description' => 'DescriÃ§Ã£o do album',
+		  'add_pictures' => 'Adicionar fotos para o album selecionado',
+		  'max_upload_size' => 'O tamanho maximo de envio de dados Ã© de $1 KB',
+		  'upload_presentation' => 'Se a pÃ¡gina realmente se recusa a mostrar o applet, e/ou na pagina Ã© mostrado que existe algum erro, recomanda-se que instale o java e apÃ³s isso serÃ¡ bastante fÃ¡cil utilizar, basta clicar em procurar, escolher o arquivo, e clicar em enviar.'
+		. "<BR>Para usar a <U>a pÃ¡gina de upload</U>, <a href='upload.php'>clique aqui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Seu navegador nÃ£o permite java. O Applet de upload precisa de java. VocÃª pode facilmente fazer o download pelo site da sun <a href="http:\\java.sun.com\jre\">clicando aqui</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/romanian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/romanian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/romanian.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'ÃncÄrcaÅ£i fiÅiere Ã®n galerie, cu ajutorul unui applet',
+		  'perm_denied' => 'Nu aveÅ£i permisiunea de a efectua aceastÄ operaÅ£ie.<BR><BR>DacÄ nu eÅti conectat, vÄ rugÄm sÄ vÄ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '"> autentificaÅ£i </ a> prima datÄ',
+		  'select_album' => 'VÄ rugÄm, alegeÅ£i un album, Ã®n cazul Ã®n care doriÅ£i sÄ Ã®ncÄrcaÅ£i imagini',
+		  'button_update_album' => 'Actualizare album',
+		  'button_create_album' => 'Creare album',
+		  'success' => 'AcÅ£iune cu succes !',
+		  'error_select_album' => 'VÄ rugÄm, alegeÅ£i un album prima datÄ',
+		  'error_album_name' => 'VÄ rugÄm sÄ daÅ£i un nume albumului.',
+		  'error_album_already_exists' => 'AveÅ£i deja un album cu acest nume.<BR><BR>VÄ rugÄm sÄ faceÅ£i clic pe <I>Ãnapoi</I> butonul de Navigator-ul tÄu, pentru a da un alt titlu albumul nou.',
+		  'album_name' => 'Nume album',
+		  'album_presentation' => 'Trebuie sÄ selectaÅ£i un album aici. Imaginile pe care le trimiteÅ£i la server vor fi stocate Ã®n acest album. <BR> DacÄ nu ai nici un album, sau lista de albume este goalÄ. UtilizaÅ£i butonul \'CreaÅ£i\' pentru a crea primul album.',
+		  'album_description' => 'Descriere album',
+		  'add_pictures' => 'AdaugÄ poze la albumul selectat',
+		  'max_upload_size' => 'Dimensiunea maximÄ pentru o imagine este $1 KB',
+		  'upload_presentation' => 'Ãn cazul Ã®n care se refuzÄ categoric pentru a afiÅa appletul pÄtrat de mai jos, Åi navigatorul indicÄ faptul cÄ existÄ erori pe aceastÄ paginÄ, o idee bunÄ ar fi sÄ instalaÅ£i plugin-ul Java Runtime.<a href="http://java.sun.com/" target="_blank">Java&#8482;</a><BR>DupÄ ce, Ã®ncÄrcaÅ£i este foarte simplu! FaceÅ£i clic pe <B>RÄsfoire</B> pentru a selecta fiÅiere sau utilizaÅ£i glisare \'n\' de la explorator, apoi faceÅ£i clic pe <B>ÃncÄrcare</B> pentru a trimite imagini pe server.'
+		. "<BR>Pentru a utiliza <U>pagina de Ã®ncÄrcare veche</U>, <a href='upload.php'>click aici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Navigator tÄu nu permite Java. Ai nevoie de Java Applet. AveÅ£i posibilitatea sÄ descÄrcaÅ£i cu uÅurinÅ£Ä de la <a href="http:\\java.sun.com\jre\">site-ul web de java</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'FaceÅ£i clic pe acest link, Åi introduceÅ£i datele Ã®n cÃ¢mpurile de mai jos, dacÄ doriÅ£i ca acestea sÄ fie aplicate la toate imaginile din Ã®ncÄrcare urmÄtoare.',
+		  'quota_used' => 'Ãn prezent utilizaÅ£i $1 MB ($2%) din $3 MB de volum.',
+		  'quota_about_full' => 'ScoateÅ£i niÅte poze, sau cereÅ£i de la  admin pentru a mÄri cota mai mare.',
+		  //Since 3.2.0
+		  'need_approval' => 'Administradorul Galeriei trebuie sÄ aprobe aceste imagini Ã®ncÄrcate, Ã®nainte de a le putea vedea pe galerie.'
+		)
+	);
+
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/bulgarian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/bulgarian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/bulgarian.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'ÐÑÑÐ·ÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ',
+		  'link_comment' => 'ÐÐ°ÑÐµÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²Ðµ Ð»ÐµÑÐœÐŸ Ðž Ð±ÑÑÐ·ÐŸ',
+		  'perm_denied' => 'ÐÑÐŒÐ°ÑÐµ Ð¿ÑÐ°Ð²Ð° Ð·Ð° ÑÐ°Ð·Ðž ÐŸÐ¿ÐµÑÐ°ÑÐžÑ.<BR><BR>ÐÑÐŸÐ²ÐµÑÐµÑÐµ ÐŽÐ°Ð»Ðž ÑÑÐµ Ð²Ð»ÐµÐ·Ð»Ðž, Ð°ÐºÐŸ ÐœÐµ ÐœÐ°ÑÐžÑÐœÐµÑÐµ:<a href="$1">ÐÑ
+ÐŸÐŽ</a> first',
+		  'select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ ÐºÑÐŽÐµÑÐŸ ÐžÐ·ÐºÐ°ÑÐµ ÐŽÐ° ÐºÐ°ÑÐžÑÐµ ÑÐ°Ð¹Ð»ÐŸÐ²ÐµÑÐµ',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²Ðž Ð°Ð»Ð±ÑÐŒÐ°',
+		  'button_create_album' => 'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ',
+		  'success' => 'ÐÐ¿ÐµÑÐ°ÑÐžÑÑÐ° ÑÑÐ¿ÐµÑÐœÐ° !',
+		  'error_select_album' => 'ÐÐŸÐ»Ñ ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ',
+		  'error_album_name' => 'ÐÐŸÐ»Ñ ÐŽÐ°Ð¹ÑÐµ ÐžÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°.',
+		  'error_album_already_exists' => 'ÐÐµÑÐµ ÐžÐŒÐ° Ð°Ð»Ð±ÑÐŒ Ñ ÑÐŸÐ²Ð° ÐžÐŒÐµ.<BR><BR>ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <I>Back</I> Ð±ÑÑÐŸÐœ Ð² Ð±ÑÐ°ÑÐ·Ð°ÑÐ°, ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ ÐŽÑÑÐ³ÐŸ ÐžÐŒÐµ Ð·Ð° Ð°Ð»Ð±ÑÐŒÐ° Ð²Ðž.',
+		  'album_name' => 'ÐÐŒÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'album_presentation' => 'ÐÐžÐµ ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐžÐ·Ð±ÐµÑÐµÑÐµ Ð°Ð»Ð±ÑÐŒ. Ð¡ÐœÐžÐŒÐºÐžÑÐµ ÐºÐŸÐžÑÐŸ ÑÑÐµ ÐžÐ·Ð¿ÑÐ°ÑÐžÐ»Ðž ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ° ÑÐµ ÑÐµ ÑÑÑ
+ÑÐ°ÐœÑÐ²Ð°Ñ Ð² ÑÐŸÐ·Ðž Ð°Ð»Ð±ÑÐŒ. <BR>ÐÐºÐŸ ÐœÑÐŒÐ°ÑÐµ ÐœÐžÐºÐ°ÐºÐ²Ðž Ð°Ð»Ð±ÑÐŒÐž, Ð»ÐžÑÑÐ° Ñ Ð°Ð»Ð±ÑÐŒÐž Ð²Ðž Ðµ Ð¿ÑÐ°Ð·ÐµÐœ. ÐÐ·Ð¿ÐŸÐ»Ð·Ð²Ð°Ð¹ÑÐµ \'Ð¡ÑÐ·ÐŽÐ°Ð¹ Ð°Ð»Ð±ÑÐŒ\' Ð±ÑÑÐŸÐœÐ° Ð·Ð° ÐŽÐ° ÑÑÐ·ÐŽÐ°ÐŽÐµÑÐµ Ð²Ð°ÑÐžÑÑ Ð¿ÑÑÐ²Ðž Ð°Ð»Ð±ÑÐŒ.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ ÐœÐ° Ð°Ð»Ð±ÑÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐµÑÐµ ÑÐœÐžÐŒÐºÐž Ð² ÐžÐ·Ð±ÑÐ°ÐœÐžÑ Ð°Ð»Ð±ÑÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÐœÐžÑ ÑÐ°Ð·ÐŒÐµÑ ÐœÐ° ÑÐœÐžÐŒÐºÐžÑÐµ Ðµ $1 KB',
+		  'upload_presentation' => 'ÐÐºÐŸ ÐœÐµ Ð²Ðž ÑÐµ Ð¿ÐŸÑÐ²ÑÐ²Ð° Ð°Ð¿Ð»ÐµÑÐ° Ð·Ð° ÐºÐ°ÑÐ²Ð°ÐœÐµ ÐžÐ»Ðž ÐžÐŒÐ° ÐœÑÐºÐ°ÐºÐ²Ðž Ð³ÑÐµÑÐºÐž Ð² ÑÑÑÐ°ÐœÐžÑÐ°ÑÐ° Ðµ ÐŽÐŸÐ±ÑÐ° ÐžÐŽÐµÑ ÐŽÐ° Ð¿ÑÐŸÐ²ÐµÑÐžÑÐµ ÐŽÐ°Ð»Ðž ÐžÐŒÐ°ÑÐµ ÐžÐœÑÑÐ°Ð»ÐžÑÐ°Ðœ java runtime plugin.<BR>ÐÐ°ÑÐ²Ð°ÐœÐµÑÑÐŸ Ðµ Ð»ÐµÑÐœÐŸ! ÐÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Browse</B> ÐžÐ·Ð±ÐµÑÐµÑÐµ ÑÐ°Ð¹Ð» ÐžÐ»Ðž ÐžÐ·ÐŽÑÑÐ¿Ð°Ð¹ÑÐµ ÑÐ°Ð¹Ð»Ð° ÐŸÑ ÐµÐºÑÐ¿Ð»ÐŸÑÐµÑÐ°, ÑÐ»ÐµÐŽ ÑÐŸÐ²Ð° ÐºÐ»ÐžÐºÐœÐµÑÐ° ÐœÐ° <B>Upload</B> ÐŽÐ° ÐžÐ·Ð¿ÑÐ°ÑÐžÑÐµ ÑÐœÐžÐŒÐºÐ°ÑÐ° ÐºÑÐŒ ÑÑÑÐ²Ð°ÑÐ°.'
+		. "<BR>ÐÐ° ÐŽÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ  <U>ÐŽÑÑÐ³ÐžÑ Ð²Ð°ÑÐžÐ°ÐœÑ</U>, <a href='upload.php'>ÐºÐ»ÐžÐºÐœÐµÑÐµ ÑÑÐº</a>.",
+		  'album' => 'ÐÐ»Ð±ÑÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'ÐÐ°ÑÐžÑ Ð±ÑÐ°ÑÐ·ÐµÑ ÐœÐµ Ð¿ÐŸÐŽÑÑÐ¶Ð° Java. ÐÐ° ÐŽÐ° ÑÐ°Ð±ÐŸÑÐž Ð°Ð¿Ð»ÐµÑÐ° Ð²Ðž ÑÑÑÐ±Ð²Ð° Java. ÐÐŸÐ²ÐµÑÐµ Ð»ÐµÑÐœÐŸ ÐŽÐ° Ñ ÑÐ²Ð°Ð»ÐžÑÐµ ÐŸÑ: <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'ÐÐ»ÐžÐºÐœÐµÑÐµ ÐœÐ° ÑÐŸÐ·Ðž Ð»ÐžÐœÐº, Ðž Ð²ÑÐ²ÐµÐŽÐµÑÐµ ÐŽÐ°ÐœÐœÐž Ð² Ð¿ÐŸÐ»ÐµÑÐ°ÑÐ° Ð¿ÐŸ-ÐŽÐŸÐ»Ñ, Ð°ÐºÐŸ ÐžÑÐºÐ°ÑÐµ ÑÐµ ÐŽÐ° ÑÐµ Ð¿ÑÐžÐ»Ð°Ð³Ð°Ñ ÐºÑÐŒ Ð²ÑÐžÑÐºÐž ÑÐœÐžÐŒÐºÐž Ð² ÑÐ»ÐµÐŽÐ²Ð°ÑÐŸÑÐŸ ÐºÐ°ÑÐ²Ð°ÐœÐµ.',
+		  'quota_used' => 'Ð ÐŒÐŸÐŒÐµÐœÑÐ° Ð¿ÐŸÐ»Ð·Ð²Ð°ÑÐµ $1 MB ($2%) ÐŸÑ  $3 MB ÐŽÐžÑÐºÐŸÐ²ÐŸ Ð¿ÑÐŸÑÑÑÐ°ÐœÑÑÐ²ÐŸ.',
+		  'quota_about_full' => 'ÐžÐ·ÑÑÐžÐ¹ÑÐµ ÐœÑÐºÐŸÑ ÑÐœÐžÐŒÐºÐ°, ÐžÐ»Ðž Ð¿ÐžÑÐµÑÐµ ÐœÐ° Ð°ÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÐŽÐ° Ð²Ðž Ð²ÐŽÐžÐ³ÐœÐµ ÐºÐ²ÐŸÑÐ°ÑÐ°.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÐÐŽÐŒÐžÐœÐžÑÑÑÐ°ÑÐŸÑÐ° ÑÑÑÐ±Ð²Ð° ÐŽÐ° ÐŸÐŽÐŸÐ±ÑÐž ÐºÐ°ÑÐµÐœÐžÑÐµ ÑÐœÐžÐŒÐºÐž, Ð¿ÑÐµÐŽÐž ÐŽÐ° Ð³Ðž Ð²ÐžÐŽÐžÑÐµ Ð² Ð³Ð°Ð»ÐµÑÐžÑÑÐ°.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/spanish.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/spanish.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/spanish.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// Thanks to jesusangelwork: jesusangelwork[at]users.sourceforge[dot]net
+//  And GecKoTDF (on http://forum.coppermine-gallery.net)
+// ------------------------------------------------------------------------- //
+ 
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Usted no tiene permisos para realizar esta operaciÃ³n.<BR><BR>Si no estÃ¡ conectado, por favor <a href="$1">conÃ©ctese</a> antes',
+		  'select_album' => 'Por favor, seleccione el Ã¡lbum donde desea subir las imÃ¡genes',
+		  'button_update_album' => 'Actualizar Ã¡lbum',
+		  'button_create_album' => 'Crear Ã¡lbum',
+		  'success' => 'ËOperaciÃ³n exitosa!',
+		  'error_select_album' => 'Por favor, seleccione antes un Ã¡lbum',
+		  'error_album_name' => 'Por favor, escriba un nombre para el Ã¡lbum.',
+		  'error_album_already_exists' => 'Ya tiene un Ã¡lbum con este nombre.<BR><BR>Pulse, por favor, sobre el botÃ³n <I>AtrÃ¡s</I> de su navegador para escribir otro tÃ­tulo para su nuevo Ã¡lbum.',
+		  'album_name' => 'Nombre del Ã¡lbum',
+		  'album_presentation' => 'Debe seleccionar un Ã¡lbum. Las imÃ¡genes que envÃ­e al servidor serÃ¡n almacenadas en este Ã¡lbum. <BR>Si no tiene ningÃºn Ã¡lbum, la lista de Ã¡lbumes aparecerÃ¡ vacÃ­a. Utilice el botÃ³n \'Crear\' para crear su primer Ã¡lbum.',
+		  'album_description' => 'DescripciÃ³n del Ã¡lbum',
+		  'add_pictures' => 'AÅadir imÃ¡genes al Ã¡lbum seleccionado',
+		  'max_upload_size' => 'El tamaÅo mÃ¡ximo para una imagen es $1 Ko',
+		  'upload_presentation' => 'Si el applet no aparece en el cuadrado que hay debajo y el navegador indica que se han producido errores en esta pÃ¡gina, serÃ­a buena idea que instalase el plugin de JAVA.<BR>DespuÃ©s de eso, subir las imÃ¡genes serÃ¡ muy sencillo. Pulse sobre <B>Examinar</B> para seleccionar ficheros o utilice arrastrar y soltar desde el explorador de ficheros, despuÃ©s pulse sobre <B>Subir</B> para enviar las imÃ¡genes al servidor.'
+		  	. "<BR>Para usar la <U>antigua pÃ¡gina de carga</U>, <a href='upload.php'>pulse aquÃ­</a>.",
+		  'album' => 'Ãlbum',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Su navegador no soporta Java. Necesita Java. Puede bajarlo desde <a href="http:\\www.java.com/es/download/">el sitio de java.</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Haga click en este link, y ponga la informacion en los campos de abajo, Si quiere que se apliquen en proximas subidas.',
+		  'quota_used' => 'Actualmente usa $1 MB ($2%) de sus $3 MB de almacenamiento.',
+		  'quota_about_full' => 'Sin espacio, borre algunas imagenes, o pidale al administrador mas espacio.',
+		  //Since 3.2.0
+		  'need_approval' => 'El administrador debe autorizar estas imagenes, antes de poder ser vistas en la galeria.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/french.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/french.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/french.php	(revision 3951)
@@ -0,0 +1,75 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Envoyer des fichiers vers la galerie, avec l\'aide d\'une applet',
+		  'perm_denied' => 'Vous n\'avez pas la permission d\'effectuer cette opÃ©ration.<BR><BR>Si vous n\'Ãªtes pas connectÃ©s, <a href="$1">identifiez-vous</a> d\'abord, en cliquant <a href="$1">ici</a> par exemple.',
+		  'select_album' => 'Choisissez un album o&ugrave; envoyer les photos',
+		  'button_update_album' => 'Modifier le nom et/ou la description',
+		  'button_create_album' => 'CrÃ©er un nouvel album',
+		  'success' => 'Action rÃ©ussie !',
+		  'error_select_album' => 'Veuillez d\'abord sÃ©lectionner un album.',
+		  'error_album_name' => 'Veuillez d\'abord donner un nom Ã  l\'album.',
+		  'error_album_already_exists' => 'Vous possÃ©dez dÃ©jÃ  un album avec ce titre.<BR><BR>Cliquez sur le bouton <I>PrÃ©cÃ©dent</I> de votre navigateur pour sÃ©lectionner un autre nom.',
+		  'album_name' => 'Nom de l\'album',
+		  'album_presentation' => 'Vous devez sÃ©lectionner un album. Les images que vous enverrez au serveur seront enregistrÃ©es dans cet album.<BR>Si vous n\'avez pas encore crÃ©Ã© d\'album, la liste est vide. Utilisez alors le bouton \'CrÃ©er\' pour en faire un nouveau.',
+		  'album_description' => 'Description de l\'album',
+		  'add_pictures' => 'Ajouter des images Ã  l\'album sÃ©lectionnÃ©',
+		  'max_upload_size' => 'Le poids maximal autorisÃ© pour une image est de $1 Ko',
+		  'upload_presentation' => "Si la carrÃ© ci-dessous reste dÃ©sespÃ©rÃ©ment blanc, et que la navigateur indique qu'il y a des erreurs sur cette page, une bonne idÃ©e est de cliquer sur <a href=\"http://les.gauthier.free.fr/install/jre-1_5_0_06-windows-i586-p.exe\">ce lien pour installer Java</a>, puis de choisir 'ExÃ©cuter' sur la fenÃªtre qui va s'ouvrir. Laisser vous guider (prendre les options proposÃ©es en standard). <BR> " 
+		  	. "AprÃšs, promis : le transfert des images est super simple ! "
+		  	. "Cliquez sur <B>Choisir des fichiers</B> (ou faites un glisser/dÃ©placer des fichiers images), puis sur <B>Envoyer</B> pour les charger sur le serveur."
+		  	. "<BR>Pour utiliser l'<U>ancienne mÃ©thode</U> d'upload d'image, <a href='upload.php'>cliquez ici</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Java n\'est pas installÃ© sur votre ordinateur. L\'applet d\'upload a besoin de java. Vous pouvez facilement l\'installer depuis le <a href="http:\\java.sun.com\jre\">site web de java</a>.',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Cliquez sur ce lien, et entrez des valeurs dans les champs ci-dessous, si vous voulez qu\'elles s\'appliquent Ã  toutes les images du prochain upload (tÃ©lÃ©chargement) de fichiers.',
+		  'quota_used' => 'Vous utilisez actuellement $1 MB ($2%) de votre quota de $3 MB de stockage.',
+		  'quota_about_full' => 'Supprimez des photos, ou demandez une augmentation de votre quota Ã  l\'administrateur.',
+		  //Since 3.2.0
+		  'need_approval' => 'L\'administrateur de la galerie doit approuver les images uploadÃ©es, avant que vous puissiez les voir sur le site.',
+		  //Since 4.1.0
+		  'see_uploaded_pictures_url' => 'Cliquez ici, pour voir les URL des images uploadÃ©es, visibles sur cette page'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/danish.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/danish.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/danish.php	(revision 3951)
@@ -0,0 +1,69 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php   in Danish
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du har ikke tilladelse til at udfÃžre denne operation. BR><BR>Hvis du ikke er forbundet, sÃ¥ <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">login</a> fÃžrst',
+		  'select_album' => 'VÃŠlg venligst et album, hvori du vil uploade billeder',
+		  'button_update_album' => 'Opdater album',
+		  'button_create_album' => 'Opret album',
+		  'success' => 'Handlingen lykkedes!',
+		  'error_select_album' => 'VÃŠlg venligst et album fÃžrst',
+		  'error_album_name' => 'Giv venligst albummet et navn.',
+		  'error_album_already_exists' => 'Du ejer allerede et album med dette navn.<BR><BR>Klik venligst pÃ¥ <I>Tilbage</I>-knappen i din browser for at skrive en titel pÃ¥ dit nye album.',
+		  'album_name' => 'Albumnavn',
+		  'album_presentation' => 'Du skal vÃŠlge et album her. Billederne du sender til serveren, vil blive gemt i dette album. <BR>Hvis du ikke har et album, er albumlisten tom. Brug âOpretâ-knappen til at oprette dit fÃžrste album.',
+		  'album_description' => 'Albumbeskrivelse',
+		  'add_pictures' => 'TilfÃžj billeder til det valgte album',
+		  'max_upload_size' => 'Den maximale stÃžrrelse for et billede er $1 Kb',
+		  'upload_presentation' => 'Hvis firkanten nedenfor fuldstÃŠnding nÃŠgter at vise appletten, og navigatoren indikerer at der er fejl pÃ¥ denne side, er det en god ide at installere java runtime plugin-et.<BR>NÃ¥r det er gjort, er upload virkelig enkelt ! Klik pÃ¥ <B>SÃžg...</B> for at vÃŠlge filer eller brug trÃŠk-og-slip fra stifinderen. Klik sÃ¥ pÃ¥ <b>Upload</b> for at sende billederne til serveren.'
+		  	. "<BR>For at bruge den <U>gamle uploadside</U>, <a href='upload.php'>klik her</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/swedish.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/swedish.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/swedish.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ Maintainer: Erik Lindahl erik@fisensmosse.se
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Ladda upp bilder till galleriet med hjÃ€lp av appleten',
+		  'perm_denied' => 'Du har inte behÃ¶righet att utfÃ¶ra Ã¥tgÃ€rden<BR><BR>Om du inte Ã€r ansluten, <a href="$1">logga in</a> fÃ¶rst',
+		  'select_album' => 'VÃ€lj ett album dÃ€r du vill spara bilderna',
+		  'button_update_album' => 'Uppdatera album',
+		  'button_create_album' => 'Skapa album',
+		  'success' => 'UtfÃ¶rt!',
+		  'error_select_album' => 'VÃ€lj ett album fÃ¶rst',
+		  'error_album_name' => 'Namnge album',
+		  'error_album_already_exists' => 'Du har redan ett album med de namnet.<BR><BR>Klicka pÃ¥ <I>bÃ¥kÃ¥t</I> knappen i webblÃ€saren, fÃ¶r att vÃ€lja ett annat namn.',
+		  'album_name' => 'Album namn',
+		  'album_presentation' => 'Du mÃ¥ste vÃ€lja ett album hÃ€r. Bilderna du laddar upp kommer sparas dÃ€r.<BR>Om du inte har ett album Ã€r listan tom. AnvÃ€nd \'Skapa\' kanppen fÃ¶r att gÃ¶ra ett.',
+		  'album_description' => 'Album fÃ¶rklaring',
+		  'add_pictures' => 'LÃ€gg till bilder i valt album',
+		  'max_upload_size' => 'StÃ¶rsta godkÃ€nda storleken Ã€r $1 KB',
+		  'upload_presentation' => 'Om rutan nedanfÃ¶r inte visar appleten och webblÃ€saren visar att det finns fel mÃ¥ste du installera en Java plugin<BR><BR> FÃ¶r att anvÃ€nda den <U>gamla sidan</U>, <a href="upload.php">tryck hÃ€r</a>.',
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Din webblÃ€sare saknar Java, gÃ¥r att ladda ner frÃ¥n <a href="http:\\java.sun.com\jre\">http:\\java.sun.com\jre</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicka pÃ¥ lÃ€nken och fyll i fÃ€lten nedanfÃ¶r. Om du vill att de ska gÃ€lla fÃ¶r alla filer nÃ€sta uppladdning.',
+		  'quota_used' => 'Du anvÃ€nder fÃ¶rnÃ€rvarande $1 MB ($2%) av $3 MB.',
+		  'quota_about_full' => 'Du mÃ¥ste frigÃ¶ra minne, din kvot Ã€r fylld.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/dutch.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/dutch.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/dutch.php	(revision 3951)
@@ -0,0 +1,71 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+
+// File jupload.php
+
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'U heft niet voldoende rechten voor deze actie.<BR><BR>Gelieve eerst in te loggen: <a href="$1">login</a>',
+		  'select_album' => 'Selecteer een album waar u de nieuwe bestanden wilt plaatsen',
+		  'button_update_album' => 'Album bijwerken',
+		  'button_create_album' => 'Album aanmaken',
+		  'success' => 'Gereed !',
+		  'error_select_album' => 'Selecteer eerst een album',
+		  'error_album_name' => 'Geef het album eerst een naam.',
+		  'error_album_already_exists' => 'Deze naam is reeds in gebruik. <BR><BR>Druk op de <I>Terug</I> knop van uw browser, en voer een nieuwe naam in.',
+		  'album_name' => 'Album naam',
+		  'album_presentation' => 'U dient hier een album te selecteren. De geselecteerde afbeeldingen zullen aan dit album worden toegevoegd. <BR>Middels de knop \'Album aanmaken\' kunt u nieuwe albums aanmaken.',
+		  'album_description' => 'Album omschrijving',
+		  'add_pictures' => 'Afbeeldingen toevoegen aan het geselecteerde album',
+		  'max_upload_size' => 'De maximale bestandsgrootte is $1 Ko',
+		  'upload_presentation' => 'Als de applet niet weergegeven wordt, kan dit verholpen worden door de java runtime plugin te installeren.<BR>Vervolgens is uploaden zeer eenvoudig! Klik op <B>Bladeren</B> om bestanden te selecteren of gebruik de drag\'n\'drop functionaliteit van de verkenner. Klik vervolgens op <B>Upload</B> om afbeeldingen naar de server te verznden.'
+		  	. "<BR>Om de originele <u>upload-functionaliteit</u> te gebruiken, <a href='upload.php'>klik hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_sie.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_sie.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_sie.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Sie haben keine Berechtigung diesen Vorgang durchzufÃŒhren.<BR><BR>Bitte <a href="$1">melden</a> Sie sich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hlen Sie ein Album, in welches Sie Dateien hochladen mÃ¶chten',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erstellen',
+		  'success' => 'Vorgang erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte geben Sie dem Album einen Namen.',
+		  'error_album_already_exists' => 'Sie haben bereits ein Album mit diesem Namen.<BR><BR>Bitte klicken Sie auf den <I>ZurÃŒck</I> Button ihres Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hlen Sie ein Album. Die Dateien, die Sie hochladen mÃ¶chten, werden in diesem Album gespeichert. <BR>Wenn Sie noch kein Album erstellt haben, dann benutzen Sie bitte die \'Album erzeugen\' Funktion um ihr erstes Album zu erstellen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem Album hinzufÃŒgen.',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 KB',
+		  'upload_presentation' => 'Wenn die untere Box leer bleibt und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfen Sie bitte ob Sie die neueste Version des Java runtime plugins installiert haben.<BR> Um Dateien hochzuladen klicken Sie auf <B>Durchsuchen</B> und wÃ€hlen Sie die Dateien aus oder fÃŒgen Sie diese per drag\'n\'drop aus ihrem Ordner ein. AnschlieÃend klicken Sie bitte auf <B>Hochladen</B> um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte</U> Datei hochladen-Funktion zu nutzen, klicken Sie bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ihr Browser erlaubt kein java. Das Jupload Applet braucht java. Sie kÃ¶nnen es unter <a href="http:\\java.sun.com\jre\">java web site</a> kostenlos herunterladen',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicken Sie auf diesen Link und geben Sie die gewÃŒnschten Daten in die Felder ein wenn Sie sie zu allen Bildern des nÃ€chsten Uploads hinzufÃŒgen mÃ¶chten.',
+		  'quota_used' => 'Sie nutzen momentan $1 MB ($2%) von maximal $3 MB Speicher.',
+		  'quota_about_full' => 'Entfernen Sie einige Bilder oder bitten Sie den Administrator Ihren Speicherplatz zu erhÃ¶hen.',
+		  //Since 3.2.0
+		  'need_approval' => 'Der Galerieadministrator muss die hochgeladenen Bilder genehmigen und freischalten, bevor sie gesehen werden kÃ¶nnen.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_formal.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_formal.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german_formal.php	(revision 3951)
@@ -0,0 +1,68 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Sie haben keine Berechtigung diesen Vorgang durchzufÃŒhren.<BR><BR>Bitte <a href="$1">melden</a> Sie sich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hlen Sie ein Album, in welches Sie Dateien hochladen mÃ¶chten',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erstellen',
+		  'success' => 'Aktion erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte geben Sie dem Album einen Namen.',
+		  'error_album_already_exists' => 'Sie haben bereits ein Album mit diesem Namen.<BR><BR>Bitte klicken Sie auf den <I>ZurÃŒck</I> Button ihres Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hlen Sie hier ein Album aus. Die Datei, die Sie hochladen mÃ¶chten, wird in diesem Album gespeichert. <BR>Wenn Sie noch kein Album erstellt haben, dann ist diese Liste leer. Benutzen Sie dann die \'Album erstellen\' Funktion um ihr erstes Album zu erzeugen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem ausgewÃ€hlten Album hinzufÃŒgen.',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 Ko',
+		  'upload_presentation' => 'Wenn in der unteren Box nichts angezeigt wird und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfen Sie bitte ob Sie die neueste Version des Java runtime plugins installiert haben.<BR>Danach gestaltet sich der Upload-Vorgang wesentlich komfortabler! Klicken Sie auf <B>Durchsuchen</B> um die Dateien auszuwÃ€hlen oder fÃŒgen Sie die Dateien per drag\'n\'drop aus ihrem Ordner ein. AnschlieÃend klicken Sie bitte auf <B>Hochladen</B> um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte Datei hochladen-Funktion</U> zu nutzen, klicken Sie bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/german.php	(revision 3951)
@@ -0,0 +1,67 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File german.php
+// ------------------------------------------------------------------------- //
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Du hast keine Berechtigung fÃŒr diesen Vorgang.<BR><BR>Bitte <a href="$1">melde</a> Dich zuerst an.',
+		  'select_album' => 'Bitte wÃ€hle ein Album aus, in das Du Dateien hochladen mÃ¶chtest',
+		  'button_update_album' => 'Album aktualisieren',
+		  'button_create_album' => 'Album erzeugen',
+		  'success' => 'Vorgang erfolgreich!',
+		  'error_select_album' => 'Bitte zuerst ein Album auswÃ€hlen',
+		  'error_album_name' => 'Bitte gib dem Album einen Namen.',
+		  'error_album_already_exists' => 'Du hast bereits ein Album mit diesem Namen.<BR><BR>Bitte klicke auf den <I>ZurÃŒck</I> Button Deines Browsers um einen anderen Titel zu wÃ€hlen.',
+		  'album_name' => 'Album Titel',
+		  'album_presentation' => 'Bitte wÃ€hle ein Album aus. Die Dateien, die Du hochladen mÃ¶chtest, werden in diesem Album gespeichert. <BR>Wenn Du noch kein Album erstellt hast, dann benutze bitte die \'Album erzeugen\' Funktion um Dein erstes Album zu erstellen.',
+		  'album_description' => 'Album Beschreibung',
+		  'add_pictures' => 'Dateien dem Album hinzufÃŒgen',
+		  'max_upload_size' => 'Die maximal zulÃ€ssige GrÃ¶Ãe einer Datei betrÃ€gt $1 KB',
+		  'upload_presentation' => 'Wenn die unteren Box leer bleibt und/oder der Browser einen Fehler auf der Seite anzeigt, dann prÃŒfe bitte, ob Du die neueste Version des Java runtime plugins installiert hast.<BR>Um Dateien hochzuladen klicke auf <B>Durchsuchen</B> und wÃ€hle die Dateien aus oder fÃŒge sie per drag\'n\'drop aus Deinem Ordner ein. AnschlieÃend auf <B>Hochladen</B> klicken um die Dateien an den Server zu ÃŒbertragen.'
+		  	. "<BR>Um die <U>alte</U> Datei hochladen-Funktion zu nutzen, klicke bitte <a href='upload.php'>hier</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Dein Browser erlaubt kein java. Das Jupload Applet braucht java. Du kannst es unter <a href="http:\\java.sun.com\jre\">java web site</a> kostenlos herunterladen',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klicke auf diesen Link und gib die gewÃŒnschten Daten in die Felder ein wenn Du sie zu allen Bildern des nÃ€chsten Uploads hinzufÃŒgen mÃ¶chtest.',
+		  'quota_used' => 'Du nutzt momentan $1 MB ($2%) von maximal $3 MB Speicher.',
+		  'quota_about_full' => 'Entferne einige Bilder oder bitte den Administrator Deinen Speicherplatz zu erhÃ¶hen.',
+		  //Since 3.2.0
+		  'need_approval' => 'Der Galerieadministrator muss die hochgeladenen Bilder genehmigen und freischalten, bevor sie gesehen werden kÃ¶nnen.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hebrew.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hebrew.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hebrew.php	(revision 3951)
@@ -0,0 +1,80 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => '××¢×××ª ×§××Š×× ××××š××× ××¢××š×ª ××©××××',
+		  'perm_denied' => '××× ×× ××š×©×× ××××Š××¢ ×€×¢××× ××.<BR /><BR />×× ××× × ×××××š, × ×¡× <a href="$1">×××ª×××š</a> ×ª××××.',
+		  'select_album' => '×× × ×××š ××××× ××××¡×× ××ª××× ××ª.',
+		  'button_update_album' => '×¢××× ×××××',
+		  'button_create_album' => '××Š××š×ª ××××× ×××©',
+		  'success' => '×€×¢××× ××Š××××!',
+		  'error_select_album' => '×× × ×××š ××××× ×ª××××',
+		  'error_album_name' => '×× × ×ª× ×××××× ×©×.',
+		  'error_album_already_exists' => '×××š ×§××× ××××× ×¢× ×©× ××.<BR /><BR />×× × ×××¥ ×¢× <I>××××š×</I> ×××€××€× ××××š ×©× ×××š ×××××× ××.',
+		  'album_name' => '×©× ××××××',
+		  'album_presentation' => '××ª× ××××š× ×××××š ×××××. ××ª××× ××ª ×©×ª×©×× ××©×š×ª ×××××¡× × ×××××× ××.<BR />×× ×× ×§××××× ×××××××, ××š×©××× ×ª××× ×š××§×. ×××¥ ×¢× \'××Š××š×ª ××××× ×××©\' ×ª××××.',
+		  'album_description' => '×ª××××š ××××××',
+		  'add_pictures' => '×××¡×£ ×ª××× ××ª ×××××× ×× ×××š',
+		  'max_upload_size' => '××××× ×××§×¡×××× ××ª××× × ××× × $1 KB',
+		  'upload_presentation' => '×× ××š××××¢ ×××× ××× × ××Š×× ××ª ×××©××××, ××××€××€× ×××××¢ ×¢× ×©×××××ª ××¢××× ××, ×× ×š×× ×©× ××š×©×ª ××ª×§× × ×©× java runtime plugin.<BR />××××š ×××, ××¢×××ª ××ª××× ××ª ×××© ×€×©×××! ×××¥ ×¢× <B>×¢×××</B> ××××š ××ª ××§××Š×× ××š×Š×××× ×× ××š××š ×××ª× ×× ×××©×××× ××× ×××× ×××š. ××××Š× ×¢× <B></B> ×ª×©×× ×××ª× ×× ××©×š×ª.'
+		. "<BR />×× ××š×Š×× × ×××©×ª××© ×<U>×××©×§ ×××¢××× ×××©×</U>, <a href='upload.php'>×××¥ ×××</a>.",
+		  'album' => '×××××',
+		  //Since 2.1.0
+		  'java_not_enabled' => '×××€××€× ×©×× ××× × ×××€×©×š java. ××©×××× ×××¢××× ××××× ×©××××© ×- java. × ××ª× ××€×ª××š ×××ª ××§×××ª ×¢× ××× ××ª×§× × ×-  <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => '×××¥ ×¢× ×§××©××š ×× ×××× ××ª ××©×××ª ×××× ×× ××š×Š×× × ××××× ×©×× ×××× ××× ×¢× ××€×¢× ×××× ×× ×ª×¢×× ×§××Š××',
+		  'quota_used' => '××ª× ×× ×Š× ××¢×ª $1 MB ($2%) ××ª×× $3 MB ×©×××§×Š× ×× ××××¡××.',
+		  'quota_about_full' => '×××§ ×ª××× ××ª ×× ××§×© ××× ×× ×××ª×š ×××§×Š××ª ×× ×××ª×š ××§×× ×××¡××.',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
+
+
+
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hungarian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hungarian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/hungarian.php	(revision 3951)
@@ -0,0 +1,74 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+ 
+ //     Hungarian translation:
+ //     GÃ¡bor RÃ©zsÃ³
+ //     gabor.rezso at gmail dot com
+ 
+// ------------------------------------------------------------------------- //
+// File hungarian.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload-KÃ©p FeltÃ¶ltÃ©s+',
+		  'link_comment' => 'KÃ©pek feltÃ¶ltÃ©se a galÃ©riÃ¡ba',
+		  'perm_denied' => 'Nincs megfelelÅ jogosultsÃ¡god.<BR><BR>Ha nem vagy belÃ©pve, <a href="$1">itt</a> megteheted',
+		  'select_album' => 'VÃ¡lassz albumot, ahova a kÃ©peket tÃ¶ltenÃ©d',
+		  'button_update_album' => 'Album frissÃ­tÃ©se',
+		  'button_create_album' => 'Album lÃ©trehozÃ¡sa',
+		  'success' => 'Sikeres mÅ±velet!',
+		  'error_select_album' => 'KÃ©rlek, elÅszÃ¶r vÃ¡lassz albumot',
+		  'error_album_name' => 'KÃ©rlek, elÅszÃ¶r adj nevet az albumnak.',
+		  'error_album_already_exists' => 'MÃ¡r van ilyen nevÅ± album.<BR><BR>KLikk a <I>vissza</I> nyilra, Ãºj album nÃ©v megadÃ¡sÃ¡hoz.',
+		  'album_name' => 'Album nÃ©v',
+		  'album_presentation' => 'VÃ¡lassz albumot. A feltÃ¶ltÃ¶tt kÃ©pek . <BR>Ha nincs mÃ©g album lÃ©trehozva, a lista ÃŒres. Az Ãj album gomra kattintva hozhatod lÃ©tre elsÅ albumodat.',
+		  'album_description' => 'Album leÃ­rÃ¡s',
+		  'add_pictures' => 'KÃ©pek feltÃ¶ltÃ©se a kijelÃ¶lt albumba',
+		  'max_upload_size' => 'A kÃ©pek maximÃ¡lis mÃ©rete 1 KB',
+		  'upload_presentation' => 'Ha az alÃ¡bbi nÃ©gyzetben nem tÃ¶ltÅdik be a program, ill a bÃ¶ngÃ©szÅ hibaÃŒzenetet jelenÃ­t meg, ajÃ¡nlatos ÃºjratelepÃ­teni a java runtime plugin -t.<BR>A feltÃ¶ltÃ©s, sokkal gyorsabb Ã©s kÃ¶nnyebb! Klikk <B>TallÃ³z</B> kÃ©pek kivÃ¡lasztÃ¡sÃ¡hoz vagy hÃºzd bele a kÃ©peket az egÃ©rrel az intÃ©zÅbÅl, majd klikk <B>FeltÃ¶lt</B> gombra a feltÃ¶ltÃ©s elindÃ­tÃ¡sÃ¡hoz.'
+		. "<BR>a <U>rÃ©gi feltÃ¶ltÃ©si mÃ³d</U>, hasznÃ¡latÃ¡hoz <a href='upload.php'>Klikk ide</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Klikk ide Ã©s add meg az alapvetÅ kÃ©p informÃ¡ciÃ³kat ha minden most feltÃ¶ltÃ¶tt kÃ©pre szeretnÃ©d alkalmazni azokat.',
+		  'quota_used' => 'Jelenleg $1 MB ($2%) tÃ¡rhelyet hasznÃ¡lsz, a rendelkezÃ©sre Ã¡llÃ³ $3 MB -bÃ³l.',
+		  'quota_about_full' => 'TÃ¶rÃ¶lj pÃ¡r kÃ©pet vagy bÅvÃ­tsd a tÃ¡rhelyet.',
+		  //Since 3.2.0
+		  'need_approval' => 'A galÃ©ria adminisztrÃ¡torÃ¡nak engedÃ©lyeznie kell a feltÃ¶ltÃ©st, mielÅtt megjelenne a galÃ©riÃ¡ban.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/arabic.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/arabic.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/arabic.php	(revision 3951)
@@ -0,0 +1,140 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// Maintainer: "Abdulrhman Alkhodiry" <almooheb@gmail.com>  
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'Ø¬Ù Ø§ØšÙÙØ¯',
+		  'link_comment' => 'Ø±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹, ØšØ³ØªØ®Ø¯Ø§Ù
+ Ø¬Ù Ø§ØšÙÙØ¯',
+		  'perm_denied' => 'ÙÙØ³Øª ÙØ¯ÙÙ Ø§ÙØµÙØ§Ø­ÙØ© ÙØªÙÙÙØ° ÙØ°Ø§ Ø§ÙØ§Ù
+Ø±.<BR><BR>Ø§Ø°Ø§ ÙÙ
+ ØªØ³Ø¬Ù Ø§ÙØ¯Ø®ÙÙ, Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ø¬ÙÙ <a href="$1">Ø§ÙØ¯Ø®ÙÙ</a> Ø§ÙÙØ§',
+		  'select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+, Ø§ÙØ°Ù Ø³ØªÙÙÙ
+ ØšØ±ÙØ¹ Ø§ÙØµÙØ± Ø¥ÙÙÙ',
+		  'button_update_album' => 'ØªØ­Ø¯ÙØ« Ø§ÙØ§ÙØšÙÙ
+',
+		  'button_create_album' => 'Ø§ÙØŽØ§Ø¡ Ø§ÙØ§ÙØšÙÙ
+',
+		  'success' => 'ØªÙ
+ Ø§ÙØªÙÙÙØ° ØšÙØ¬Ø§Ø­ !',
+		  'error_select_album' => 'Ø§ÙØ±Ø¬Ø§Ø¡, Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙØ§',
+		  'error_album_name' => 'Ø§ÙØ±Ø¬Ø§Ø¡ ØªØ³Ù
+ÙØ© Ø§ÙØ§ÙØšÙÙ
+.',
+		  'error_album_already_exists' => 'ÙÙØ¬Ø¯ Ø§ÙØšÙÙ
+ ØšÙØ§Ø°Ø§ Ø§ÙØ§Ø³Ù
+.<BR><BR>Ø§ÙØ±Ø¬Ø§Ø¡ Ø§ÙØ±Ø¬ÙØ¹ Ø§ÙÙ <I>Ø§ÙØ®ÙÙ</I> ØšØ§ÙÙ
+ØªØµÙØ­ ÙØ§Ø®ØªÙØ§Ø± Ø§Ø³Ù
+ Ø¢Ø®Ø± ÙÙØ§ÙØšÙÙ
+.',
+		  'album_name' => 'Ø§Ø³Ù
+ Ø§ÙØ§ÙØšÙÙ
+',
+		  'album_presentation' => 'ÙØ¬Øš Ø¹ÙÙÙ Ø§Ø®ØªÙØ§Ø± Ø§ÙØ§ÙØšÙÙ
+. Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±Ø³Ù Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹ Ø³ÙØªÙ
+ ØªØ®Ø²ÙÙÙØ§ ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯. <BR>Ø§Ø°Ø§ ÙØ§Ù ÙØ§ ÙÙØ¬Ø¯ ÙØ¯ÙÙ Ø§Ù Ø¥ÙØšÙÙ
+, ÙØ§ØŠÙ
+Ø© Ø§ÙØ§ÙØšÙÙ
+Ø§Øª Ø®Ø§ÙÙØ©. Ø§ÙÙØ± Ø¹ÙÙ \'Ø§ÙØŽØ§Ø¡\' button to create your first album.',
+		  'album_description' => 'ÙØµÙ Ø§ÙØ§ÙØšÙÙ
+',
+		  'add_pictures' => 'Ø§Ø¶Ø§ÙØ© ØµÙØ±Ø© Ø§ÙÙ Ø§ÙØ§ÙØšÙÙ
+ Ø§ÙÙ
+Ø­Ø¯Ø¯',
+		  'max_upload_size' => 'Ø§ÙØ­Ø¬Ù
+ Ø§ÙØ§ÙØµÙ ÙÙØµÙØ±Ø© ÙÙ $1 KB',
+		  'upload_presentation' => 'Ø§Ø°Ø§ Ø§ÙÙ
+Ø±ØšØ¹ ØšØ§ÙØ§Ø³ÙÙ ÙØ§ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§, ÙØŽØ±ÙØ· Ø§ÙØ­Ø§ÙØ© ØšØ§ÙØ§Ø³ÙÙ ÙÙØ¶Ø­ ÙØ¬ÙØ¯ Ø®Ø·Ø£, Ø§ÙØ­Ù Ø§ÙØ§ÙØ¶Ù ÙÙ ØªØ«ØšÙØª Ù
+ÙÙØ§Øª Ø§ÙØ¬Ø§ÙØ§.<BR>ØšØ¹Ø¯ Ø°ÙÙ, Ø±ÙØ¹ Ø§ÙØµÙØ± ÙÙÙ
+ÙÙØ¹ Ø³ÙÙ Ø¬Ø¯Ø§! ÙÙØ· ÙÙ
+ ØšØ§ÙÙÙØ± Ø¹ÙÙ <B>Ø§Ø³ØªØ¹Ø±Ø§Ø¶</B> ÙØ§Ø®ØªÙØ§Ø± Ø§ÙÙ
+ÙÙØ§Øª Ø§Ù ÙÙ
+ ØšØ³Ø­Øš Ø§ÙÙ
+ÙÙ Ù Ø§ÙÙØ§Ø¡Ù Ø¹ÙÙ Ø§ÙÙ
+Ø³ØªØ¹Ø±Ø¶ , Ø«Ù
+ Ø§ÙÙØ± Ø¹ÙÙ <B>Ø±ÙØ¹ Ø§ÙÙ
+ÙÙØ§Øª</B> ÙØ±ÙØ¹ Ø§ÙØµÙØ± Ø§ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		. "<BR>ÙØ³ØªØ®Ø¯Ø§Ù
+ <U>ØµÙØ­Ø© Ø§ÙØ±ÙØ¹ Ø§ÙÙØ¯ÙÙ
+Ø©</U>, <a href='upload.php'>Ø§Ø¶ØºØ· ÙÙØ§</a>.",
+		  'album' => 'Ø§ÙØšÙÙ
+ Ø§ÙØµÙØ±',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Ø§ÙÙ
+ØªØµÙØ­ ÙØ§ ÙØ³ØªØ·ÙØ¹ Ø¹Ø±Ø¶ ØšØ±Ø§Ù
+Ø¬ Ø§ÙØ¬Ø§ÙØ§ _ Ø§ØšÙÙØª. ØšØ±ÙØ§Ù
+Ø¬ Ø§ÙØ±ÙØ¹ ÙØ­ØªØ§Ø¬ Ø¬Ø§ÙØ§. ØªØ³ØªØ·ÙØ¹ ØªØ­Ù
+ÙÙ Ù
+ØŽØºÙ Ø§ÙØ¬Ø§ÙØ§ ØšØ³ÙÙÙØ© Ù
+Ù <a href="http:\\java.sun.com\jre\">Ù
+ÙÙØ¹ Ø¬Ø§ÙØ§</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Ø§Ø¶ØºØ· Ø¹ÙÙ Ø§ÙØ±Ø§ØšØ·, ÙÙÙ
+ ØšØ£Ø¯Ø®Ø§Ù Ø§ÙØšÙØ§ÙØ§Øª ÙÙ Ø§ÙØ§Ø³ÙÙ, Ø§Ø°Ø§ Ø§Ø±Ø¯Øª Ø­ÙØž Ø§ÙØšÙØ§ÙØ§Øª ÙÙÙ Ø§ÙØµÙØ± Ø§ÙØªÙ Ø³ØªØ±ÙØ¹.',
+		  'quota_used' => 'Ø§ÙØª ØªØ³ØªØ®Ø¯Ù
+ $1 MB ($2%) Ù
+Ù $3 MB Ø§ÙÙ
+Ø³Ø§Ø­Ø© Ø§ÙØ§Ø¬Ù
+Ø§ÙÙØ©.',
+		  'quota_about_full' => 'Ø§Ø­Ø°Ù ØšØ¹Ø¶ Ø§ÙØµÙØ±, Ø§Ù ÙÙ
+ ØšØ·ÙØš Ø²ÙØ§Ø¯Ø© Ø§ÙÙ
+Ø³Ø§Ø­Ø© ÙÙÙ
+ÙÙØ¹ Ù
+Ù Ø§ÙØŽØ±ÙØ© Ø§ÙÙ
+Ø³ØªØ¶ÙÙØ©.',
+		  //Since 3.2.0
+		  'need_approval' => 'ÙÙ Ø§ÙØªØžØ§Ø± Ù
+ÙØ§ÙÙØ© Ù
+Ø¯ÙØ± Ø§ÙÙ
+ÙÙØ¹ Ø¹ÙÙ Ø§ÙØµÙØ±, ÙØšÙ Ø§Ù ØªØ³ØªØ·ÙØ¹ Ø±Ø£ÙØªÙÙ
+ ÙÙ Ø§ÙÙ
+ÙÙØ¹.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/italian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/italian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/italian.php	(revision 3951)
@@ -0,0 +1,70 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'JUpload',
+		  'link_comment' => 'Pubblicazione di files nella galleria con l\'aiuto di un\'applet',
+		  'perm_denied' => 'Non hai il permesso per eseguire questa operazione.<BR><BR>Se non sei connesso per favore esegui prima il <a href="$1">login</a> ',
+		  'select_album' => 'Scegli l\'album dove postare le tue immagini',
+		  'button_update_album' => 'Aggiorna album',
+		  'button_create_album' => 'Crea album',
+		  'success' => 'Azione eseguita !',
+		  'error_select_album' => 'Per favore scegli prima un album',
+		  'error_album_name' => 'Inserisci il nome dell\'album',
+		  'error_album_already_exists' => 'Esiste gi&#225; un album con questo nome.<BR><BR>Clicca sul tasto <I>Back</I> del tuo browser, e scegli un\'altro nome.',
+		  'album_name' => 'Nome dell\'album',
+		  'album_presentation' => 'Puoi selezionare un\'album. Le immagini che invierai al server saranno salvate in questo album. <BR>Non hai nessun album, la lista album &#232 vuota. Usa il bottone \'Create\' per creare il tuo primo album.',
+		  'album_description' => 'Descrizione album',
+		  'add_pictures' => 'Aggiungi immagini nell\'album selezionato',
+		  'max_upload_size' => 'La massima dimensione delle immagini &#232 $1 Ko',
+		  'upload_presentation' => 'Se il riquadro in basso non visualizza l\'applet e il vostro browser segnala un errore nella pagina dovrete installare le runtime Java.<BR>Dopo, la pubblicazione sar&#225; molto semplice! Clicca su <B>Browse</B> per selezionare i files o usa Copia e Incolla da explorer, cilicca su <B>Upload</B> per inviare le immagini al server.'
+		. "<BR>Per usare <U>la vecchia pagina di upload </U>, <a href='upload.php'>clicca qui</a>.",
+		  'album' => 'Album',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_big5.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_big5.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_big5.php	(revision 3951)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/russian.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/russian.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/russian.php	(revision 3951)
@@ -0,0 +1,72 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'Ð£ ÐÐ°Ñ ÐœÐµÑ Ð¿ÑÐ°Ð² ÐœÐ° Ð²ÑÐ¿ÐŸÐ»ÐœÐµÐœÐžÐµ ÑÑÐŸÐ¹ ÐŸÐ¿ÐµÑÐ°ÑÐžÐž.<br /><br />ÐÑÐ»Ðž Ð²Ñ ÐœÐµ Ð°Ð²ÑÐŸÑÐžÐ·ÐŸÐ²Ð°ÐœÑ, Ð¿ÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° <a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">Ð°Ð²ÑÐŸÑÐžÐ·ÑÐ¹ÑÐµÑÑ</a>.',
+		  'select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ, Ð² ÐºÐŸÑÐŸÑÑÐ¹ Ð²Ñ Ñ
+ÐŸÑÐžÑÐµ ÐŽÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž.',
+		  'button_update_album' => 'ÐÐ±ÐœÐŸÐ²ÐžÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'button_create_album' => 'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'success' => 'ÐÐŸÑÐŸÐ²ÐŸ!',
+		  'error_select_album' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÑÐœÐ°ÑÐ°Ð»Ð° Ð²ÑÐ±ÐµÑÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_name' => 'ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, ÐœÐ°Ð·ÐŸÐ²ÐžÑÐµ Ð°Ð»ÑÐ±ÐŸÐŒ.',
+		  'error_album_already_exists' => 'Ð£ ÐÐ°Ñ ÑÐ¶Ðµ ÐµÑÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ Ñ ÑÐ°ÐºÐžÐŒ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµÐŒ.<br /><br />ÐÐŸÐ¶Ð°Ð»ÑÐ¹ÑÑÐ°, <a href="javascript:history.back()">Ð²ÐµÑÐœÐžÑÐµÑÑ ÐœÐ° Ð¿ÑÐµÐŽÑÐŽÑÑÑÑ ÑÑÑÐ°ÐœÐžÑÑ (ÐžÐ»Ðž ÐœÐ°Ð¶ÐŒÐžÑÐµ <i>ÐÐ°Ð·Ð°ÐŽ</i> Ð² ÐœÐ°Ð²ÐžÐ³Ð°ÑÐŸÑÐµ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°) Ðž ÐŽÐ°Ð¹ÑÐµ ÐŽÑÑÐ³ÐŸÐµ ÐœÐ°Ð·Ð²Ð°ÐœÐžÐµ ÐÐ°ÑÐµÐŒÑ ÐœÐŸÐ²ÐŸÐŒÑ Ð°Ð»ÑÐ±ÐŸÐŒÑ.',
+		  'album_name' => 'ÐÐ°Ð·Ð²Ð°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'album_presentation' => 'ÐÐŽÐµÑÑ ÐÑ ÐŽÐŸÐ»Ð¶ÐœÑ Ð²ÑÐ±ÑÐ°ÑÑ Ð°Ð»ÑÐ±ÐŸÐŒ. ÐÐ°ÑÑÐžÐœÐºÐž, ÐºÐŸÑÐŸÑÑÐµ Ð²Ñ Ð±ÑÐŽÐµÑÐµ Ð·Ð°Ð³ÑÑÐ¶Ð°ÑÑ ÐœÐ° ÑÐµÑÐ²ÐµÑ, Ð±ÑÐŽÑÑ ÑÐŸÑ
+ÑÐ°ÐœÐµÐœÑ Ð² ÑÑÐŸÐŒ Ð°Ð»ÑÐ±ÐŸÐŒÐµ.<br />ÐÑÐ»Ðž Ñ ÐÐ°Ñ ÐµÑÐµ ÐœÐµÑ Ð°Ð»ÑÐ±ÐŸÐŒÐŸÐ², ÑÐ¿ÐžÑÐŸÐº Ð¿ÑÑÑÐŸÐ¹. ÐÐ°Ð¶ÐŒÐžÑÐµ \'Ð¡ÐŸÐ·ÐŽÐ°ÑÑ\' ÐŽÐ»Ñ ÑÐŸÐ·ÐŽÐ°ÐœÐžÑ ÐœÐŸÐ²ÐŸÐ³ÐŸ Ð°Ð»ÑÐ±ÐŸÐŒÐ°.',
+		  'album_description' => 'ÐÐ¿ÐžÑÐ°ÐœÐžÐµ Ð°Ð»ÑÐ±ÐŸÐŒÐ°',
+		  'add_pictures' => 'ÐÐŸÐ±Ð°Ð²ÐžÑÑ ÐºÐ°ÑÑÐžÐœÐºÐž Ð² Ð²ÑÐ±ÑÐ°ÐœÐœÑÐ¹ Ð°Ð»ÑÐ±ÐŸÐŒ',
+		  'max_upload_size' => 'ÐÐ°ÐºÑÐžÐŒÐ°Ð»ÑÐœÑÐ¹ ÑÐ°Ð·ÐŒÐµÑ ÑÐ°Ð¹Ð»Ð° ÐºÐ°ÑÑÐžÐœÐºÐž $1 ÐÐ±',
+		  'upload_presentation' => 'ÐÑÐ»Ðž ÐŸÐ±Ð»Ð°ÑÑÑ ÑÐºÑÐ°ÐœÐ° ÐœÐžÐ¶Ðµ ÐŸÐŽÐœÐŸÐ·ÐœÐ°ÑÐœÐŸ ÐŸÑÐºÐ°Ð·ÑÐ²Ð°ÐµÑÑÑ ÐŸÑÐŸÐ±ÑÐ°Ð¶Ð°ÑÑ Ð°Ð¿Ð¿Ð»ÐµÑ Ðž Ð±ÑÐ°ÑÐ·ÐµÑ ÑÐŸÐŸÐ±ÑÐ°ÐµÑ ÐŸÐ± ÐŸÑÐžÐ±ÐºÐ°Ñ
+ ÐœÐ° ÑÑÑÐ°ÐœÐžÑÐµ, Ð¿ÐŸÐ¿ÑÐŸÐ±ÑÐ¹ÑÐµ ÑÑÑÐ°ÐœÐŸÐ²ÐžÑÑ Ð¿Ð»Ð°Ð³ÐžÐœ <a href="http://java.sun.com/" target="_blank">Java&#8482;</a> ÐŽÐ»Ñ Ð²Ð°ÑÐµÐ³ÐŸ Ð±ÑÐ°ÑÐ·ÐµÑÐ°.<br />ÐÐŸÑÐ»Ðµ ÑÑÐŸÐ³ÐŸ Ð·Ð°Ð³ÑÑÐ·ÐºÐ° ÐºÐ°ÑÑÐžÐœÐŸÐº Ð±ÑÐŽÐµÑ ÐœÐ°ÐŒÐœÐŸÐ³ÐŸ Ð¿ÑÐŸÑÐµ! ÐÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ±Ð·ÐŸÑ</b>, ÑÑÐŸÐ±Ñ Ð²ÑÐ±ÑÐ°ÑÑ ÑÐ°Ð¹Ð»Ñ, ÐžÐ»Ðž ÐžÑÐ¿ÐŸÐ»ÑÐ·ÑÐ¹ÑÐµ drag\'n\'drop ÐžÐ· Explorer\'Ð°, Ð·Ð°ÑÐµÐŒ ÐœÐ°Ð¶ÐŒÐžÑÐµ <b>ÐÐ°Ð³ÑÑÐ·ÐžÑÑ</b> ÑÑÐŸÐ±Ñ ÐŸÑÐ¿ÑÐ°Ð²ÐžÑÑ ÑÐ°Ð¹Ð»Ñ ÐœÐ° ÑÐµÑÐ²ÐµÑ.'
+		        . '<br />ÐÐŸÑÐ¿ÐŸÐ»ÑÐ·ÐŸÐ²Ð°ÑÑÑÑ <u>ÑÑÐ°ÑÑÐŒ ÑÐ¿ÐŸÑÐŸÐ±ÐŸÐŒ Ð·Ð°Ð³ÑÑÐ·ÐºÐž</u> ÐÑ ÐŒÐŸÐ¶ÐµÑÐµ <a href="upload.php">Ð·ÐŽÐµÑÑ</a>.',
+		  'album' => 'ÐÐ»ÑÐ±ÐŸÐŒ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_gb.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_gb.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/chinese_gb.php	(revision 3951)
@@ -0,0 +1,84 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Revision: 185 $
+ $Author: etienne_sf $
+ $Date: 2008-03-12 20:26:16 +0100 (mer., 12 mars 2008) $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'link_title' => 'æ¹æ¬¡äžå³',
+		  'link_comment' => 'äžå³å€§éæªæ¡è³çžç°¿ (çèŠœåšéæ¯æŽ Java Applet)',
+		  'perm_denied' => 'æ¬éäžè¶³ïŒ<BR><BR>è«å
+<a href="$1">ç»å
+¥çžç°¿</a>',
+		  'select_album' => 'è«å
+éžæçžç°¿',
+		  'button_update_album' => 'æŽæ°çžç°¿',
+		  'button_create_album' => 'å»ºç«çžç°¿',
+		  'success' => 'æäœå®æïŒ',
+		  'error_select_album' => 'çžç°¿æªéžæïŒè«å
+éžæçžç°¿',
+		  'error_album_name' => 'è«çºçžç°¿åœå',
+		  'error_album_already_exists' => 'çžç°¿åçš±å·²å­åšïŒ<BR><BR>è«æ<I>åäžé </I>èš­å®å
+¶å®çåçš±',
+		  'album_name' => 'çžç°¿åçš±',
+		  'album_presentation' => 'è«éžæçžç°¿ïŒæšäžå³çåæªå°æå­æŸåšéžæççžç°¿äž­<BR>è¥æšå°æªå»ºç«ä»»äœçžç°¿, è«æ\'å»ºç«\'æéäŸå»ºç«æšçç¬¬äžæ¬çžç°¿',
+		  'album_description' => 'çžç°¿æè¿°',
+		  'add_pictures' => 'å°åæªå å
+¥éžæççžç°¿',
+		  'max_upload_size' => 'æªæ¡å€§å°éå¶çº $1 KB',
+		  'upload_presentation' => 'è¥ Applet ç¡æ³é¡¯ç€º, äžæšççèŠœåšåå ±æ¬é çé¯èª€èšæ¯, è«å
+å®è£ Java å·è¡ç°å¢.<BR>ä¹åŸ, æšå°å¯ä»¥æŽæ¹äŸ¿å°äžå³æšçç
+§çïŒæäž<B>çèŠœ</B>éžææªæ¡, ææ¯çŽæ¥ææ³æ¬²äžå³çæªæ¡è³ Applet èŠçªäž­, äžŠæäž<B>äžå³</B>å®ææªæ¡äžå³çåäœ'
+		. "<BR>è¥æ³äœ¿çš<U>å³çµ±çäžå³ä»é¢</U>, <a href='upload.php'>è«æéè£¡</a>.",
+		  'album' => 'çžç°¿',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'æšççèŠœåšäžæ¯æŽ Java Applet. æ¬äžå³é é¢äœ¿çš Java Applet æè¡. è«è³<a href="http:\\java.sun.com\jre\"> Jave ç¶²ç«</a>äžèŒææ°çæ¬ç Java å·è¡ç°å¢',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'è¥æšæ³å°æ­€èš­å®åŒå¥çšè³ææçç
+§ç, è«é»éžé£çµäžŠåšè³ææ¬äœäž­èŒžå
+¥è³æ',
+		  'quota_used' => 'æšç®åå·²äœ¿çš $1/$3 MB ($2%) åäººç©ºé',
+		  'quota_about_full' => 'ç©ºéå·²æ»¿, è«ç§»é€äžäºç
+§ç, æåç®¡çå¡å°æ±åå©',
+		  //Last minute sentence :
+		  //Since 3.2.0
+		  'need_approval' => 'æªæ¡ç±ç®¡çè
+å¯©æ žäž­, åŸ
+å¯©æ žééåŸæšå°å¯åšçžç°¿äž­è§çææ°äžå³çæªæ¡.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/japanese.php
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/japanese.php	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.coppermine.utf-8/japanese.php	(revision 3951)
@@ -0,0 +1,73 @@
+<?php
+/*
+ *******************************************
+ plugin JUpload for Coppermine Photo Gallery
+ *******************************************
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+ ********************************************
+ $Source: $
+ $Revision: ?
+ $Author: etienne_sf $
+ $Date: $
+ ********************************************
+ *
+ * Allows easy upload to the gallery, through a java applet. 
+ * 
+ * Up to date version of this script can be retrieved with the full JUpload package, here:
+ * 
+ * http://etienne.sf.free.fr/wiki
+ * 
+ * Directly here:
+ * http://forum.coppermine-gallery.net/index.php/board,100.0.html
+ * 
+ * Support is available on this forum:
+ * http://coppermine-gallery.net/forum/index.php?topic=43432
+ * 
+ * The applet is published on sourceforge:
+ * http://jupload.sourceforge.net
+ * 
+ */
+
+
+
+// ------------------------------------------------------------------------- //
+// File jupload.php
+// ------------------------------------------------------------------------- //
+
+if (defined('JUPLOAD_PHP')) {
+	$lang_jupload_php = array_merge (
+		$lang_jupload_php,
+		array(
+		  'perm_denied' => 'å®è¡æš©éããããŸããã<BR><BR>æåã«<a href="login.php' . ( isset($_SERVER['PHP_SELF']) ? '?referer=' . $_SERVER['PHP_SELF'] : '') . '">ã­ã°ã€ã³</a>ããŠãã ããã',
+		  'select_album' => 'ç»åãä¿å­ããã¢ã«ãã ãéžæããŠãã ããã',
+		  'button_update_album' => 'ã¢ã«ãã æŽæ°',
+		  'button_create_album' => 'ã¢ã«ãã äœæ',
+		  'success' => 'åŠçæå !',
+		  'error_select_album' => 'æåã«ã¢ã«ãã ãéžæããŠãã ããã',
+		  'error_album_name' => 'ã¢ã«ãã ã®ååãå
+¥åããŠãã ããã',
+		  'error_album_already_exists' => 'åãååã®ã¢ã«ãã ããã§ã«å­åšããŠããŸãã<BR><BR>ãã©ãŠã¶ãŒã®<I>æ»ã</I>ãã¿ã³ãã¯ãªãã¯ããŠãéãååãå
+¥åããŠãã ããã',
+		  'album_name' => 'ã¢ã«ãã ã®åå',
+		  'album_presentation' => 'ã¢ã«ãã ãéžæããŠãã ãããã¢ããã­ãŒãããç»åã¯ãéžæããã¢ã«ãã ã«ä¿å­ãããŸãã<BR>ãªã¹ãã«ã¢ã«ãã ããªãå Žåã¯ãæåã« \'ã¢ã«ãã äœæ\' ãã¿ã³ãã¯ãªãã¯ããŠã¢ã«ãã ãäœæããŠãã ããã',
+		  'album_description' => 'ã¢ã«ãã ã®èª¬æ',
+		  'add_pictures' => 'éžæããã¢ã«ãã ã«ç»åãè¿œå ',
+		  'max_upload_size' => 'ç»åã®æå€§ãµã€ãºã¯ $1 KB ã§ã',
+		  'upload_presentation' => 'äžã«ã¢ãã¬ãããè¡šç€ºãããã«ãšã©ãŒãè¡šç€ºãããå Žåã¯ãJavaãã©ã°ã€ã³ãã€ã³ã¹ããŒã«ããŠãã ããã<BR>ã€ã³ã¹ããŒã«ããåŸã«ã¯ã <B>ãã¡ã€ã«ãéã</B> ãã¿ã³ãã¯ãªãã¯ããŠãã¡ã€ã«ãéžæãããããšã¯ã¹ãã­ãŒã©ãããã©ãã°ïŒãã­ããããŠã<B>ã¢ããã­ãŒã</B> ãã¿ã³ãã¯ãªãã¯ããããšã§ãµãŒãã«ãã¡ã€ã«ãã¢ããã­ãŒãã§ããŸãã'
+		  	. "<BR><U>old upload page</U>ãäœ¿çšããã«ã¯<a href='upload.php'>ãã</a>ãã¯ãªãã¯ããŠãã ããã",
+		  'album' => 'ã¢ã«ãã ',
+		  //Since 2.1.0
+		  'java_not_enabled' => 'Your navigator doesn\'t allow java. The upload applet need java. You can easily download it from the <a href="http:\\java.sun.com\jre\">java web site</a>',
+		  //Since 3.0.0
+		  'picture_data_explanation' => 'Click on this link, and enter data in the fields below, if you want these to be applied to all pictures in the next upload.',
+		  'quota_used' => 'You are currently using $1 MB ($2%) of your $3 MB of storage.',
+		  'quota_about_full' => 'Remove some pictures, or ask the admin to make your quota bigger.',
+		  //Since 3.2.0
+		  'need_approval' => 'The gallery admin must approve these uploaded pictures, before you can see them on the gallery.'
+		)
+	);
+}
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang_fr.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang_fr.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang_fr.properties	(revision 3951)
@@ -0,0 +1,7 @@
+#A specific comment for this file. Should be removed in the generated file.
+aKey = C'est une clef
+aLastKey = C'est une derniÃšre clef\nAvec un passage Ã  la ligne!
+
+# these line will go to the beginning of the file, after plugin execution.
+language = French (for test)
+contributor = The French contributor
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.utf-8/lang.properties	(revision 3951)
@@ -0,0 +1,15 @@
+#This is a comment
+#Another commented line
+
+language = English (for test)
+contributor = The English contributor
+
+aKey = This is a key.\
+With a new line in it, and with a \n character!
+
+anotherKey = This is another key.\
+Also with a new line in it, and also with a \n character!
+
+#A last comment
+
+aLastKey = this it the last key
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Portugese
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_da.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_da.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_da.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Danish
+contributor = Jeppe Bundsgaard
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = danish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = S\u00f8g ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter mod uret
+buttonRotateRight = Roter med uret
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Uploader filer %1$s
+infoUploaded = Filen/filerne %1$s er uploadet. Venter p\u00e5 serversvar ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d filer uploadet
+errDuringUpload = Upload stoppede med fejl
+errHttpResponse = Serverens HTTP-svar m\u00f8der ikke succeskriterierne. Uploaden fejlede.
+questionSendMailOnError = En fejl opstod under upload. Vil du sende al relevant information til webmasteren?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Mappe
+colModified = \u00c6ndret
+colReadable = L\u00e6sbar?
+errForbiddenExtension = Ulovlig fil endelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = En fejl opstod under log-h\u00e5ndteringen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6lg venligst et album f\u00f8rst.
+coppermineUploadOk = Billederne er blevet lagt op p\u00e5 serveren i det valgte album.\n\nKlik p\u00e5 Ok nu for at associere navne og kommentarer til disse billeder.\n\nGlem ikke at klikke p\u00e5 \u2018Udf\u00f8r \u00e6ndringer\u2019-knappen for at gemme dine \u00e6ndringer p\u00e5 serveren!
+
+#PictureFileData
+tooBigPicture = Billedet '%1$s' er for stort. Det bliver uploadet u\u00e6ndret (ingen rotation, st\u00f8rrelses\u00e6ndring...).
+notAPicture = Filen med navnet '%1$s' er ikke et billede. Det er ikke tilf\u00f8jet til listen af filer der skal uploades.
+
+#PictureDialog
+buttonClose = Luk
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_tr.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_tr.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_tr.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Turkish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = turkish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = G\u00f6zat...
+buttonRemoveSelected = Se\u00e7ileni \u00c7\u0131kar
+buttonRemoveAll = Hepsini \u00c7\u0131kar
+buttonRotateLeft = Sola \u00c7evir
+buttonRotateRight = Sa\u011fa \u00c7evir
+buttonUpload = G\u00f6nder
+buttonStop = DURDUR
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d Dosya Haz\u0131rlan\u0131yor
+infoUploading = Dosyalar g\u00f6nderiliyor %1$s
+infoUploaded = %1$s Dosya g\u00f6nderildi. Sunucudan yan\u0131t bekleniyor
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+#MISSING  nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = G\u00f6nderim hata verip sona erdi.
+errHttpResponse = Sunucu HTTP cevab\u0131 kriterlere uymad\u0131. G\u00f6nderim ba\u015far\u0131s\u0131z.
+questionSendMailOnError = G\u00f6nderim s\u0131ras\u0131nda hatayla kar\u015f\u0131la\u015f\u0131ld\u0131. Bu durumla ilgili bilgileri webmaster\u2019a g\u00f6ndermek istermisiniz?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ad
+colSize = Boyut
+colDirectory = Dizin
+colModified = De\u011fi\u015ftirilme
+colReadable = Okunabilir mi?
+errForbiddenExtension = Yasak olan uzant\u0131.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0130\u015flem kay\u0131t y\u00f6netiminde bir sorun olu\u015ftu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = L\u00fctfen \u00f6nce bir alb\u00fcm se\u00e7iniz.
+coppermineUploadOk = Resimler sunucuda se\u00e7ili alb\u00fcme ba\u015far\u0131yla g\u00f6nderildi. \n\n Yapaca\u011f\u0131n\u0131z de\u011fi\u015fiklikleri kaydetmek i\u00e7in \u2018De\u011fi\u015fiklikleri Kaydet\u2019e t\u0131klamay\u0131 unutmay\u0131n\u0131z!
+
+#PictureFileData
+tooBigPicture = '%1$s' adl\u0131 g\u00f6r\u00fcnt\u00fc dosyas\u0131 \u00e7ok b\u00fcy\u00fck. Herhangi bir de\u011fi\u015fiklik yapmadan (d\u00f6nd\u00fcrme, boyut de\u011fi\u015ftirme vb.) g\u00f6nderilecek.
+notAPicture = '%1$s' adl\u0131 dosya bir g\u00f6r\u00fcnt\u00fc dosyas\u0131 de\u011fildir. Bu dosya, g\u00f6nderilecek dosyalar listesine eklenmedi.
+
+#PictureDialog
+buttonClose = Kapat
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar_SA.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar_SA.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar_SA.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ru.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ru.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ru.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Russian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = russian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041e\u0431\u0437\u043e\u0440 ...
+buttonRemoveSelected = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0435
+buttonRemoveAll = \u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0441\u0435
+buttonRotateLeft = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043b\u0435\u0432\u043e
+buttonRotateRight = \u041f\u043e\u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0432\u043f\u0440\u0430\u0432\u043e
+buttonUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c
+buttonStop = \u0421\u0422\u041e\u041f
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0420\u0430\u0437\u043c\u0435\u0440 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0444\u0430\u0439\u043b\u043e\u0432 %1$s
+infoUploaded = \u0424\u0430\u0439\u043b(\u044b) %1$s \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d(\u044b). \u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 \u043e\u0442\u0432\u0435\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = \u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432: %1$d
+errDuringUpload = \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043f\u0440\u0435\u0440\u0432\u0430\u043d\u0430 \u0441 \u043e\u0448\u0438\u0431\u043a\u0430\u043c\u0438
+errHttpResponse = \u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u044b\u0439 HTTP-\u043e\u0442\u0432\u0435\u0442 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043d\u0435 \u0443\u0434\u0430\u043b\u0430\u0441\u044c.
+questionSendMailOnError = \u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0432\u0435\u0431\u043c\u0430\u0441\u0442\u0435\u0440\u0443?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u044f
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u0418\u0437\u043c\u0435\u043d\u0435\u043d
+colReadable = \u0414\u043e\u0441\u0442\u0443\u043f\u0435\u043d?
+errForbiddenExtension = \u0417\u0430\u043f\u0440\u0435\u0449\u0435\u043d\u043d\u043e\u0435 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 \u0444\u0430\u0439\u043b\u0430.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u041f\u0440\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u043b\u043e\u0433\u043e\u0432 \u043f\u0440\u043e\u0438\u0437\u043e\u0448\u043b\u0430 \u043e\u0448\u0438\u0431\u043a\u0430
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0441\u043d\u0430\u0447\u0430\u043b\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0430\u043b\u044c\u0431\u043e\u043c.
+coppermineUploadOk = \u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f \u0431\u044b\u043b\u0438 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u044b \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0430\u043b\u044c\u0431\u043e\u043c.\n\n\u041d\u0430\u0436\u043c\u0438\u0442\u0435 Ok, \u0447\u0442\u043e\u0431\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0430\u0437\u0432\u0430\u043d\u0438\u044f \u0438 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0438 \u043a \u044d\u0442\u0438\u043c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f\u043c.\n\n\u041d\u0435 \u0437\u0430\u0431\u0443\u0434\u044c\u0442\u0435 \u043d\u0430\u0436\u0430\u0442\u044c \u043a\u043d\u043e\u043f\u043a\u0443 '\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f' \u0434\u043b\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0438\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435!
+
+#PictureFileData
+tooBigPicture = \u041a\u0430\u0440\u0442\u0438\u043d\u043a\u0430 '%1$s' \u0441\u043b\u0438\u0448\u043a\u043e\u043c \u0432\u0435\u043b\u0438\u043a\u0430. \u041e\u043d\u0430 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u0430 \u0431\u0435\u0437 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0439 (\u043f\u043e\u0432\u043e\u0440\u043e\u0442, \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u0432...).
+notAPicture = \u0424\u0430\u0439\u043b '%1$s' \u043d\u0435 \u0435\u0441\u0442\u044c \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0430. \u041e\u043d \u043d\u0435 \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u0441\u043f\u0438\u0441\u043e\u043a \u0444\u0430\u0439\u043b\u043e\u0432 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u043a\u0440\u044b\u0442\u044c
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sv.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sv.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sv.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Swedish
+contributor = Erik Lindahl erik@fisensmosse.se
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = swedish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bl\u00e4ddra ...
+buttonRemoveSelected = Ta bort markerad
+buttonRemoveAll = Ta bort alla
+buttonRotateLeft = Rotera v\u00e4nster
+buttonRotateRight = Rotera h\u00f6ger
+buttonUpload = Ladda upp
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. och %3$d sek.
+timefmt_ms = %1$d min. och %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ok\u00e4nd
+status_msg = %1$d%% klart, \u00f6verf\u00f6ringshastighet: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = '%1$s' \u00e4r f\u00f6r stor (%2$s)
+
+#FileUploadThread
+preparingFile = F\u00f6rbreder fil %1$d/%2$d
+infoUploading = Laddar upp filer %1$s
+infoUploaded = %1$s fil(er) uppladdade. V\u00e4ntar p\u00e5 att server ska svara...
+infoAborted = Avbr\u00f6ts efter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) uppladdade
+errDuringUpload = Stannade med fel.
+errHttpResponse = Uppladdningen misslyckades: ov\u00e4ntade HTTP respons
+questionSendMailOnError = Ett fel uppstod. Vill du s\u00e4nda ett mail med felet till ansvarig?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Namn
+colSize = Storlek
+colDirectory = Mapp
+colModified = Senast \u00e4ndrad
+colReadable = L\u00e4sbar?
+errForbiddenExtension = Ogiltig fil\u00e4ndelse.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ett fel uppstod med logghanteringen.
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e4lj ett album f\u00f6rst.
+coppermineUploadOk = Bilden har blivit \u00f6verf\u00f6rd och sparad i \n\nKlicka p\u00e5 OK f\u00f6r att namnge och kommentera bilderna.\n\nGl\u00f6m inte att verkst\u00e4lla namn\u00e4ndringar f\u00f6r att de ska sparas p\u00e5 servern.
+
+#PictureFileData
+tooBigPicture = Bilden '%1$s' \u00e4r f\u00f6r stor. Den kommer laddas upp of\u00f6r\u00e4ndrad (rotation, storlek...).
+notAPicture = Filen '%1$s' \u00e4r ingen bild. Den kommer inte att laddas upp.
+
+#PictureDialog
+buttonClose = St\u00e4ng
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Godk\u00e4nn
+
+#InteractiveTrustManager
+itm_title_pass = Ange %1$s l\u00f6senord
+itm_prompt_pass = %1$s l\u00f6senord:
+itm_cert_alert = SSL Certifikat varning
+itm_cert_details = Certifikat detaljer:
+itm_cert_subject = \u00c4mne:
+itm_cert_issuer = Utf\u00e4rdat av:
+itm_cert_nbefore = Inte f\u00f6re:
+itm_cert_nafter = Inte efter:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s fingeravtryck:
+itm_cert_C = Land:
+itm_cert_CN = Gemensamt namn:
+itm_cert_L = Plats:
+itm_cert_ST = Region:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations nummer:
+itm_reasons = Sk\u00e4l:
+itm_reason_cnmatch = Certifikatet matchar inte servern (%1$s).
+itm_reason_itrust = Certifikat utf\u00e4rdaren \u00e4r inte trov\u00e4rdig.
+itm_reason_expired = Certifikatet har g\u00e5tt ut.
+itm_reason_notyet = Certifikatet \u00e4r inte giltigt.
+itm_fail_verify = Certifikatet fr\u00e5n servern kunde inte verifieras.
+itm_accept_prompt = Vill du acceptera certifikatet?
+itm_accept_always = Alltid
+itm_accept_now = Bara f\u00f6r den h\u00e4r sessionen
+itm_accept_no = Nej
+itm_new_tstore = Ny TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_bg.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_bg.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_bg.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Bulgarian
+contributor = \u0418\u043b\u0438\u0430\u043d \u0425\u0440\u0438\u0441\u0442\u043e\u0434\u043e\u0440\u043e\u0432 (zulix@zulix.net)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = bulgarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u041f\u0440\u0435\u0433\u043b\u0435\u0434 ...
+buttonRemoveSelected = \u0418\u0437\u0442\u0440\u0438\u0439 \u0438\u0437\u0431\u0440\u0430\u043d\u043e\u0442\u043e
+buttonRemoveAll = \u0418\u0437\u0440\u0438\u0439 \u0432\u0441\u0438\u0447\u043a\u043e
+buttonRotateLeft = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u043b\u044f\u0432\u043e
+buttonRotateRight = \u0417\u0430\u0432\u044a\u0440\u0442\u0438 \u043d\u0430 \u0434\u044f\u0441\u043d\u043e
+buttonUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435
+buttonStop = \u0421\u0422\u041e\u041f
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u0413\u0431/\u0441
+speedunit_mb_per_second = \u041c\u0431/\u0441
+speedunit_kb_per_second = \u041a\u0431/\u0441
+speedunit_b_per_second = \u0431/\u0441
+timefmt_hms = %1$d\u0447, %2$d \u043c\u0438\u043d. \u0438 %3$d \u0441\u0435\u043a.
+timefmt_ms = %1$d \u043c\u0438\u043d. \u0438 %2$d \u0441\u0435\u043a.
+timefmt_s = %1$d \u0441\u0435\u043a\u0443\u043d\u0434\u0438
+timefmt_unknown = \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e
+status_msg = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e %1$d%% \u043f\u0440\u0438\u043a\u043b\u044e\u0447\u0438, \u0422\u0440\u0430\u043d\u0441\u0444\u0435\u0440 \u0441\u0442\u0430\u0442\u0443\u0441: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u0413\u043e\u043b\u0435\u043c\u0438\u043d\u0430\u0442\u0430 \u043d\u0430 \u0445\u0430\u0439\u043b\u0430 '%1$s' \u0435 \u043c\u043d\u043e\u0433\u043e \u0433\u043e\u043b\u044f\u043c\u0430 (%2$s)
+
+#FileUploadThread
+preparingFile = \u041f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043a\u0430 \u043d\u0430 \u0444\u0430\u0439\u043b\u0430 %1$d/%2$d
+infoUploading = \u041a\u0430\u0447\u0432\u0430\u043d\u0435 \u043d\u0430 \u0444\u0430\u0439\u043b\u043e\u0432\u0435 %1$s
+infoUploaded = %1$s \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0432\u0430\u043d\u0435. \u0427\u0430\u043a\u0430\u043d\u0435 \u043e\u0442\u0433\u043e\u0432\u043e\u0440 \u043e\u0442 \u0441\u044a\u0440\u0432\u0430\u0440\u0430 ...
+infoAborted = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u0435\u043a\u0440\u0430\u0442\u0435\u043d\u043e \u0441\u043b\u0435\u0434 %1$d \u0424\u0430\u0439\u043b(\u0430).
+nbUploadedFiles = %1$d \u0444\u0430\u0439\u043b(\u0430) \u043a\u0430\u0447\u0435\u043d\u0438
+errDuringUpload = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u0441\u043f\u0440\u044f \u0437\u0430\u0440\u0430\u0434\u0438 \u0433\u0440\u0435\u0448\u043a\u0438
+errHttpResponse = \u041a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e \u043f\u0440\u043e\u043f\u0430\u0434\u043d\u0430: \u043d\u0435\u043e\u0447\u0430\u043a\u0432\u0430\u043d\u0438 HTTP \u043e\u0442\u0433\u043e\u0432\u043e\u0440\u0438
+questionSendMailOnError = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u043a\u0430\u0447\u0432\u0430\u043d\u0435\u0442\u043e. \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u0438\u0437\u043f\u0440\u0430\u0442\u0438\u0442\u0435 \u0446\u044f\u043b\u0430\u0442\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u0430 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u0437\u0430 \u0443\u0435\u0431\u043c\u0430\u0441\u0442\u044a\u0440\u0430?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0418\u043c\u0435
+colSize = \u0420\u0430\u0437\u043c\u0435\u0440
+colDirectory = \u0414\u0438\u0440\u0435\u043a\u0442\u043e\u0440\u0438\u044f
+colModified = \u041f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u043e
+colReadable = \u0427\u0435\u0442\u043b\u0438\u0432\u043e?
+errForbiddenExtension = \u0417\u0430\u0431\u0440\u0430\u043d\u0435\u043d\u043e \u0444\u0430\u0439\u043b\u043e\u0432\u043e \u0440\u0430\u0437\u0448\u0438\u0440\u0435\u043d\u0438\u0435.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u0412\u044a\u0437\u043d\u0438\u043a\u043d\u0430 \u0433\u0440\u0435\u0448\u043a\u0430 \u043f\u043e \u0432\u0440\u0435\u043c\u0435 \u043d\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u0442\u043e
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u041c\u043e\u043b\u044f, \u0438\u0437\u0431\u0435\u0440\u0435\u0442\u0435 \u0430\u043b\u0431\u0443\u043c.
+coppermineUploadOk = \u0421\u043d\u0438\u043c\u043a\u0438\u0442\u0435 \u0441\u0430 \u0437\u0430\u0440\u0435\u0434\u0435\u043d\u0438 \u043f\u0440\u0430\u0432\u0438\u043b\u043d\u043e \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430, \u0432 \u0438\u0437\u0431\u0440\u0430\u043d\u0438\u044f \u0430\u043b\u0431\u0443\u043c. .\n\n\u041a\u043b\u0438\u043a\u043d\u0435\u0442\u0430 \u043d\u0430 Ok \u0441\u0435\u0433\u0430 \u0437\u0430 \u0434\u0430 \u0441\u0435 \u0430\u0441\u043e\u0446\u0438\u0438\u0440\u0430\u0442 \u0438\u043c\u0435\u043d\u0430\u0442\u0430 \u0438 \u043a\u043e\u043c\u0435\u043d\u0442\u0430\u0440\u0438\u0442\u0435 \u043d\u0430 \u0442\u0435\u0437\u0438 \u0441\u043d\u0438\u043c\u043a\u0438.\n\n\u041d\u0435 \u0437\u0430\u0431\u0440\u0430\u0432\u044f\u0439\u0442\u0435 \u0434\u0430 \u043a\u043b\u0438\u043a\u043d\u0435\u0442\u0435 \u0432\u044a\u0440\u0445\u0443'Apply modification button' , \u0437\u0430 \u0434\u0430 \u0437\u0430\u043f\u0430\u0437\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u044a\u0440\u0432\u044a\u0440\u0430!
+
+#PictureFileData
+tooBigPicture = \u0421\u043d\u0438\u043c\u043a\u0430\u0442\u0430 '%1$s' \u0435 \u043f\u0440\u0435\u043a\u0430\u043b\u0435\u043d\u043e \u0433\u043e\u043b\u044f\u043c\u0430. \u0422\u0447 \u0449\u0435 \u0431\u044a\u0434\u0435 \u043a\u0430\u0447\u0435\u043d\u0430 \u043d\u0435\u043f\u0440\u043e\u043c\u0435\u043d\u0435\u043d\u0430 (\u043d\u044f\u043c\u0430 \u0432\u044a\u0440\u0442\u0435\u043d\u0435, \u043f\u0440\u0435\u043e\u0440\u0430\u0437\u043c\u0435\u0440\u044f\u0432\u0430\u043d\u0435 ...).
+notAPicture = \u0418\u043c\u0435\u0442\u043e\u043d\u0430 \u0444\u0430\u0439\u043b\u0430 '%1$s' \u043d\u0435 \u0435 \u0441\u043d\u0438\u043c\u043a\u0430. \u0422\u043e\u0432\u0430 \u043d\u0435 \u0435 \u0434\u043e\u0431\u0430\u0432\u0435\u043d\u043e \u043a\u044a\u043c \u0441\u043f\u0438\u0441\u044a\u043a\u0430 \u043d\u0430 \u043f\u043e\u0434\u044a\u0440\u0436\u0430\u043d\u0438\u0442\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u0435.
+
+#PictureDialog
+buttonClose = \u0417\u0430\u0442\u0432\u043e\u0440\u0438
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u041f\u043e\u0442\u0432\u044a\u0440\u0434\u0438
+
+#InteractiveTrustManager
+itm_title_pass = \u041d\u0430\u043f\u0438\u0448\u0438 %1$s \u043f\u0430\u0440\u043e\u043b\u0430
+itm_prompt_pass = %1$s \u043f\u0430\u0440\u043e\u043b\u0430:
+itm_cert_alert = SSL \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u043f\u0440\u0435\u0434\u043e\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435
+itm_cert_details = \u0414\u0435\u0442\u0430\u0438\u043b\u0438 \u043d\u0430 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u0430:
+itm_cert_subject = \u0422\u0435\u043c\u0430:
+itm_cert_issuer = \u0415\u043c\u0438\u0442\u0435\u043d\u0442:
+itm_cert_nbefore = \u041d\u0435, \u043f\u0440\u0435\u0434\u0438 \u0434\u0430:
+itm_cert_nafter = \u041d\u0435 \u0441\u043b\u0435\u0434:
+itm_cert_serial = \u0421\u0435\u0440\u0438\u0435\u043d:
+itm_cert_fprint = %1$s \u041e\u0442\u043f\u0435\u0447\u0430\u0442\u044a\u043a:
+itm_cert_C = \u0414\u044a\u0440\u0436\u0430\u0432\u0430:
+itm_cert_CN = \u041e\u0431\u0449\u043e\u043f\u0440\u0438\u0435\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u043e\u0432\u0430\u043d\u0438\u0435:
+itm_cert_L = \u041c\u0435\u0441\u0442\u043d\u043e\u0441\u0442:
+itm_cert_ST = \u0429\u0430\u0442 \u0438\u043b\u0438 \u043f\u0440\u043e\u0432\u0438\u043d\u0446\u0438\u044f:
+itm_cert_O = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u044f:
+itm_cert_OU = \u041e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u043e \u0437\u0432\u0435\u043d\u043e:
+itm_reasons = \u041f\u0440\u0438\u0447\u0438\u043d\u0430(\u0438):
+itm_reason_cnmatch = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u043e\u0431\u0449\u043e\u0442\u043e \u0438\u043c\u0435 \u043d\u0435 \u0441\u044a\u0432\u043f\u0430\u0434\u0430 \u0441 \u0438\u043c\u0435\u0442\u043e \u043d\u0430 \u0445\u043e\u0441\u0442\u0430 (%1$s).
+itm_reason_itrust = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0438\u0437\u0434\u0430\u0442\u0435\u043b\u044f\u0442 \u043d\u0435 \u0435 \u043d\u0430\u0434\u0435\u0436\u0434\u0435\u043d.
+itm_reason_expired = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0435 \u0441 \u0438\u0437\u0442\u0435\u043a\u044a\u043b \u0441\u0440\u043e\u043a.
+itm_reason_notyet = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442 \u0432\u0441\u0435 \u043e\u0449\u0435 \u043d\u0435 \u0435 \u0432\u0430\u043b\u0438\u0434\u0435\u043d.
+itm_fail_verify = \u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044a\u0442, \u043f\u0440\u0435\u0434\u0441\u0442\u0430\u0432\u0435\u043d \u043e\u0442 \u0441\u044a\u0440\u0432\u044a\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435 \u0434\u0430 \u0431\u044a\u0434\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u0435\u043d.
+itm_accept_prompt = \u0418\u0441\u043a\u0430\u0442\u0435 \u043b\u0438 \u0434\u0430 \u043f\u0440\u0438\u0435\u043c\u0435\u0442\u0435 \u0442\u043e\u0437\u0438 \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442?
+itm_accept_always = \u0412\u0438\u043d\u0430\u0433\u0438
+itm_accept_now = \u0421\u0430\u043c\u043e \u0437\u0430 \u0442\u0430\u0437\u0438 \u0441\u0435\u0441\u0438\u044f
+itm_accept_no = \u041d\u0435
+itm_new_tstore = \u041d\u043e\u0432\u0430 TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_de.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_de.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_de.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = German
+contributor = Fritz Elfert <felfert@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = german
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Durchsuchen ...
+buttonRemoveSelected = Ausgew\u00e4hlte entfernen
+buttonRemoveAll = Alle entfernen
+buttonRotateLeft = Gegen den Uhrzeigersinn drehen
+buttonRotateRight = Im Uhrzeigersinn drehen
+buttonUpload = Hochladen
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d Std., %2$d Min. und %3$d Sec.
+timefmt_ms = %1$d Min. und %2$d Sek.
+timefmt_s = %1$d Sekunden
+timefmt_unknown = unbekannt
+status_msg = JUpload %1$d%% abgeschlossen, Transferrate: %2$s, Verbleibend: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Die Datei '%1$s' ist zu gro\u00df (%2$s)
+
+#FileUploadThread
+preparingFile = Datei vorbereiten:  %1$d/%2$d
+infoUploading = \u00dcbertrage Datei: %1$s
+infoUploaded = %1$s Datei(en) hochgeladen. Warte auf Server Antwort ...
+infoAborted = Upload nach %1$d Dateien(en) abgebrochen.
+nbUploadedFiles = %1$d Datei(en) hochgeladen
+errDuringUpload = Upload-Vorgang wegen eines Fehlers gestoppt
+errHttpResponse = Die HTTP Antwort erf\u00fcllt nicht die Kriterien. Vorgang fehlgeschlagen.
+questionSendMailOnError = Es ist ein Fehler aufgetreten. Soll das\nFehlerprotokoll an den Webmaster gesendet werden?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Gr\u00f6\u00dfe
+colDirectory = Verzeichnis
+colModified = Ge\u00e4ndert
+colReadable = Lesbar?
+errForbiddenExtension = Keine erlaubte Dateiendung.
+
+#DefaultUploadPolicy
+errDuringLogManagement = W\u00e4hrend des Log Managements ist ein Fehler aufgetreten
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bitte zuerst ein Album ausw\u00e4hlen.
+coppermineUploadOk = Die Dateien wurden erfolgreich in das ausgew\u00e4hlte Album hochgeladen. \n\nBitte auf OK klicken um zu den Dateien Name und Beschreibung hinzuzuf\u00fcgen.\n\nNach der Eingabe auf '\u00c4nderungen \u00dcbernehmen' klicken, um die Informationen zu speichern !
+
+#PictureFileData
+tooBigPicture = Das Bild '%1$s' ist zu gro\u00df und wird ohne \u00c4nderungen hochgeladen (ohne Drehung, Gr\u00f6\u00dfen\u00e4nderung...).
+notAPicture = Die Datei '%1$s' ist kein Bild. Sie wird nicht der Liste der hochzuladenden Dateien hinzugef\u00fcgt.
+
+#PictureDialog
+buttonClose = Schlie\u00dfen
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Best\u00e4tigen
+
+#InteractiveTrustManager
+itm_title_pass = %1$s Password eingeben
+itm_prompt_pass = %1$s Passwort:
+itm_cert_alert = SSL Zertificats-Warnung
+itm_cert_details = Zertifikats-Details:
+itm_cert_subject = Inhaber:
+itm_cert_issuer = Aussteller:
+itm_cert_nbefore = G\u00fcltig ab:
+itm_cert_nafter = G\u00fcltig bis:
+itm_cert_serial = Seriennr.:
+itm_cert_fprint = %1$s Fingerabdruck:
+itm_cert_C = Land:
+itm_cert_CN = Allgemeiner Name:
+itm_cert_L = Stadt:
+itm_cert_ST = Staat oder Provinz:
+itm_cert_O = Organisation:
+itm_cert_OU = Organisations-Abteilung:
+itm_reasons = Gr\u00fcnde:
+itm_reason_cnmatch = Der allgemaine Name passt nicht zum Hostnamen (%1$s).
+itm_reason_itrust = Dem Aussteller des Zertifikats wird nicht vertraut.
+itm_reason_expired = Das Zertifikat ist abgelaufen.
+itm_reason_notyet = Das Zertifikat ist noch nicht g\u00fcltig.
+itm_fail_verify = Das Zertifikat des Servers konnte nicht \u00fcberpr\u00fcft werden.
+itm_accept_prompt = Wollen Sie dieses Zertifikat annehmen?
+itm_accept_always = Immer
+itm_accept_now = Nur f\u00fcr diese Sitzung
+itm_accept_no = Nein
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ja.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ja.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ja.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Japanese
+contributor = Takashi Yukawa: takashi_922 at yahoo dot co dot jp
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = japanese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u30d5\u30a1\u30a4\u30eb\u3092\u958b\u304f..
+buttonRemoveSelected = \u9078\u629e\u3057\u305f\u30d5\u30a1\u30a4\u30eb\u3092\u524a\u9664
+buttonRemoveAll = \u3059\u3079\u3066\u524a\u9664
+buttonRotateLeft = \u5de6\u3078\u56de\u8ee2
+buttonRotateRight = \u53f3\u3078\u56de\u8ee2
+buttonUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9
+buttonStop = \u505c\u6b62
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = %1$d/%2$d \u306e\u6e96\u5099\u4e2d
+infoUploading = %1$s \u3092\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d
+infoUploaded = %1$s \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u7d42\u4e86\u3057\u307e\u3057\u305f\u3002\u30b5\u30fc\u30d0\u304b\u3089\u306e\u5fdc\u7b54\u3092\u304a\u5f85\u3061\u304f\u3060\u3055\u3044\u3002
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d \u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u7d42\u4e86
+errDuringUpload = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u304c\u30a8\u30e9\u30fc\u3067\u505c\u6b62\u3057\u307e\u3057\u305f\u3002
+errHttpResponse = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u5931\u6557: \u4e0d\u6b63\u306a HTTP \u30ec\u30b9\u30dd\u30f3\u30b9
+questionSendMailOnError = \u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u30a8\u30e9\u30fc\u60c5\u5831\u3092WEB\u7ba1\u7406\u8005\u3078\u9001\u4fe1\u3057\u307e\u3059\u304b?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u524d
+colSize = \u30b5\u30a4\u30ba
+colDirectory = \u30d5\u30a1\u30a4\u30eb\u306e\u5834\u6240
+colModified = \u66f4\u65b0\u65e5\u6642
+colReadable = \u8aad\u8fbc\u53ef?
+errForbiddenExtension = \u4f7f\u7528\u304c\u8a31\u53ef\u3055\u308c\u3066\u3044\u306a\u3044\u30d5\u30a1\u30a4\u30eb\u62e1\u5f35\u5b50\u3067\u3059\u3002
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u30ed\u30b0\u7ba1\u7406\u4e2d\u306b\u30a8\u30e9\u30fc\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u6700\u521d\u306b\u30a2\u30eb\u30d0\u30e0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+coppermineUploadOk = \u9078\u629e\u3057\u305f\u30a2\u30eb\u30d0\u30e0\u306b\u3001\u753b\u50cf\u304c\u6b63\u3057\u304f\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3057\u305f\u3002\n\nOk \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u753b\u50cf\u306b\u540d\u524d\u3084\u30b3\u30e1\u30f3\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002\n\n'Apply modification button' \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30b5\u30fc\u30d0\u306e\u60c5\u5831\u3082\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002
+
+#PictureFileData
+tooBigPicture = '%1$s' \u306e\u30d5\u30a1\u30a4\u30eb\u30b5\u30a4\u30ba\u304c\u5927\u304d\u3059\u304e\u307e\u3059\u3002\u30d5\u30a1\u30a4\u30eb\u306f\u5909\u66f4\u3055\u308c\u305a\u306b\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u3055\u308c\u307e\u3059 (\u56de\u8ee2, \u30b5\u30a4\u30ba\u5909\u66f4\u306a\u3069\u306a\u3057)\u3002
+notAPicture = '%1$s' \u306f\u753b\u50cf\u30d5\u30a1\u30a4\u30eb\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9\u30ea\u30b9\u30c8\u306b\u306f\u8ffd\u52a0\u3055\u308c\u307e\u305b\u3093\u3002
+
+#PictureDialog
+buttonClose = \u9589\u3058\u308b
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh_TW.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh_TW.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh_TW.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_he.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_he.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_he.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hebrew
+contributor = liorda@gmail.com
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hebrew
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u05e2\u05d9\u05d5\u05df...
+buttonRemoveSelected = \u05d4\u05e1\u05e8 \u05e4\u05e8\u05d9\u05d8\u05d9\u05dd \u05de\u05e1\u05d5\u05de\u05e0\u05d9\u05dd
+buttonRemoveAll = \u05d4\u05e1\u05e8 \u05d4\u05db\u05dc
+buttonRotateLeft = \u05e1\u05d5\u05d1\u05d1 \u05e9\u05de\u05d0\u05dc\u05d4
+buttonRotateRight = \u05e1\u05d5\u05d1\u05d1 \u05d9\u05de\u05d9\u05e0\u05d4
+buttonUpload = \u05d4\u05e2\u05dc\u05d4
+buttonStop = \u05e2\u05e6\u05d5\u05e8
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_mb_per_second = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_kb_per_second = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+speedunit_b_per_second = \u05d1\u05d9\u05d8 \u05dc\u05e9\u05e0\u05d9\u05d9\u05d4
+timefmt_hms = %1$d\u05e9, %2$d \u05d3\u05e7\u05d5\u05ea \u05d5-  %3$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_ms = %1$d \u05d3\u05e7\u05d5\u05ea -\u05d5  %2$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_s = %1$d \u05e9\u05e0\u05d9\u05d5\u05ea
+timefmt_unknown = \u05dc\u05d0 \u05d9\u05d3\u05d5\u05e2
+status_msg = JUpload %1$d%% \u05d4\u05d5\u05e9\u05dc\u05de\u05d5, \u05e7\u05e6\u05d1 \u05d4\u05e2\u05d1\u05e8\u05d4: %2$s, \u05e0\u05d5\u05ea\u05e8: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u05d2\u05d5\u05d3\u05dc \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d2\u05d3\u05d5\u05dc \u05de\u05d3\u05d9 (%2$s)
+
+#FileUploadThread
+preparingFile = \u05de\u05db\u05d9\u05df \u05e7\u05d5\u05d1\u05e5 %1$d/%2$d
+infoUploading = \u05de\u05e2\u05dc\u05d4 \u05e7\u05d1\u05e6\u05d9\u05dd %1$s
+infoUploaded = %1$s \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5. \u05de\u05de\u05ea\u05d9\u05df \u05dc\u05ea\u05d2\u05d5\u05d1\u05ea \u05d4\u05e9\u05e8\u05ea...
+infoAborted = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05dc\u05d0\u05d7\u05e8 %1$d \u05e7\u05d1\u05e6\u05d9\u05dd.
+nbUploadedFiles = %1$d \u05e7\u05d1\u05e6\u05d9\u05dd \u05d4\u05d5\u05e2\u05dc\u05d5
+errDuringUpload = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05d4\u05d5\u05e4\u05e1\u05e7\u05d4 \u05e2\u05dd \u05e9\u05d2\u05d9\u05d0\u05d5\u05ea
+errHttpResponse = \u05d4\u05e2\u05dc\u05d0\u05d4 \u05e0\u05db\u05e9\u05dc\u05d4: \u05ea\u05d2\u05d5\u05d1\u05ea HTTP \u05dc\u05d0-\u05e6\u05e4\u05d5\u05d9\u05d4
+questionSendMailOnError = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05d4\u05d4\u05e2\u05dc\u05d0\u05d4. \u05d4\u05d0\u05dd \u05ea\u05e8\u05e6\u05d4 \u05dc\u05e9\u05dc\u05d5\u05d7 \u05d0\u05ea \u05db\u05dc \u05d4\u05de\u05d9\u05d3\u05e2 \u05d4\u05e8\u05dc\u05d5\u05d5\u05e0\u05d8\u05d9 \u05dc\u05de\u05e0\u05d4\u05dc \u05d4\u05d0\u05ea\u05e8?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u05e9\u05dd
+colSize = \u05d2\u05d5\u05d3\u05dc
+colDirectory = \u05e1\u05e4\u05e8\u05d9\u05d4
+colModified = \u05ea\u05d0\u05e8\u05d9\u05da \u05e9\u05d9\u05e0\u05d5\u05d9
+colReadable = \u05e0\u05d9\u05ea\u05df \u05dc\u05e7\u05e8\u05d9\u05d0\u05d4?
+errForbiddenExtension = \u05e1\u05d9\u05d5\u05de\u05ea \u05d4\u05e7\u05d5\u05d1\u05e5 \u05d0\u05e1\u05d5\u05e8\u05d4.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u05d4\u05ea\u05e8\u05d7\u05e9\u05d4 \u05e9\u05d2\u05d9\u05d0\u05d4 \u05d1\u05d6\u05de\u05df \u05e0\u05d9\u05d4\u05d5\u05dc \u05d4\u05d9\u05d5\u05de\u05df
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u05d0\u05e0\u05d0, \u05d1\u05d7\u05e8 \u05d0\u05dc\u05d1\u05d5\u05dd \u05ea\u05d7\u05d9\u05dc\u05d4.
+coppermineUploadOk = \u05d4\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d4\u05d5\u05e2\u05dc\u05d5 \u05dc\u05e9\u05e8\u05ea \u05d1\u05d4\u05e6\u05dc\u05d7\u05d4, \u05dc\u05d0\u05dc\u05d1\u05d5\u05dd \u05d4\u05e0\u05d1\u05d7\u05e8.\n\n\u05dc\u05d7\u05e5 \u05e2\u05dc OK \u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e9\u05d9\u05d9\u05da \u05e9\u05de\u05d5\u05ea \u05d5\u05d4\u05e2\u05e8\u05d5\u05ea \u05dc\u05ea\u05de\u05d5\u05e0\u05d5\u05ea \u05d0\u05dc\u05d5.\n\n\u05d0\u05dc \u05ea\u05e9\u05db\u05d7 \u05dc\u05dc\u05d7\u05d5\u05e5 \u05e2\u05dc \u05db\u05e4\u05ea\u05d5\u05e8 '\u05d4\u05d7\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd' \u05db\u05d3\u05d9 \u05dc\u05e9\u05de\u05d5\u05e8 \u05d0\u05ea \u05d4\u05db\u05dc \u05d4\u05e9\u05d9\u05e0\u05d5\u05d9\u05d9\u05dd \u05dc\u05e9\u05e8\u05ea!
+
+#PictureFileData
+tooBigPicture = \u05d4\u05ea\u05de\u05d5\u05e0\u05d4 '%1$s' \u05d2\u05d3\u05d5\u05dc\u05d4 \u05de\u05d3\u05d9. \u05d4\u05d9\u05d0 \u05ea\u05d5\u05e2\u05dc\u05d4 \u05dc\u05dc\u05d0 \u05db\u05dc \u05e9\u05d9\u05e0\u05d5\u05d9 (\u05e1\u05d9\u05d1\u05d5\u05d1, \u05e9\u05d9\u05e0\u05d5\u05d9 \u05d2\u05d5\u05d3\u05dc...).
+notAPicture = \u05d4\u05e7\u05d5\u05d1\u05e5 '%1$s' \u05d0\u05d9\u05e0\u05d5 \u05ea\u05de\u05d5\u05e0\u05d4. \u05d4\u05d5\u05d0 \u05dc\u05d0 \u05d9\u05ea\u05d5\u05d5\u05e1\u05e3 \u05dc\u05e8\u05e9\u05d9\u05de\u05ea \u05d4\u05e7\u05d1\u05e6\u05d9\u05dd \u05dc\u05e9\u05dc\u05d9\u05d7\u05d4.
+
+#PictureDialog
+buttonClose = \u05e1\u05d2\u05d5\u05e8
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = \u05d1\u05d9\u05d8
+unitGigabytes = \u05d2'\u05d9\u05d2\u05d4\u05d1\u05d9\u05d8
+unitMegabytes = \u05de\u05d2\u05d4\u05d1\u05d9\u05d8
+unitKilobytes = \u05e7\u05d9\u05dc\u05d5\u05d1\u05d9\u05d8
+
+#sendDebugInformation
+Confirm = \u05d0\u05d9\u05e9\u05d5\u05e8
+
+#InteractiveTrustManager
+itm_title_pass = \u05d4\u05db\u05e0\u05e1 \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s
+itm_prompt_pass = \u05e1\u05d9\u05e1\u05de\u05d4 \u05e2\u05d1\u05d5\u05e8 %1$s:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = \u05d4\u05d0\u05dd \u05d1\u05e8\u05e6\u05d5\u05e0\u05da \u05dc\u05e7\u05d1\u05dc \u05ea\u05e2\u05d5\u05d3\u05d4 \u05d6\u05d5?
+itm_accept_always = \u05ea\u05de\u05d9\u05d3
+itm_accept_now = \u05e8\u05e7 \u05e2\u05d1\u05d5\u05e8 \u05d4\u05e4\u05e2\u05d5\u05dc\u05d4 \u05d4\u05e0\u05d5\u05db\u05d7\u05d9\u05ea
+itm_accept_no = \u05dc\u05d0
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ar.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Arabic
+contributor = "Abdulrhman Alkhodiry" <almooheb@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = arabic
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u0627\u0633\u062a\u0639\u0631\u0627\u0636 ...
+buttonRemoveSelected = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0627\u062e\u062a\u064a\u0627\u0631
+buttonRemoveAll = \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0643\u0644
+buttonRotateLeft = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0633\u0627\u0631
+buttonRotateRight = \u0627\u062f\u0627\u0631\u0629 \u0644\u0644\u064a\u0645\u064a\u0646
+buttonUpload = \u0631\u0641\u0639
+buttonStop = \u0627\u064a\u0642\u0627\u0641
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d \u062f\u0642\u064a\u0642\u0629. \u0648 %3$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_ms = %1$d \u062f\u0642\u064a\u0642\u0629. \u0648 %2$d \u062b\u0627\u0646\u064a\u0629.
+timefmt_s = %1$d \u062b\u0648\u0627\u0646\u064a
+timefmt_unknown = \u063a\u064a\u0631 \u0645\u0639\u0631\u0648\u0641
+status_msg = \u062c\u064a \u0627\u0628\u0644\u0648\u062f %1$d%% \u0627\u0646\u062a\u0647\u0649, \u0633\u0631\u0639\u0629 \u0627\u0644\u0646\u0642\u0644: %2$s, \u062a\u0642\u0631\u064a\u0628\u0627: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u062d\u062c\u0645 \u0627\u0644\u0645\u0644\u0641 \u0644\u0640 '%1$s' \u0643\u0628\u064a\u0631 (%2$s)
+
+#FileUploadThread
+preparingFile = \u062a\u062d\u0636\u064a\u0631 \u0627\u0644\u0645\u0644\u0641 %1$d/%2$d
+infoUploading = \u0631\u0641\u0639 \u0627\u0644\u0645\u0644\u0641\u0627\u062a %1$s
+infoUploaded = %1$s \u0645\u0644\u0641 \u0631\u0641\u0639\u0629. \u0627\u0646\u062a\u0638\u0627\u0631 \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 ...
+infoAborted = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 %1$d \u0645\u0644\u0641.
+nbUploadedFiles = %1$d \u0627\u0644\u0645\u0644\u0641 \u0627\u0648 \u0627\u0644\u0644\u0641\u0627\u062a \u0631\u0641\u0639\u0629
+errDuringUpload = \u062a\u0645 \u0627\u0644\u063a\u0627\u0621 \u0627\u0644\u0631\u0641\u0639 \u0628\u0623\u062e\u0637\u0627\u0621
+errHttpResponse = \u0627\u0644\u0631\u0641\u0639 \u0641\u0634\u0644: \u0631\u062f \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u063a\u064a\u0631 \u0645\u062a\u0648\u0642\u0639
+questionSendMailOnError = \u062d\u062f\u062b \u062e\u0637\u0627\u0621 \u0627\u062b\u0646\u0627\u0621 \u0627\u0644\u0631\u0641\u0639. \u0647\u0644 \u062a\u0631\u064a\u062f \u0627\u0631\u0633\u0627\u0644 \u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062e\u0637\u0623 \u0627\u0644\u0649 \u0645\u062f\u064a\u0631 \u0627\u0644\u0645\u0648\u0642\u0639?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u0627\u0644\u0627\u0633\u0645
+colSize = \u0627\u0644\u062d\u062c\u0645
+colDirectory = \u0627\u0644\u0645\u062c\u0644\u062f
+colModified = \u0639\u062f\u0644
+colReadable = \u0642\u0627\u0628\u0644 \u0644\u0644\u0642\u0631\u0627\u0621\u0629?
+errForbiddenExtension = \u0627\u0645\u062a\u062f\u0627\u062f\u0627\u062a \u063a\u064a\u0631 \u0645\u0633\u0645\u0648\u062d\u0629.
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u062d\u062f\u062b \u062e\u0637\u0623 \u0627\u062b\u0646\u0627\u0621 \u0627\u062f\u0627\u0631\u0629 \u0627\u0644\u0633\u062c\u0644
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u0627\u0644\u0631\u062c\u0627\u0621, \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0648\u0644\u0627.
+coppermineUploadOk = \u062a\u0645 \u0631\u0641\u0639 \u0627\u0644\u0635\u0648\u0631 \u0628\u0646\u062c\u0627\u062d, \u0641\u064a \u0627\u0644\u0627\u0644\u0628\u0648\u0645 \u0627\u0644\u0645\u062e\u062a\u0627\u0631.\n\n \u0627\u0646\u0642\u0631 \u0627\u0648\u0643\u064a\u0629 \u0644\u062a\u0639\u062f\u064a\u0644 \u0627\u0633\u0645 \u0648 \u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u0635\u0648\u0631.\n\n \u0644\u0627 \u062a\u0646\u0633\u0649 \u0627\u0644\u0646\u0642\u0631 \u0639\u0644\u0649 '\u0632\u0631 \u062a\u0646\u0641\u064a\u0630 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a' \u0644\u064a\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0639\u062f\u064a\u0644\u0627\u062a \u0641\u064a \u0627\u0644\u0633\u064a\u0631\u0641\u0631 !
+
+#PictureFileData
+tooBigPicture = \u0627\u0644\u0635\u0648\u0631\u0629 '%1$s' \u0643\u0628\u064a\u0631\u0629 \u062c\u062f\u0627. \u0633\u0648\u0641 \u064a\u062a\u0645 \u0631\u0641\u0639\u0647\u0627 \u0628\u062f\u0648\u0646 \u062a\u0639\u062f\u064a\u0644 (\u062a\u0635\u063a\u064a\u0631 \u0627\u0648 \u0638\u063a\u0637...).
+notAPicture = \u0627\u0644\u0645\u0644\u0641 \u0628\u0623\u0633\u0645 '%1$s' \u0644\u064a\u0633 \u0635\u0648\u0631\u0629. \u0644\u0646 \u064a\u062a\u0645 \u0627\u0636\u0627\u0641\u062a\u0647 \u0627\u0644\u0649 \u0627\u0644\u0645\u0644\u0641\u0627\u062a \u0627\u0644\u0645\u0631\u0641\u0648\u0639\u0629.
+
+#PictureDialog
+buttonClose = \u0627\u063a\u0644\u0627\u0642
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = \u062a\u0623\u0643\u064a\u062f
+
+#InteractiveTrustManager
+itm_title_pass = \u0627\u062f\u062e\u0644 %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631
+itm_prompt_pass = %1$s \u0643\u0644\u0645\u0629 \u0627\u0644\u0633\u0631:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = \u0627\u0644\u0645\u0648\u0636\u0648\u0639:
+itm_cert_issuer = \u0627\u0644\u0645\u0634\u0643\u0644\u0629:
+itm_cert_nbefore = \u0644\u064a\u0633 \u0642\u0628\u0644:
+itm_cert_nafter = \u0644\u064a\u0633 \u0628\u0639\u062f:
+itm_cert_serial = \u0627\u0644\u0631\u0642\u0645 \u0627\u0644\u062a\u0633\u0644\u0633\u0644\u064a:
+itm_cert_fprint = %1$s \u0628\u0635\u0645\u0629:
+itm_cert_C = \u0627\u0644\u0628\u0644\u062f:
+itm_cert_CN = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639:
+itm_cert_L = \u0627\u0644\u0645\u0648\u0642\u0639:
+itm_cert_ST = \u0627\u0644\u0648\u0644\u0627\u064a\u0629 \u0627\u0648 \u0627\u0644\u0645\u0642\u0627\u0637\u0639\u0629:
+itm_cert_O = \u0627\u0644\u0645\u0624\u0633\u0633\u0629:
+itm_cert_OU = Organizational unit:
+itm_reasons = \u0627\u0644\u0627\u0633\u0628\u0627\u0628:
+itm_reason_cnmatch = \u0627\u0644\u0627\u0633\u0645 \u0627\u0644\u0634\u0627\u0626\u0639 \u0644\u0627 \u064a\u0637\u0627\u0628\u0642 \u0627\u0633\u0645 \u0627\u0644\u0645\u0633\u062a\u0636\u064a\u0641 (%1$s).
+itm_reason_itrust = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u063a\u064a\u0631 \u0645\u0648\u062b\u0648\u0642.
+itm_reason_expired = \u0627\u0644\u062a\u0631\u062e\u064a\u0635 \u0627\u0646\u062a\u0647\u0649.
+itm_reason_notyet = \u0644\u0645 \u064a\u062a\u0645 \u0627\u0644\u062a\u0623\u0643\u062f \u0645\u0646 \u0627\u0644\u062a\u0631\u062e\u064a\u0635.
+itm_fail_verify = \u0627\u0644\u062a\u0631\u062e\u064a\u0635, \u0645\u0646 \u0627\u0644\u0633\u064a\u0631\u0641\u0631 \u0644\u0645 \u064a\u062a\u0645 \u062a\u0623\u0643\u064a\u062f\u0647.
+itm_accept_prompt = \u0647\u0644 \u062a\u0631\u064a\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062a\u0631\u062e\u064a\u0635?
+itm_accept_always = \u062f\u0627\u0626\u0645\u0627
+itm_accept_now = \u0644\u0647\u0630\u0647 \u0627\u0644\u062c\u0644\u0633\u0629 \u0641\u0642\u0637
+itm_accept_no = \u0644\u0627
+itm_new_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646 \u0645\u0648\u062b\u0648\u0642 \u062c\u062f\u064a\u062f
+itm_tstore = \u0645\u0643\u0627\u0646 \u062a\u062e\u0632\u064a\u0646
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_en.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_en.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_en.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = English
+contributor = No maintainer (same content as lang.properties)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_eo.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_eo.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_eo.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Esperanto
+contributor = Chuck Smith
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = esperanto
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Foliumi ...
+buttonRemoveSelected = Forigu Elektita(j)
+buttonRemoveAll = Forigu \u0109iujn
+buttonRotateLeft = Turnigu maldekstren
+buttonRotateRight = Turnigu dekstren
+buttonUpload = Al\u015duti
+buttonStop = HALTI
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. kaj %3$d sek.
+timefmt_ms = %1$d min. kaj %2$d sek.
+timefmt_s = %1$d sekundoj
+timefmt_unknown = nekonata
+status_msg = JUpload %1$d%% finita, transferrapideco: %2$s, restas: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparante dosierojn %1$d/%2$d
+infoUploading = Al\u015dutante dosierojn %1$s
+infoUploaded = Dosiero(j) %1$s al\u015dutita(j). Atendante servilan respondon ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d dosieroj al\u015dutitaj
+errDuringUpload = Al\u015dutado haltita pro eraroj
+errHttpResponse = La HTTP-respondo de la servilo ne ta\u016dgas. La al\u015duto malsukcesis.
+questionSendMailOnError = Eraro okazis al\u015dutante.  \u0109u vi volas sendi \u0109iujn rilatajn informojn al la retestro?
+
+#DialogUploadRetry
+dialogUploadRetryText = Eraro okazis dum al\u015duto de la dosieroj al la servilo. \u0108u vi volas reprovi al\u015duti la dosierojn?\n\nLa al\u015duto a\u016dtomate rekomencos post %1$d sekundoj.
+dialogUploadRetryTitle = Reprovi la al\u015duton?
+buttonDetails = Detaloj
+buttonYes = Jes
+buttonNo = Ne
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nomo
+colSize = Grandeco
+colDirectory = Dosierujo
+colModified = \u015can\u011dita
+colReadable = Legebla?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Eraro okazis dum log-administrado
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Bonvolu unue elekti fotoalbumon.
+coppermineUploadOk = La fotoj bone al\u015duti\u011dis al la servilo en la elektita fotoalbumo.\n\nKlaku sur Bone nun por asociigi nomojn kaj komentojn al tiujn fotojn.\n\nNe forgesu klaki sur la 'Butono de Aktivigu \u015dan\u011don' por konservi viajn \u015dan\u011dojn al la servilo!
+
+#PictureFileData
+tooBigPicture = Bildo '%1$s' tro grandas. \u011di al\u015duti\u011dos ne\u015dan\u011dite (sen turno, \u015dan\u011deco de grandeco ktp).
+notAPicture = La dosiero nomata '%1$s' ne estas bildo. \u011di ne aldoni\u011das al la al\u015dutota dosieraro.
+
+#PictureDialog
+buttonClose = Fermi
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Konfirmi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_cs.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_cs.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_cs.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = false
+language = Czech
+contributor = Vladan Zajda
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = czech
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Proch\u00e1zet ...
+buttonRemoveSelected = Odstranit ozna\u010den\u00e9
+buttonRemoveAll = Odstranit v\u0161e
+buttonRotateLeft = Oto\u010dit vlevo
+buttonRotateRight = Oto\u010dit vpravo
+buttonUpload = P\u0159en\u00e9st
+buttonStop = UKON\u010cIT
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Soubor %1 je p\u0159\u00edli\u0161 velik\u00fd (%2 byt\u016f)
+
+#FileUploadThread
+preparingFile = P\u0159ipravuji soubor %1
+infoUploading = P\u0159en\u00e1\u0161\u00edm soubory %1
+infoUploaded = %1 soubor(\u016f) p\u0159eneseno. \u010cek\u00e1m na odpov\u011b\u010f serveru ...
+infoAborted = P\u0159enos byl p\u0159eru\u0161en po %1 souborech.
+nbUploadedFiles = %1 soubor(\u016f) p\u0159eneseno
+errDuringUpload = P\u0159enos byl ukon\u010den s chybami
+errHttpResponse = P\u0159enos byl ukon\u010den: neo\u010dek\u00e1van\u00e1 odpov\u011b\u010f HTTP
+questionSendMailOnError = Nastala chyba p\u0159i p\u0159enosu. P\u0159ejete si odeslat detailn\u00ed informace spr\u00e1vci serveru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zev
+colSize = Velikost
+colDirectory = Adres\u00e1\u0159
+colModified = Modifikov\u00e1no
+colReadable = \u010citeln\u00fd?
+errForbiddenExtension = Zak\u00a0zan\u00a0 souborov\u00a0 pr\u00a1pona.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Nastala chyba p\u0159i zpracov\u00e1n\u00ed logu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Nejprve pros\u00edm vyberte album.
+coppermineUploadOk = Obr\u00e1zky byly \u00fasp\u011b\u0161n\u011b p\u0159eneseny do vybran\u00e9ho alba na serveru.\n\nNyn\u00ed klikn\u011bte OK abyste mohli p\u0159i\u0159adit n\u00e1zvy a koment\u00e1\u0159e k obr\u00e1zk\u016fm.\n\nNezapome\u0148te kliknout na tla\u010d\u00edtko 'Ulo\u017eit \u00fapravy', aby do\u0161lo k ulo\u017een\u00ed \u00faprav na serveru !
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zek %1 je p\u0159\u00edli\u0161 velk\u00fd. Bude p\u0159enesen neupraven\u00fd (bez oto\u010den\u00ed, zm\u011bny velikosti...).
+notAPicture = Soubor s n\u00e1zvem '%1' nen\u00ed obr\u00e1zek. Nebyl tedy vlo\u017een do seznamu soubor\u016f k p\u0159enesen\u00ed.
+
+#PictureDialog
+buttonClose = Zav\u0159\u00edt
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdit
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt_BR.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt_BR.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pt_BR.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Brasilian (Protugese)
+contributor = Filipe Teixeira <filipesteixeira@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = brazilian_portuguese
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Procurar ...
+buttonRemoveSelected = Remover Selecionados
+buttonRemoveAll = Remover Todos
+buttonRotateLeft = Girar para a esquerda
+buttonRotateRight = Girar para a direita
+buttonUpload = Enviar
+buttonStop = Parar
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando arquivo %1$d/%2$d
+infoUploading = Enviando arquivo(s) %1$s
+infoUploaded = Arquivo(s) %1$s enviados. Aguardando resposta do servidor ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d Arquivo(s) enviados
+errDuringUpload = Envio parado por erro
+errHttpResponse = O servidor n\u00e3o respondeu da forma correta. Erro ao enviar.
+questionSendMailOnError = Erro ao enviar arquivo. Voc\u00ea quer enviar informa\u00e7\u00f5es ao webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Tamanho
+colDirectory = Diret\u00f3rio
+colModified = Modificado
+colReadable = Leg\u00edvel
+errForbiddenExtension = Exten\u2021\u00c6o de arquivo proibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Erro ao gravar log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, escolha um album primeiro
+coppermineUploadOk = As imagens foram carregadas corretamente no servidor, no album selecionado.\n\nClique em OK para associar os nomes e coment\u00e1rios a esta imagem.\n\nN\u00e3o esque\u00e7a de clicar em 'Aplicar modifica\u00e7\u00f5es' para salvar suas modifica\u00e7\u00f5es no servidor.
+
+#PictureFileData
+tooBigPicture = Imagem '$1%s' \u00e9 muito grande. Ser\u00e1 enviada sem modifica\u00e7\u00f5es.
+notAPicture = O arquivo '$1%s' n\u00e3o \u00e9 uma imagem. N\u00e3o ser\u00e1 adicionada \u00e0 lista de arquivos a serem enviados.
+
+#PictureDialog
+buttonClose = Fechar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_fr.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_fr.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_fr.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = French
+contributor = Etienne <etienne_sf@users.sourceforge.net>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = french
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Choisir des fichiers ...
+buttonRemoveSelected = Suppr s\u00e9lectionn\u00e9s
+buttonRemoveAll = Suppr tous
+buttonRotateLeft = Tourner gauche
+buttonRotateRight = Tourner droite
+buttonUpload = Envoyer
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Les messages de debug ont \u00e9t\u00e9 copi\u00e9s dans le presse-papier.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Go/s
+speedunit_mb_per_second = Mo/s
+speedunit_kb_per_second = Ko/s
+speedunit_b_per_second = o/s
+timefmt_hms = %1$d h., %2$d min. et %3$d sec.
+timefmt_ms = %1$d min. et %2$d sec.
+timefmt_s = %1$d secondes
+timefmt_unknown = inconnu
+status_msg = JUpload %1$d%% effectu\u00e9, debit: %2$s, dur\u00e9e restante: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Le fichier '%1$s' est trop gros (%2$s)
+
+#FileUploadThread
+preparingFile = Pr\u00e9paration du fichier %1$d/%2$d
+infoUploading = Upload du(des) fichier(s) %1$s en cours
+infoUploaded = Fichier(s) %1$s upload\u00e9. En attente de la r\u00e9ponse du serveur ...
+infoAborted = Upload interrompu apr\u00e8s %1$d fichier(s).
+nbUploadedFiles = %1$d fichier(s) upload\u00e9(s)
+errDuringUpload = Upload arr\u00eat\u00e9 avec erreur
+errHttpResponse = La r\u00e9ponse HTTP du serveur ne correspond pas aux crit\u00e8res de succ\u00e8s. L'upload a \u00e9chou\u00e9.
+questionSendMailOnError = Une erreur s'est produite durant l'upload. Voulez-vous envoyer un mail au webmaster, lui donnant toutes les informations disponibles ?
+
+#DialogUploadRetry
+dialogUploadRetryText = Une erreur s'est produite lors de l'envoi (upload) des fichiers vers le serveur. Voulez-vous r\u00e9ssayer l'upload de ces fichiers ?\n\nL'upload sera automatiquement r\u00e9-ex\u00e9cut\u00e9s dans %1$d secondes.
+dialogUploadRetryTitle = R\u00e9-essayer l'upload ?
+buttonDetails = D\u00e9tails
+buttonYes = Oui
+buttonNo = Non
+
+#FileUploadManagerThread
+errorDuringUpload = L'erreur suivante est survenue durant l'upload :\n%1$s\n\nVoulez-vous continuer cet upload vers le serveur ?
+
+#FilePanelDataModel
+colName = Nom
+colSize = Taille
+colDirectory = R\u00e9pertoire
+colModified = Modifi\u00e9 le
+colReadable = Lisible?
+errForbiddenExtension = Extention de fichier interdite
+
+#DefaultUploadPolicy
+errDuringLogManagement = Une erreur est survenue durant la gestion des logs
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Choisissez d'abord un album.
+coppermineUploadOk = Les images ont \u00e9t\u00e9 charg\u00e9es sur le serveur, dans l'album s\u00e9lectionn\u00e9.\n\nCliquez sur Ok pour aller mettre des noms et commentaires \u00e0 ces images.\n\nN'oubliez pas ensuite de cliquer sur le bouton 'Appliquer les modifications' pour envoyer vos commentaires sur le serveur!
+
+#PictureFileData
+tooBigPicture = L'image '%1$s' est trop grosse. Elle sera envoy\u00e9e sans modification (rotation...)
+notAPicture = Le fichier '%1$s' n'est pas une image. Il n'est pas ajout\u00e9 \u00e0 la liste des fichiers \u00e0 transf\u00e9rer.
+
+#PictureDialog
+buttonClose = Fermer
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = o
+unitGigabytes = Go
+unitMegabytes = Mo
+unitKilobytes = ko
+
+#sendDebugInformation
+Confirm = Confirmez
+
+#InteractiveTrustManager
+itm_title_pass = Entrez mot de passe pour %1$s
+itm_prompt_pass = Mot de passe pour %1$s:
+itm_cert_alert = Alerte pour le SSL Certificate
+itm_cert_details = D\u00e9tails du certificat:
+itm_cert_subject = Sujet:
+itm_cert_issuer = Emetteur:
+itm_cert_nbefore = Pas avant:
+itm_cert_nafter = Pas apr\u00e8s:
+itm_cert_serial = Num\u00e9ro de s\u00e9rie:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Pays:
+itm_cert_CN = Nom commun:
+itm_cert_L = Localit\u00e9:
+itm_cert_ST = Etat ou province:
+itm_cert_O = Organisation:
+itm_cert_OU = Unit\u00e9 d'Organisation:
+itm_reasons = Raison(s):
+itm_reason_cnmatch = Le nom commun du certificate ne correspond pas au nom de domaine (%1$s).
+itm_reason_itrust = L'\u00e9metteur du Certificat n'est pas de confiance.
+itm_reason_expired = Le certificat aas expir\u00e9.
+itm_reason_notyet = Le certificate n'est pas encore valide.
+itm_fail_verify = Le certificat present\u00e9 par le serveur ne peut pas \u00eatre verifi\u00e9.
+itm_accept_prompt = Voulez-vous accepter ce certificat ?
+itm_accept_always = Toujours
+itm_accept_now = Uniquement pour cette session
+itm_accept_no = Non
+itm_new_tstore = Nouveau magasin
+itm_tstore = Magasin
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_es.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_es.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_es.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Spanish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = spanish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Examinar ...
+buttonRemoveSelected = Eliminar seleccionados
+buttonRemoveAll = Eliminar todos
+buttonRotateLeft = Girar izqda
+buttonRotateRight = Girar drcha
+buttonUpload = Subir
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparando fichero %1$d/%2$d
+infoUploading = Subiendo ficheros %1$s
+infoUploaded = %1$s fichero(s) subidos. Esperando la respuesta del servidor...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d ficheros subidos
+errDuringUpload = La carga se detuvo con errores
+errHttpResponse = La respuesta del servidor HTTP no cumple los requisitos. La carga ha fallado.
+questionSendMailOnError = Ocurri\u00f3 un error durante la carga. \u00bfDesea enviar la informaci\u00f3n relevante al webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nombre
+colSize = Tama\u00f1o
+colDirectory = Carpeta
+colModified = Modificado
+colReadable = \u00bfLegible?
+errForbiddenExtension = Extensi\u00a2n de archivo prohibida.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Ocurri\u00f3 un error durante la gesti\u00f3n del log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Por favor, seleccione antes un \u00e1lbum.
+coppermineUploadOk = Las im\u00e1genes han sido subidas correctamente al servidor y colocadas en el \u00e1lbum seleccionado.\n\nPulse sobre OK para a\u00f1adir nombres y comentarios a estas im\u00e1genes.\n\nNo olvide pulsar sobre el bot\u00f3n 'Aplicar cambios' para guardar los cambios en el servidor.
+
+#PictureFileData
+tooBigPicture = La imagen '%1$s' es demasiado grande. Ser\u00e1 subida sin cambios (rotaciones, cambio de tama\u00f1o...).
+notAPicture = El fichero denominado '%1$s' no es una imagen. No se a\u00f1adir\u00e1 a la lista de ficheros para subir.
+
+#PictureDialog
+buttonClose = Cerrar
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hr.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hr.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hr.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Croatian
+contributor = Bruno Simic
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = croatian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Pretra\u017ei...
+buttonRemoveSelected = Obri\u0161i izbor
+buttonRemoveAll = Obri\u0161i sve
+buttonRotateLeft = Rotiraj lijevo
+buttonRotateRight = Rotiraj desno
+buttonUpload = Po\u0161alji
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Datoteka %1$s je prevelika (%2$s)
+
+#FileUploadThread
+preparingFile = Pripremam datoteku %1
+infoUploading = \u0160aljem datoteku %1
+infoUploaded = Datoteka %1 poslana. \u010cekam informacije sa servera ...
+infoAborted = Slanje prekinuto nakon %1. datoteke.
+nbUploadedFiles = %1 datoteka poslano
+errDuringUpload = Slanje prekinuto sa gre\u0161kom
+errHttpResponse = Slanje neuspje\u0161no: nepoznati HTTP odgovor
+questionSendMailOnError = Gre\u0161ka priliko slanja datoteka. Da li do informacije o gre\u0161ki po\u0161aljem webmasteru?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Veli\u010dina
+colDirectory = Direktorij
+colModified = Promjenjeno
+colReadable = \u010citljivo?
+#MISSING  errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Gre\u0161ka u log zapisu
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Molimo prvo izaberite album.
+coppermineUploadOk = Slike uspje\u0161no poslane na server u izabrani album.\n\nKliknite OK za pridru\u017eenje imena i komentara tim slikama.\n\nNe zaboravite potvrditi promjene klikom na 'Primijeni izmjene'. Samo nakon toga \u0107e promjene biti pohranjene na server !
+
+#PictureFileData
+tooBigPicture = Datoteka %1 je prevelika i biti \u0107e poslana nepromijenjena (bez rotacije, promjene veli\u010dine...).
+notAPicture = '%1' nije u grafi\u010dkom formatu i ne\u0107e biti dodana u listu za slanje.
+
+#PictureDialog
+buttonClose = Zatvori
+
+#DateRenderer
+dateformat = dd.MM.yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_nl.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_nl.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_nl.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Dutch
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = dutch
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bladeren ...
+buttonRemoveSelected = Selectie verwijderen
+buttonRemoveAll = Alles verwijderen
+buttonRotateLeft = Roteer linksom
+buttonRotateRight = Roteer rechtsom
+buttonUpload = Upload
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Bestand klaarmaken %1$d/%2$d
+infoUploading = Bestanden uploaden %1$s
+infoUploaded = Bestand(en) %1$s geuploaded. Wachten op server ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d bestanden geuploaded
+errDuringUpload = Upload afgebroken met fouten
+errHttpResponse = Verkeerde HTTP reactie van de server. Upload mislukt.
+questionSendMailOnError = Er is een fout opgetreden tijdens de upload. Wilt u een mail met alle relevante informatie naar de webmaster versturen?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Naam
+colSize = Bestandsgrootte
+colDirectory = Map
+colModified = Gewijzigd
+colReadable = Leesbaar?
+errForbiddenExtension = Verboden bestandstype.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Er is een fout opgetreden tijdens logboek beheer
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Selecteer eerst een album.
+coppermineUploadOk = De afbeeldingen zijn succesvol geplaatst op de server, in het geslecteerde album. \n\nKlik OK om bestandsnamen en opmerkingen te koppelen aan deze afbeeldingen.\n\nVergeet niet om op de knop \u2018Wijzigingen toepassen\u2019 te drukken!
+
+#PictureFileData
+tooBigPicture = Afbeelding '%1$s' is te groot. Het zal ongewijzigd geupload worden (geen rotatie, formaatwijziging...).
+notAPicture = Bestand '%1$s' is geen afbeelding. Het bestand is niet toegevoegd aan de lijst van uploads.
+
+#PictureDialog
+buttonClose = Sluiten
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pl.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pl.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_pl.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Polish
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = polish
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Przegl\u0105daj ...
+buttonRemoveSelected = Usu\u0144 zaznaczone
+buttonRemoveAll = Usu\u0144 wszystkie
+buttonRotateLeft = Obr\u00f3\u0107 w lewo
+buttonRotateRight = Obr\u00f3\u0107 w prawo
+buttonUpload = Prze\u015blij
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Uruchamianie transferu %1$d/%2$d
+infoUploading = Przesy\u0142anie plik\u00f3w %1$s
+infoUploaded = Plik(i) %1$s przes\u0142ane. Oczekiwanie na odpowied\u017a serwera ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d pliki przes\u0142ane
+errDuringUpload = Przesy\u0142anie przerwane z powodu b\u0142\u0119d\u00f3w
+errHttpResponse = Nie oczekiwana odpowied\u017a serwera HTTP. Przesy\u0142anie przerwane.
+questionSendMailOnError = W czasie przesy\u0142ania pojawi\u0142 si\u0119 b\u0142\u0105d. Czy chcesz przes\u0142a\u0107 do administratora informacje dotycz\u0105ce okoliczno\u015bci awarii?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nazwa
+colSize = Wielko\u015b\u0107
+colDirectory = Katalog
+colModified = Czas
+colReadable = Dost\u0119pny?
+errForbiddenExtension = Ulovlig filending.
+
+#DefaultUploadPolicy
+errDuringLogManagement = B\u0142\u0105d w czasie zarz\u0105dzania logiem
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosz\u0119 najpierw wybra\u0107 album..
+coppermineUploadOk = Zdj\u0119cia z wybranego albumu zosta\u0142y pomy\u015blnie przes\u0142ane na serwer. \n\nNaci\u015bnij przycisk Ok aby doda\u0107 nazwy i komentarze do tych zdj\u0119\u0107. \n\nNie zapomnij nacisn\u0105\u0107 przycisku 'Zapisz modyfikacj\u0119' aby zachowa\u0107 zmiany na serwerze !
+
+#PictureFileData
+tooBigPicture = Zdj\u0119cie '%1$s' jest za du\u017ce. Zostanie przes\u0142ane bez zmian (bez obracania, zmiany rozmiaru ...).
+notAPicture = Plik o nazwie '%1$s' nie jest zdj\u0119ciem. Nie zostanie dodany do listy plik\u00f3w do przes\u0142ania.
+
+#PictureDialog
+buttonClose = Zamknij
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_it.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_it.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_it.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Italian
+contributor = Manuele Grueff mgrueff@atipica.it
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = italian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Sfoglia...
+buttonRemoveSelected = Rimuovi selezionati
+buttonRemoveAll = Rimuovi tutto
+buttonRotateLeft = Ruota a sinistra
+buttonRotateRight = Ruota a destra
+buttonUpload = Carica
+buttonStop = FERMA
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d ore, %2$d min. e %3$d sec.
+timefmt_ms = %1$d min. e %2$d sec.
+timefmt_s = %1$d secondi
+timefmt_unknown = sconosciuto
+status_msg = JUpload %1$d%% eseguito, Velocit&#225;: %2$s, Tempo rimanente: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = La lunghezza del file '%1$s' &#232; eccessiva (%2$s)
+
+#FileUploadThread
+preparingFile = Preparazione file %1$d/%2$d
+infoUploading = Caricamento dei file %1$s
+infoUploaded = File %1$s pubblicato/i. In attesa della risposta del server ...
+infoAborted = Upload interrotto dopo %1$d file.
+nbUploadedFiles = %1$d file pubblicati
+errDuringUpload = Upload bloccato per errori
+errHttpResponse = La risposta del server HTTP ha segnalato un errore. L'upload &#232; fallito.
+questionSendMailOnError = Si &#232; verificato un errore durante l'upload. Vuoi segnalarlo al tuo webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Nome
+colSize = Dimensioni
+colDirectory = Cartella
+colModified = Ultima modifica
+colReadable = Leggibile?
+errForbiddenExtension = Estensione file non consentita.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Si &#232; verificato un errore durante il log
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Per favore scegli prima un album.
+coppermineUploadOk = Le immagini sono state caricate correttamente nel server, nell'album selezionato\n\nClicca su Ok per associare nomi e commenti alle immagini.\n\nNon dimenticare di cliccare sul bottone 'Apply modification' per salvare le tue modifiche sul server!
+
+#PictureFileData
+tooBigPicture = L'immagine '%1$s' &#232; troppo grande. Sar&#225; caricato senza modifiche (rotazione, ridimensionamento...).
+notAPicture = Il file chiamato '%1$s' non &#232; un'immagine. Non &#232; stato aggiunto alla lista dei files caricati.
+
+#PictureDialog
+buttonClose = Chiudi
+
+#DateRenderer
+dateformat = dd-MM-yyyy hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = Gb
+unitMegabytes = Mb
+unitKilobytes = Kb
+
+#sendDebugInformation
+Confirm = Conferma
+
+#InteractiveTrustManager
+itm_title_pass = Inserisci %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = Avviso certificato SSL
+itm_cert_details = Dettagli del certificato:
+itm_cert_subject = Soggetto:
+itm_cert_issuer = Autorit\u00e0 che lo rilascia:
+itm_cert_nbefore = Valido a partire da:
+itm_cert_nafter = Valido fino a:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Nazione (C):
+itm_cert_CN = Common name (CN):
+itm_cert_L = Localit&#225; (L):
+itm_cert_ST = Stato o provincia (ST):
+itm_cert_O = Organizzazione (O):
+itm_cert_OU = Unit\u00e0 organizzazionale (OU):
+itm_reasons = Ragioni:
+itm_reason_cnmatch = Il common name del certificato non corrisponde allo hostname (%1$s).
+itm_reason_itrust = L'autorit\u00e0 che ha rilasciato il certificato non &#232; affidabile.
+itm_reason_expired = Il certificato &#232; scaduto.
+itm_reason_notyet = Il certificato non &#232; ancora valido.
+itm_fail_verify = Non &#232; stato possibile verificare Il certificato fornito dal server.
+itm_accept_prompt = Volete accettare questo certificato?
+itm_accept_always = Sempre
+itm_accept_now = Solo per questa sessione
+itm_accept_no = No
+itm_new_tstore = Nuovo TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hu.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hu.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_hu.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Hungarian
+contributor = R\u00e9zs\u00f3 G\u00e1bor <gabor.rezso@gmail.com>
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = hungarian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Tall\u00f3z ...
+buttonRemoveSelected = Kiv\u00e1lasztott elt\u00e1vol\u00edt\u00e1sa
+buttonRemoveAll = Mind elt\u00e1vol\u00edt\u00e1sa
+buttonRotateLeft = Forgat balra
+buttonRotateRight = Forgat Jobbra
+buttonUpload = Felt\u00f6lt
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d \u00f3ra, %2$d perc \u00e9s %3$d m\u00e1sodperc.
+timefmt_ms = %1$d perc \u00e9s %2$d m\u00e1sodperc.
+timefmt_s = %1$d m\u00e1sodperc
+timefmt_unknown = ismeretlen
+status_msg = JUpload %1$d%% k\u00e9sz, \u00c1tvitel: %2$s, H\u00e1tral\u00e9v\u0151 id\u0151: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = A '%1$s' m\u00e9ret\u0171 k\u00e9p nagyobb mint a megengedett (%2$s)
+
+#FileUploadThread
+preparingFile = El\u0151k\u00e9sz\u00edt\u00e9s %1$d/%2$d
+infoUploading = K\u00e9pek felt\u00f6lt\u00e9se %1$s
+infoUploaded = %1$s k\u00e9p felt\u00f6ltve. V\u00e1rakoz\u00e1s szerver v\u00e1laszra ...
+infoAborted = Felt\u00f6lt\u00e9s %1$d f\u00e1jl ut\u00e1n megszak\u00edtva.
+nbUploadedFiles = %1$d k\u00e9p felt\u00f6ltve
+errDuringUpload = A felt\u00f6lt\u00e9s hiba miatt le\u00e1llt
+errHttpResponse = A felt\u00f6lt\u00e9s sikertelen: v\u00e1ratlan HTTP hiba
+questionSendMailOnError = A felt\u00f6lt\u00e9s sor\u00e1n hiba t\u00f6rt\u00e9nt. Elk\u00fcldj\u00fck a hibajelent\u00e9st a webmesternek?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e9v
+colSize = M\u00e9ret
+colDirectory = K\u00f6nyvt\u00e1r
+colModified = M\u00f3dos\u00edtva
+colReadable = Olvashat\u00f3?
+errForbiddenExtension = Tiltott kiterjeszt\u00e9s.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Hiba t\u00f6rt\u00e9nt a napl\u00f3z\u00e1s k\u00f6zben
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = El\u0151sz\u00f6r v\u00e1lassz albumot.
+coppermineUploadOk = A k\u00e9pek felt\u00f6lt\u00e9se a megfelel\u0151 albumba sikeres volt.\n\nklikk az OK gombra a nevek be\u00e1ll\u00edt\u00e1s\u00e1hoz.\n\nNe felejts az alkalmaz gombra kattintani az adatok ment\u00e9s\u00e9hez !
+
+#PictureFileData
+tooBigPicture = A '%1$s' k\u00e9p m\u00e9rete t\u00fal nagyi. Ez a k\u00e9p m\u00f3dos\u00edt\u00e1s n\u00e9lk\u00fcl ker\u00fcl felt\u00f6lt\u00e9sre(nincs forgat\u00e9s, \u00e1tm\u00e9retez\u00e9s).
+notAPicture = A '%1$s' f\u00e1jl nem k\u00e9p t\u00edpus\u00fa. \u00cdgy nem ker\u00fcl a felt\u00f6lt\u00e9sre v\u00e1r\u00f3 list\u00e1ba.
+
+#PictureDialog
+buttonClose = Bez\u00e1r
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Add meg %1$s jelsz\u00f3t
+itm_prompt_pass = %1$s jelsz\u00f3:
+itm_cert_alert = SSL Bizony\u00edtv\u00e1ny figyelmeztet\u00e9s
+itm_cert_details = Bizony\u00edtv\u00e1ny adatai:
+itm_cert_subject = T\u00e1rgy:
+itm_cert_issuer = Kibocs\u00e1t\u00f3:
+itm_cert_nbefore = Nem kor\u00e1bban:
+itm_cert_nafter = Nem k\u00e9s\u0151bb:
+itm_cert_serial = Sorozatsz\u00e1m:
+itm_cert_fprint = %1$s ujjlenyomat :
+itm_cert_C = Orsz\u00e1g:
+itm_cert_CN = N\u00e9v:
+itm_cert_L = Sz\u00e1rmaz\u00e1s:
+itm_cert_ST = Megye:
+itm_cert_O = Szervezet:
+itm_cert_OU = Szervezeti egys\u00e9g:
+itm_reasons = Ok:
+itm_reason_cnmatch = A bizony\u00edtv\u00e1ny neve nem egyezik a szerver c\u00edm\u00e9vel (%1$s).
+itm_reason_itrust = A bizony\u00edtv\u00e1ny kibocs\u00e1t\u00f3 nem megb\u00edzhat\u00f3.
+itm_reason_expired = A bizony\u00edtv\u00e1ny lej\u00e1rt.
+itm_reason_notyet = A bizony\u00edtv\u00e1ny m\u00e9g nem \u00e9rv\u00e9nyes.
+itm_fail_verify = A bizony\u00edtv\u00e1ny, nem ellen\u0151r\u00edzhet\u0151.
+itm_accept_prompt = Elfogadod a bizony\u00edtv\u00e1nyt?
+itm_accept_always = mindig
+itm_accept_now = csak a jelenlegi munkaf\u00e1zisban
+itm_accept_no = Nem
+itm_new_tstore = \u00daj BizalomT\u00e1r
+itm_tstore = BizalomT\u00e1r
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_no.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_no.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_no.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Norwegian
+contributor = Unkown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = norwegian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Bla gjennom ...
+buttonRemoveSelected = Fjern valgte
+buttonRemoveAll = Fjern alle
+buttonRotateLeft = Roter venstre
+buttonRotateRight = Roter h\u00f8yre
+buttonUpload = Last opp
+buttonStop = STOPP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d tim., %2$d min. and %3$d sek.
+timefmt_ms = %1$d min. and %2$d sek.
+timefmt_s = %1$d sekunder
+timefmt_unknown = ukjent
+status_msg = JUpload %1$d%% ferdig, overf\u00f8ringshastighet: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Filen '%1$s' er for stor (%2$s)
+
+#FileUploadThread
+preparingFile = Forbereder fil %1$d/%2$d
+infoUploading = Laster opp filer %1$s
+infoUploaded = %1$s fil(er) lastet opp. Venter p\u00e5 serverrespons ...
+infoAborted = Opplasting avbrutt etter %1$d fil(er).
+nbUploadedFiles = %1$d fil(er) lastet opp
+errDuringUpload = Opplastingen stoppet med feil
+errHttpResponse = Opplastingen feilet: uventet HTTP respons
+questionSendMailOnError = Det skjedde en feil under opplasting. \u00d8nsker du \u00e5 sende all relevant informasjon til webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Navn
+colSize = St\u00f8rrelse
+colDirectory = Katalog
+colModified = Endret
+colReadable = Lesbar?
+errForbiddenExtension = Ugyldig filetternavn.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Det skjedde en feil under loggbehandlingen
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u00e6r vennlig og velg et album f\u00f8rst
+coppermineUploadOk = Bildene har blitt korrekt lastet opp til serveren, i det valgte albumet.\n\nKlikk OK n\u00e5 for \u00e5 fullf\u00f8re opplastingen.\n\nIkke glem \u00e5 lagre eventuelle endringer du har gjort.
+
+#PictureFileData
+tooBigPicture = Bilde '%1$s' er for stort. Bildet vil bli lastet opp uten endringer (ingen rotering eller endring av st\u00f8rrelse ...).
+notAPicture = Filen '%1$s' er ikke en gyldig bildefil. Den er ikke lagt til i listen over filer som skal lastes opp.
+
+#PictureDialog
+buttonClose = Lukk
+
+#DateRenderer
+dateformat = dd.MM.yyyy HH:mm
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Bekreft
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sk.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sk.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sk.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovak
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovak
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = H\u013eada\u0165 ...
+buttonRemoveSelected = Odstr\u00e1ni\u0165 Vybran\u00e9
+buttonRemoveAll = Odstr\u00e1ni\u0165 V\u0161etky
+buttonRotateLeft = Oto\u010di\u0165 v\u013eavo
+buttonRotateRight = Oto\u010di\u0165 vpravo
+buttonUpload = Odosla\u0165
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. a %3$d sec.
+timefmt_ms = %1$d min. a %2$d sec.
+timefmt_s = %1$d sek\u00fand
+timefmt_unknown = nezn\u00e1my
+status_msg = JUpload %1$d%% hotovo, R\u00fdchlos\u0165 prenosu: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Ve\u013ekos\u0165 s\u00faboru pre '%1$s' je prive\u013ek\u00e1 (%2$s)
+
+#FileUploadThread
+preparingFile = Pripravujem s\u00fabor %1$d/%2$d
+infoUploading = Odosielam s\u00fabory %1$s
+infoUploaded = %1$s s\u00fabor(y/ov) odoslan\u00fdch. \u010cak\u00e1 sa na odpove\u010f servera ...
+infoAborted = Odosielanie zru\u0161en\u00e9 po %1$d S\u00fabore(och).
+nbUploadedFiles = %1$d s\u00fabor(y/ov) odoslan\u00fdch
+errDuringUpload = Odosielanie zastaven\u00e9 chybami
+errHttpResponse = Odosielanie ne\u00faspe\u0161n\u00e9: neo\u010dak\u00e1van\u00e1 HTTP odpove\u010f
+questionSendMailOnError = Po\u010das odosielania sa vyskytla chyba. Chcete zasla\u0165 potrebn\u00e9 inform\u00e1cie spr\u00e1vcovi str\u00e1nok?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = N\u00e1zov
+colSize = Ve\u013ekos\u0165
+colDirectory = Adres\u00e1r
+colModified = Zmenen\u00e9
+colReadable = \u010citate\u013en\u00e9?
+errForbiddenExtension = Nepovolen\u00e1 koncovka s\u00faboru.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Pros\u00edm, vyberte najsk\u00f4r album.
+coppermineUploadOk = Obr\u00e1zky boli v poriadku nahrat\u00e9 na server, do vybran\u00e9ho albumu.\n\nKliknite na OK, pre doplnenie n\u00e1zvov a koment\u00e1rov k t\u00fdmto obr\u00e1zkom.\n\nNezabudnite klikn\u00fa\u0165 na tla\u010didlo 'Vykona\u0165 zmeny' pre ulo\u017eenie va\u0161ich zmien na server !
+
+#PictureFileData
+tooBigPicture = Obr\u00e1zok '%1$s' je pr\u00edli\u0161 ve\u013ek\u00fd. Bude odoslan\u00fd bez zmien (bez oto\u010den\u00ed, zmeny rozmerov...).
+notAPicture = S\u00fabor s n\u00e1zvom '%1$s' nie je obr\u00e1zok. Nie je preto pridan\u00fd do zoznamu s\u00faborov na odoslanie.
+
+#PictureDialog
+buttonClose = Zatvori\u0165
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Potvrdi\u0165
+
+#InteractiveTrustManager
+itm_title_pass = Vlo\u017ei\u0165 %1$s heslo
+itm_prompt_pass = %1$s heslo:
+itm_cert_alert = Upozornenie SSL Certifik\u00e1tu
+itm_cert_details = Detaily certifik\u00e1tu:
+itm_cert_subject = Predmet:
+itm_cert_issuer = Vydavate\u013e:
+itm_cert_nbefore = Platn\u00fd od:
+itm_cert_nafter = Platn\u00fd do:
+itm_cert_serial = S\u00e9riov\u00e9 \u010d\u00edslo:
+itm_cert_fprint = %1$s Otla\u010dok prsta:
+itm_cert_C = Krajina:
+itm_cert_CN = \u0160tandardn\u00fd n\u00e1zov:
+itm_cert_L = Lokalita:
+itm_cert_ST = \u0160t\u00e1t \u010di provincia:
+itm_cert_O = Organiz\u00e1cia:
+itm_cert_OU = Organizational unit:
+itm_reasons = D\u00f4vod(y):
+itm_reason_cnmatch = \u0160tandardn\u00fd n\u00e1zov certifik\u00e1tu nezodpoved\u00e1 n\u00e1zvu hostu (%1$s).
+itm_reason_itrust = Vydavate\u013e certifik\u00e1tu nie je d\u00f4veryhodn\u00fd.
+itm_reason_expired = Platnos\u0165 certifik\u00e1tu vypr\u0161ala.
+itm_reason_notyet = Certifik\u00e1t e\u0161te nie je platn\u00fd.
+itm_fail_verify = Certifik\u00e1t prijat\u00fd od serveru nebolo mo\u017en\u00e9 overi\u0165.
+itm_accept_prompt = Chcete prija\u0165 tento certifik\u00e1t?
+itm_accept_always = V\u017edy
+itm_accept_now = Iba pre tentokr\u00e1t
+itm_accept_no = Nie
+itm_new_tstore = Nov\u00fd TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sl.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sl.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_sl.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Slovenian
+contributor = Unknown
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = slovenian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = I\u0161\u010di ...
+buttonRemoveSelected = Odstrani ozna\u010dene
+buttonRemoveAll = Odstrani vse
+buttonRotateLeft = Zasukaj levo
+buttonRotateRight = Zasukaj desno
+buttonUpload = Nalo\u017ei
+buttonStop = STOP
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+#MISSING  speedunit_gb_per_second = Gb/s
+#MISSING  speedunit_mb_per_second = Mb/s
+#MISSING  speedunit_kb_per_second = Kb/s
+#MISSING  speedunit_b_per_second = b/s
+#MISSING  timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+#MISSING  timefmt_ms = %1$d min. and %2$d sec.
+#MISSING  timefmt_s = %1$d seconds
+#MISSING  timefmt_unknown = unknown
+#MISSING  status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+#MISSING  errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Datoteka v pripravi %1$d/%2$d
+infoUploading = Nalaganje datotek %1$s
+infoUploaded = Datoteke %1$s so nalo\u017eene. \u010cakam na odziv stre\u017enika ...
+#MISSING  infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d datoteke so nalo\u017eene
+errDuringUpload = Nalaganje zaustavljeno zaradi napake
+errHttpResponse = HTTP odgovor stre\u017enika ne ustreza kriterijem. Nalaganje se ni posre\u010dilo.
+questionSendMailOnError = Med nalaganjem je pri\u0161lo do napake. \u017delite to informacijo poslati skrbniku strani?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Ime
+colSize = Velikost
+colDirectory = Mapa
+colModified = Spremenjeno
+colReadable = Berljivo?
+errForbiddenExtension = Napa\u010dna kon\u010dnica datoteke.
+
+#DefaultUploadPolicy
+errDuringLogManagement = Med prijavo je pri\u0161lo do napake
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Prosim, najprej izberi album.
+coppermineUploadOk = Slike so se pravilno nalo\u017eile v izbrani album.\n\nKlikni OK za objavo imen in komentarjev k slikam.\n\nNe pozabi klikniti na gumb 'Upo\u0161tevaj spremembo'. Le tako bodo spremembe shranjene na stre\u017eniku!
+
+#PictureFileData
+tooBigPicture = Slika '%1$s' je prevelika. Nalo\u017eena bo brez sprememb (brez zasuka, spremembe velikosti ...).
+notAPicture = Datoteka z imenom '%1$s' ni slika in ni vklju\u010dena na seznam datotek za nalaganje.
+
+#PictureDialog
+buttonClose = Zapri
+
+#DateRenderer
+#MISSING  dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+#MISSING  unitBytes = b
+#MISSING  unitGigabytes = GiB
+#MISSING  unitMegabytes = MiB
+#MISSING  unitKilobytes = KiB
+
+#sendDebugInformation
+#MISSING  Confirm = Confirm
+
+#InteractiveTrustManager
+#MISSING  itm_title_pass = Enter %1$s password
+#MISSING  itm_prompt_pass = %1$s password:
+#MISSING  itm_cert_alert = SSL Certificate Alert
+#MISSING  itm_cert_details = Certificate details:
+#MISSING  itm_cert_subject = Subject:
+#MISSING  itm_cert_issuer = Issuer:
+#MISSING  itm_cert_nbefore = Not before:
+#MISSING  itm_cert_nafter = Not after:
+#MISSING  itm_cert_serial = Serial:
+#MISSING  itm_cert_fprint = %1$s Fingerprint:
+#MISSING  itm_cert_C = Country:
+#MISSING  itm_cert_CN = Common name:
+#MISSING  itm_cert_L = Locality:
+#MISSING  itm_cert_ST = State or province:
+#MISSING  itm_cert_O = Organization:
+#MISSING  itm_cert_OU = Organizational unit:
+#MISSING  itm_reasons = Reason(s):
+#MISSING  itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+#MISSING  itm_reason_itrust = Certificate issuer is not trusted.
+#MISSING  itm_reason_expired = The certificate is expired.
+#MISSING  itm_reason_notyet = The certificate is not yet valid.
+#MISSING  itm_fail_verify = The certificate, presented by the server could not be verified.
+#MISSING  itm_accept_prompt = Do you want to accept this certificate?
+#MISSING  itm_accept_always = Always
+#MISSING  itm_accept_now = Only for this session
+#MISSING  itm_accept_no = No
+#MISSING  itm_new_tstore = New TrustStore
+#MISSING  itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = English (default language file)
+contributor = Core translation file (no contributor)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = english
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = Browse ...
+buttonRemoveSelected = Remove Selected
+buttonRemoveAll = Remove All
+buttonRotateLeft = Rotate left
+buttonRotateRight = Rotate right
+buttonUpload = Upload
+buttonStop = STOP
+messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d seconds
+timefmt_unknown = unknown
+status_msg = JUpload %1$d%% done, Transfer rate: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = The file length for '%1$s' is too big (%2$s)
+
+#FileUploadThread
+preparingFile = Preparing file %1$d/%2$d
+infoUploading = Uploading files %1$s
+infoUploaded = %1$s file(s) uploaded. Waiting for server response ...
+infoAborted = Upload aborted after %1$d File(s).
+nbUploadedFiles = %1$d file(s) uploaded
+errDuringUpload = Upload stopped with errors
+errHttpResponse = Upload failed: unexpected HTTP response
+questionSendMailOnError = An error occurred during upload. Do you want to send all relevant information to the webmaster?
+
+#DialogUploadRetry
+dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+dialogUploadRetryTitle = Retry the upload?
+buttonDetails = Details
+buttonYes = Yes
+buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = Name
+colSize = Size
+colDirectory = Directory
+colModified = Modified
+colReadable = Readable?
+errForbiddenExtension = Forbidden file extension.
+
+#DefaultUploadPolicy
+errDuringLogManagement = An error occurred during log management
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = Please, choose an album first.
+coppermineUploadOk = The pictures have been correctly loaded on the server, in the selected album.\n\nClick on Ok now to associate names and comments to these pictures.\n\nDon't forget to click on the 'Apply modification button' to save your modifications on the server !
+
+#PictureFileData
+tooBigPicture = Picture '%1$s' is too big. It will be uploaded unchanged (no rotation, resizing...).
+notAPicture = The file named '%1$s' is not a picture. It is not added to the list of files to be uploaded.
+
+#PictureDialog
+buttonClose = Close
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GiB
+unitMegabytes = MiB
+unitKilobytes = KiB
+
+#sendDebugInformation
+Confirm = Confirm
+
+#InteractiveTrustManager
+itm_title_pass = Enter %1$s password
+itm_prompt_pass = %1$s password:
+itm_cert_alert = SSL Certificate Alert
+itm_cert_details = Certificate details:
+itm_cert_subject = Subject:
+itm_cert_issuer = Issuer:
+itm_cert_nbefore = Not before:
+itm_cert_nafter = Not after:
+itm_cert_serial = Serial:
+itm_cert_fprint = %1$s Fingerprint:
+itm_cert_C = Country:
+itm_cert_CN = Common name:
+itm_cert_L = Locality:
+itm_cert_ST = State or province:
+itm_cert_O = Organization:
+itm_cert_OU = Organizational unit:
+itm_reasons = Reason(s):
+itm_reason_cnmatch = The certificate common name does not match the hostname (%1$s).
+itm_reason_itrust = Certificate issuer is not trusted.
+itm_reason_expired = The certificate is expired.
+itm_reason_notyet = The certificate is not yet valid.
+itm_fail_verify = The certificate, presented by the server could not be verified.
+itm_accept_prompt = Do you want to accept this certificate?
+itm_accept_always = Always
+itm_accept_now = Only for this session
+itm_accept_no = No
+itm_new_tstore = New TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ro.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ro.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_ro.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Romanian (idem to Moldova)
+contributor = Adrian (nickname: ady1503) (mail: gallery@butnarumd.com)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = romanian
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = R\u0103sfoire ...
+buttonRemoveSelected = \u00cenl\u0103tura\u0163i selectat
+buttonRemoveAll = Elimin\u0103 Tot
+buttonRotateLeft = Rotire st\u00eenga
+buttonRotateRight = Rotire dreapta
+buttonUpload = \u00cencarc\u0103
+buttonStop = OPRE\u015eTE
+messageLogWindowCopiedToClipboard = Mesaje de depanare au fost copiate \u00een clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$dh, %2$d min. and %3$d sec.
+timefmt_ms = %1$d min. and %2$d sec.
+timefmt_s = %1$d secunde
+timefmt_unknown = ne\u015ftiut
+status_msg = JUpload %1$d%% a terminat, rat\u0103 de transfer: %2$s, ETA: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = Lungimea de fi\u015fier pentru '%1$s' este prea mare (%2$s)
+
+#FileUploadThread
+preparingFile = Pregatirea de fi\u015fier %1$d/%2$d
+infoUploading = \u00cenc\u0103rcare de fi\u015fiere %1$s
+infoUploaded = %1$s fi\u015fier(e) \u00eenc\u0103rcate. \u00cen a\u015fteptare pentru r\u0103spunsul serverului ...
+infoAborted = \u00cenc\u0103rcare oprit\u0103 dup\u0103 %1$d Fi\u015fier(e).
+nbUploadedFiles = %1$d fi\u015fier(e) \u00eenc\u0103rcate
+errDuringUpload = \u00cenc\u0103rcare oprit\u0103 cu erori
+errHttpResponse = \u00cenc\u0103rcare e\u015fuat\u0103: r\u0103spuns nea\u015fteptat HTTP
+questionSendMailOnError = A ap\u0103rut o eroare \u00een timpul \u00eenc\u0103rc\u0103rii. Vrei s\u0103 trimit\u0103 toate informa\u0163iile relevante pentru webmaster?
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+errorDuringUpload = A ap\u0103rut urm\u0103toarea eroare \u00een timpul \u00eenc\u0103rc\u0103rii:\n%1$s\n\nVrei s\u0103 mergi mai departe cu \u00eenc\u0103rcare curent\u0103?
+
+#FilePanelDataModel
+colName = Nume
+colSize = Volum
+colDirectory = Director
+colModified = Modificat
+colReadable = Poate fi citit?
+errForbiddenExtension = Interzis\u0103 extensiunea de fi\u015fier.
+
+#DefaultUploadPolicy
+errDuringLogManagement = O eroare a ap\u0103rut \u00een timpul de gestionare a \u00eenregistr\u0103rii
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = V\u0103 rug\u0103m, alege\u0163i un album prima dat\u0103.
+coppermineUploadOk = Fotografiile au fost corect \u00eenc\u0103rcate pe server, \u00een albumul selectat.\n\nFace\u0163i clic pe OK acum pentru a asocia numele \u015fi comentariile la aceste imagini.\n\nNu uita\u0163i s\u0103 face\u0163i clic pe butonul 'Apply modification button' pentru a salva modific\u0103rile dvs. de pe server!
+
+#PictureFileData
+tooBigPicture = Imaginea '%1$s' este prea mare. Acesta va fi \u00eenc\u0103rcat\u0103 neschimbat\u0103 (f\u0103r\u0103 rota\u0163ie, redimensionare ...).
+notAPicture = Fi\u015fier numit '%1$s' nu este o imagine. El nu se adaug\u0103 la lista de fi\u015fiere care urmeaz\u0103 s\u0103 fie \u00eenc\u0103rcate.
+
+#PictureDialog
+buttonClose = \u00cenchide
+
+#DateRenderer
+dateformat = hh:mm dd-MM-yyyy aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = b
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = Confirma\u0163i
+
+#InteractiveTrustManager
+itm_title_pass = Introduce\u0163i %1$s parola
+itm_prompt_pass = %1$s parola:
+itm_cert_alert = SSL Certificat alert\u0103
+itm_cert_details = Detaliile certificatului:
+itm_cert_subject = Subiect:
+itm_cert_issuer = Emitentul:
+itm_cert_nbefore = Nu \u00eenainte de:
+itm_cert_nafter = Nu dup\u0103:
+itm_cert_serial = Serie:
+itm_cert_fprint = %1$s Amprent\u0103 digital\u0103:
+itm_cert_C = \u0162ar\u0103:
+itm_cert_CN = Nume comun:
+itm_cert_L = Localitatea:
+itm_cert_ST = Statul sau provincia:
+itm_cert_O = Organiza\u0163ia:
+itm_cert_OU = Unitate organiza\u0163ional\u0103:
+itm_reasons = Motiv(e):
+itm_reason_cnmatch = Certificatul cu denumirea comun\u0103 nu se potrive\u015fte cu numele de host (%1$s).
+itm_reason_itrust = Emitentului Certificatul nu este de \u00eencredere.
+itm_reason_expired = Certificatul este expirat.
+itm_reason_notyet = Certificatul nu este \u00eenc\u0103 valabil.
+itm_fail_verify = Certificatul, prezentat de server nu a putut fi verificat.
+itm_accept_prompt = Dori\u0163i s\u0103 accepta\u0163i acest certificat?
+itm_accept_always = \u00centotdeauna
+itm_accept_now = Numai pentru aceast\u0103 sesiune
+itm_accept_no = Nu
+itm_new_tstore = Nou TrustStore
+itm_tstore = TrustStore
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-16_to_unicode/lang_zh.properties	(revision 3951)
@@ -0,0 +1,153 @@
+#
+#
+# HOW TO ADD PROPERTIES:
+#     If you want to add new properties, either create your own lang files, or add this property first to the 
+#		lang.properties file, which is the reference for all existing properties. 
+#		Each property missing in lang.properties, will be removed from all other properties file in the next execution 
+#		of build_translation.xml 
+#
+#
+# HOW TO UPDATE TRANSLATIONS:
+# All information for contributors is available here:
+# 
+# http://jupload.sourceforge.net/howto-translation.html
+#
+#
+# QUICK DESCRIPTION:
+# Please update the files in the /src/translation/applet.utf-16 directory.
+# As the directory is named, they are all in UTF-16 format. Then execute the build_translation.xml file, to 
+# report these modifications to the wjhk/jupload/lang pacakge, for use in the applet.
+#
+# Doing this, allows: 
+# - To have all translation in Human readable text, instead of unicode text. 
+# - To mark all missing text, in other languages (important note: the lang.properties file is the reference for all properties).
+#
+#
+# The %1$d (and similar) code sequences are placeholders for variable substitution,
+# The sequence %% represents a single percent-character. 
+
+##########################################################################################################################
+#First section: general information about this translation.
+##########################################################################################################################
+#These parameters are used by the jupload-translation plugin, when managing the translation files
+#They are used to generate the transation part of JUpload web site, to display existing translations to translators. They
+#can then check translation, and submit updated or new translations.
+generateHtmlFileForTranslators = true
+language = Chinese simplified
+contributor = bluesway (u93530054@ccu.edu.tw and bluesway@mail2000.com.tw)
+#A link to the Coppermine plugin language file. No link with the applet itself. This plugin
+#uses the applet, and I linked both translations this way.
+coppermine.language = chinese_gb
+##########################################################################################################################
+
+
+##########################################################################################################################
+#Second section: the translation itself.
+##########################################################################################################################
+
+#JUploadPanel
+buttonBrowse = \u700f\u89bd ...
+buttonRemoveSelected = \u79fb\u9664\u9078\u64c7\u7684\u6a94\u6848
+buttonRemoveAll = \u79fb\u9664\u6240\u6709\u6a94\u6848
+buttonRotateLeft = \u9006\u6642\u91dd\u65cb\u8f49
+buttonRotateRight = \u9806\u6642\u91dd\u65cb\u8f49
+buttonUpload = \u4e0a\u50b3
+buttonStop = \u4e2d\u6b62\u4e0a\u50b3
+#MISSING  messageLogWindowCopiedToClipboard = Debugging messages have been copied to the clipboard.
+#JUploadPanel, The components of the status line
+speedunit_gb_per_second = Gb/s
+speedunit_mb_per_second = Mb/s
+speedunit_kb_per_second = Kb/s
+speedunit_b_per_second = b/s
+timefmt_hms = %1$d\u5c0f\u6642%2$d\u5206%3$d\u79d2
+timefmt_ms = %1$d\u5206%2$d\u79d2
+timefmt_s = %1$d\u79d2
+timefmt_unknown = \u672a\u77e5
+status_msg = JUpload\u5df2\u5b8c\u6210%1$d%%, \u50b3\u8f38\u901f\u7387: %2$s, \u9810\u4f30\u6642\u9593: %3$s
+
+#JUploadExceptionTooBigFile
+errFileTooBig = \u6a94\u6848\u5927\u5c0f '%1$s' \u5df2\u8d85\u51fa\u4e0a\u9650\uff01(%2$s)
+
+#FileUploadThread
+preparingFile = \u6a94\u6848%1$d/%2$d\u6e96\u5099\u4e2d...
+infoUploading = \u6b63\u5728\u4e0a\u50b3%1$s
+infoUploaded = %1$s\u6a94\u6848\u5df2\u4e0a\u50b3\uff0c\u7b49\u5f85\u4f3a\u670d\u5668\u56de\u61c9\u4e2d\u2026
+infoAborted = \u4e0a\u50b3\u4e2d\u65b7\uff0c\u5df2\u50b3\u9001%1$d\u6a94\u6848
+nbUploadedFiles = %1$d\u6a94\u6848\u5df2\u4e0a\u50b3
+errDuringUpload = \u50b3\u8f38\u932f\u8aa4\uff0c\u4e0a\u50b3\u5df2\u4e2d\u6b62
+errHttpResponse = \u4e0a\u50b3\u5931\u6557\uff1a\u932f\u8aa4\u7684HTTP\u56de\u61c9
+questionSendMailOnError = \u4e0a\u50b3\u6642\u767c\u751f\u932f\u8aa4\u3002\u662f\u5426\u50b3\u9001\u76f8\u95dc\u8cc7\u8a0a\u7d66\u7db2\u7ad9\u7ba1\u7406\u54e1\uff1f
+
+#DialogUploadRetry
+#MISSING  dialogUploadRetryText = An error occurs occured during the upload of the files to the server. Do you want to retry uploading these files?\n\nThe upload will automatically be re-executed in %1$d seconds.
+#MISSING  dialogUploadRetryTitle = Retry the upload?
+#MISSING  buttonDetails = Details
+#MISSING  buttonYes = Yes
+#MISSING  buttonNo = No
+
+#FileUploadManagerThread
+#MISSING  errorDuringUpload = The following error occured during upload:\n%1$s\n\nDo you want to go on with the current upload?
+
+#FilePanelDataModel
+colName = \u540d\u7a31
+colSize = \u5927\u5c0f
+colDirectory = \u76ee\u9304
+colModified = \u4fee\u6539\u65e5\u671f
+colReadable = \u8b80\u53d6\u6b0a\u9650
+errForbiddenExtension = \u4e0d\u5141\u8a31\u7684\u526f\u6a94\u540d
+
+#DefaultUploadPolicy
+errDuringLogManagement = \u8a18\u9304\u6a94\u7ba1\u7406\u767c\u751f\u932f\u8aa4
+
+#CoppermineFileUploadPolicy
+chooseAlbumFirst = \u8acb\u5148\u9078\u64c7\u76f8\u7c3f
+coppermineUploadOk = \u6a94\u6848\u5df2\u6b63\u78ba\u4e0a\u50b3\uff0c\u8acb\u6309\u78ba\u5b9a\u9375\u7e7c\u7e8c\u7de8\u8f2f\u6a94\u6848\u5167\u5bb9\n\n\u8acb\u6ce8\u610f\uff1a\u4fee\u6539\u5f8c\u8acb\u6309\u4e0b\u300c\u5957\u7528\u4fee\u6539\u300d\u9375\u4ee5\u66f4\u65b0\u8cc7\u6599\uff01
+
+#PictureFileData
+tooBigPicture = \u5716\u6a94'%1$s'\u5927\u5c0f\u8d85\u904e\u4e0a\u9650\uff0c\u4e0a\u50b3\u7121\u6cd5\u5957\u7528\u4efb\u4f55\u4fee\u6539
+notAPicture = \u6a94\u6848'%1$s'\u4e0d\u662f\u5716\u6a94\uff01\u4e0d\u5217\u5165\u4e0a\u50b3\u6e05\u55ae
+
+#PictureDialog
+buttonClose = \u95dc\u9589
+
+#DateRenderer
+dateformat = yyyy-MM-dd hh:mm aaa
+
+#SizeRenderer. See http://en.wikipedia.org/wiki/KiB
+unitBytes = B
+unitGigabytes = GB
+unitMegabytes = MB
+unitKilobytes = KB
+
+#sendDebugInformation
+Confirm = \u78ba\u8a8d
+
+#InteractiveTrustManager
+itm_title_pass = \u8f38\u5165%1$s\u5bc6\u78bc
+itm_prompt_pass = %1$s\u5bc6\u78bc:
+itm_cert_alert = SSL \u6191\u8b49\u8b66\u544a
+itm_cert_details = \u6191\u8b49\u5167\u5bb9\uff1a
+itm_cert_subject = \u6a19\u984c\uff1a
+itm_cert_issuer = \u767c\u884c\u8005\uff1a
+itm_cert_nbefore = \u767c\u884c\u65e5\uff1a
+itm_cert_nafter = \u5230\u671f\u65e5\uff1a
+itm_cert_serial = \u5e8f\u865f\uff1a
+itm_cert_fprint = %1$s\u6191\u8b49\u7c3d\u7ae0\uff1a
+itm_cert_C = \u570b\u5225\uff1a
+itm_cert_CN = \u4e00\u822c\u540d\u7a31\uff1a
+itm_cert_L = \u516c\u53f8\u540d\u7a31
+itm_cert_ST = \u5dde/\u7701\uff1a
+itm_cert_O = \u7d44\u7e54\u540d\u7a31\uff1a
+itm_cert_OU = \u7d44\u7e54\u55ae\u4f4d\uff1a
+itm_reasons = \u7406\u7531
+itm_reason_cnmatch = \u6191\u8b49\u4e00\u822c\u540d\u7a31\u8207\u4e3b\u6a5f\u540d\u7a31\u4e0d\u7b26(%1$s).
+itm_reason_itrust = \u6191\u8b49\u767c\u884c\u8005\u4e0d\u53d7\u4fe1\u4efb
+itm_reason_expired = \u6191\u8b49\u5df2\u904e\u671f
+itm_reason_notyet = \u6191\u8b49\u5c1a\u672a\u767c\u884c
+itm_fail_verify = \u7121\u6cd5\u9a57\u8b49\u4f3a\u670d\u5668\u63d0\u4f9b\u7684\u6191\u8b49
+itm_accept_prompt = \u662f\u5426\u63a5\u53d7\u6b64\u6191\u8b49\uff1f
+itm_accept_always = \u6c38\u9060\u63a5\u53d7
+itm_accept_now = \u672c\u6b21\u63a5\u53d7
+itm_accept_no = \u62d2\u7d55
+itm_new_tstore = \u65b0\u7684\u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
+itm_tstore = \u4fe1\u8cf4\u96fb\u5b50\u5546\u5e97
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/testGenerateDocForOneTranslation/lang_fr.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/testGenerateDocForOneTranslation/lang_fr.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/testGenerateDocForOneTranslation/lang_fr.properties.apt	(revision 3951)
@@ -0,0 +1,23 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (French_for_test)
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#A specific comment for this file. Should be removed in the generated file.
+aKey = C'est une clef
+aLastKey = C'est une derniÃšre clef\nAvec un passage Ã  la ligne!
+
+# these line will go to the beginning of the file, after plugin execution.
+language = French (for test)
+contributor = The French contributor
+
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang_fr.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang_fr.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang_fr.properties	(revision 3951)
@@ -0,0 +1,3 @@
+#A specific comment for this file. Should be removed in the generated file.
+aKey = C'est une clef
+aLastKey = C'est une derniÃšre clef
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.ko/lang.properties	(revision 3951)
@@ -0,0 +1,9 @@
+#This is a comment
+#Another commented line
+
+aKey = This is a key
+anotherKey = This is another key
+This is an invalid line
+#A last comment
+
+aLastKey = this it the last key
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/one_translation.template
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/one_translation.template	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/one_translation.template	(revision 3951)
@@ -0,0 +1,33 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (${language})
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+${applet_translation}
+
+--------------
+
+#if (${coppermine_filename})
+
+Translation for the CopperminePlugin part
+
+#if (${coppermine_filename} == "english.php")
+   The translation for ${language} doesn't exist. Please create a new one, based on the English translation below... 
+#else
+   Content of the <${coppermine_filename}> file.
+#end
+
+--------------
+
+${coppermine_translation}
+
+--------------
+
+#end
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/available_translations.template
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/available_translations.template	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/available_translations.template	(revision 3951)
@@ -0,0 +1,19 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (list of available translations)
+           --------------------
+           --------------------
+           --------------------
+
+   This page contains the list of available translation, with the relevant contributors (thanks to them). Each line contains 
+   a link to the page which contains this translation. Each page contains both the applet translation (for this package), and a 
+   translation for the JUPload plugin for Coppermine. This second translation is not used, if you directly use the applet. But, 
+   as it is a free and open source project, it would be nice that translators also translate it...
+
+   Please read all details in the {{{../howto-translate.html}howto-translate}} page.
+
+*--------------------*--------------------*
+|| Language || Contributor |
+#foreach ($translation in $translations)
+| {{{./${translation.filename}.html}${translation.language}}} | ${translation.contributor} |
+#end
+*--------------------*--------------------*
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.utf-8
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.utf-8	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.utf-8	(revision 3951)
@@ -0,0 +1,13 @@
+#This is a comment
+#Another commented line
+
+language = French (for test)
+contributor = The French contributor
+
+aKey = C'est une clef
+
+#MISSING  anotherKey = This is another key.Also with a new line in it, and also with a \n character!
+
+#A last comment
+
+aLastKey = C'est une derniÃšre clef\nAvec un passage Ã  la ligne!
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.apt	(revision 3951)
@@ -0,0 +1,28 @@
+           --------------------
+           JUpload - File Upload Applet - Applet translation (French (for test))
+           --------------------
+           --------------------
+           --------------------
+
+
+
+Translation for the applet part
+
+--------------
+
+#This is a comment
+#Another commented line
+
+language = French (for test)
+contributor = The French contributor
+
+aKey = C'est une clef
+
+#MISSING  anotherKey = This is another key.Also with a new line in it, and also with a \n character!
+
+#A last comment
+
+aLastKey = C'est une derni\u00e8re clef\nAvec un passage \u00e0 la ligne!
+
+--------------
+
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.unicode
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.unicode	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang_fr.properties.unicode	(revision 3951)
@@ -0,0 +1,13 @@
+#This is a comment
+#Another commented line
+
+language = French (for test)
+contributor = The French contributor
+
+aKey = C'est une clef
+
+#MISSING  anotherKey = This is another key.Also with a new line in it, and also with a \n character!
+
+#A last comment
+
+aLastKey = C'est une derni\u00e8re clef\nAvec un passage \u00e0 la ligne!
Index: 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang.properties
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang.properties	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/test/resources/lang.verif.utf-8/lang.properties	(revision 3951)
@@ -0,0 +1,15 @@
+#This is a comment
+#Another commented line
+
+language = English (for test)
+contributor = The English contributor
+
+aKey = This is a key.\
+With a new line in it, and with a \n character!
+
+anotherKey = This is another key.\
+Also with a new line in it, and also with a \n character!
+
+#A last comment
+
+aLastKey = this it the last key
Index: 3thparty/jupload/maven-translation-plugin/src/main/java/wjhk/jupload/translation/TranslationManagerMojo.java
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/main/java/wjhk/jupload/translation/TranslationManagerMojo.java	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/main/java/wjhk/jupload/translation/TranslationManagerMojo.java	(revision 3951)
@@ -0,0 +1,1213 @@
+package wjhk.jupload.translation;
+
+import java.io.Closeable;
+
+import java.io.ByteArrayInputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileOutputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import java.io.PrintWriter;
+import java.io.PushbackReader;
+import java.io.StringWriter;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Properties;
+
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+import org.apache.log4j.BasicConfigurator;
+import org.apache.log4j.Logger;
+import org.apache.maven.plugin.AbstractMojo;
+import org.apache.maven.plugin.MojoExecutionException;
+import org.apache.velocity.Template;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.VelocityEngine;
+import org.apache.velocity.runtime.RuntimeConstants;
+
+/**
+ * We'll check all files, out of the .svn folder, which exist when we're working
+ * from a SVN checkout.
+ */
+class NoSvnFilenameFilter implements FilenameFilter {
+	public boolean accept(File arg0, String arg1) {
+		// We accept all files and folders, out of the ".svn" folder
+		return !(arg1.equals(".svn"));
+	}
+}
+
+/**
+ * This Maven plugin is manages the JUpload translation. It allows: <DIR> <LI>
+ * translators to manage human readable files. <LI>Encoding of the translations
+ * in unicode, as requested for Java property files.<LI>Back formatting of each
+ * 'human readable' translation file, according to the default translation
+ * (lang.properties). This allows all files to have the same format (including
+ * comment, order of the translation properties...)<LI>Generate the
+ * documentation, describing the existing translations </DIR>
+ * 
+ * @phase generate-sources
+ * @goal translate
+ * @author etienne_sf
+ */
+// TODO Document this (in the howto-translate.apt file)
+
+public class TranslationManagerMojo extends AbstractMojo {
+	/** Logger for this class */
+	protected final Logger logger = Logger
+			.getLogger(TranslationManagerMojo.class);
+
+	final static String DEFAULT_ENCODING = "UTF-8";
+
+	final static String NATIVE_ENCODING = "NATIVE";
+
+	final static String FILENAME_PREFIX = "lang";
+
+	final static String FILENAME_SUFFIX = ".properties";
+
+	final static Pattern PROPERTY_PATTERN = Pattern.compile("^(.*) = (.*)$");
+
+	final static String TEMPLATE_FILENAME = "lang.template.properties";
+
+	/**
+	 * The default file is the lang.properties file. It will be unchanged. It
+	 * actually acts as the file template to format all other files.
+	 */
+	File defaultFile = null;
+
+	/**
+	 * The instance of velocityEngine, which will be used to render the velocity
+	 * templates.
+	 */
+	VelocityEngine velocityEngine = null;
+
+	/**
+	 * This files filter, when used in the
+	 * {@link File#listFiles(FilenameFilter)} method, allows to get rid of the
+	 * '.svn' folder, which we don't care when manipulating translations.
+	 */
+	private static FilenameFilter noSvnFilenameFilter = new NoSvnFilenameFilter();
+
+	/*********************************************************************************************************
+	 ********************************** LIST OF MOJO PARAMETERS **********************************************
+	 *********************************************************************************************************/
+
+	/**
+	 * The doc folder is the target folder, which will contain the generated
+	 * documentation for each property file, found in the inputFolder. It is
+	 * used to generate the documentation about the project translation. <BR>
+	 * If the doc folder is a subfolder of the project target folder, then it
+	 * may not exist. The plugin will create it. Otherwise, the specified folder
+	 * must exist.<BR>
+	 * It creates a file for each translation file. It uses the following
+	 * properties, reading them from each translation language file:<DIR>
+	 * <UL>
+	 * <I>generateHtmlFileForTranslators</I>: true if a doc file should be
+	 * generated for this file. Default to true: if this parameter is not set,
+	 * the documentation is generated.
+	 * <UL>
+	 * <I>language</I>: The language for this file. This could be 'guessed' from
+	 * the file name (lang_de is German...). Perhaps in a future release...
+	 * <UL>
+	 * <I>contributor</I>: The name of the contributor(s). It's both a thank to
+	 * them ... and the possibility to email them, and ask them to complete the
+	 * current translation when new text are added.
+	 * <UL>
+	 * <I></DIR> This parameter is not mandatory. If it is not defined, no
+	 * documentation is generated.
+	 * 
+	 * @parameter default-value=null
+	 */
+	protected File docFolder = null;
+
+	/**
+	 * This parameter is not directly related to the applet. Its aim is to group
+	 * translation for the applet itself, and for a plugin for the Coppermine
+	 * picture gallery. <BR>
+	 * The hope is: that people who translate the applet lang file would also
+	 * translate the Coppermine, at the time.<BR>
+	 * This parameter is the folder which contain the Coppermine translation
+	 * files. These files are of the form english.php or german.php. The
+	 * language property contain the language, and thus allows to construct the
+	 * filename of the Coppermine file associated with a lang_XX.property file.<BR>
+	 * Note: the Coppermine files are supposed to be encoded in UTF-8.
+	 * 
+	 * @parameter default-value=null
+	 */
+	protected File coppermineFolder = null;
+
+	/**
+	 * This parameter controls the suffix which will be appended to the
+	 * generated doc files. For instance, it can be ".apt" for an APT file (used
+	 * in Maven generating steps) or ".html" for HTML generated files. It's up
+	 * to your templates (see templateXxx parameters) to generate a file which
+	 * content is valid according to your file extension.
+	 * 
+	 * @parameter default-value=""
+	 */
+	protected String docFileExtension = null;
+
+	/**
+	 * The character inputEncoding scheme to be applied when filtering
+	 * resources. It may be one of UTF-8 and UTF-16.
+	 * 
+	 * @parameter expression="${inputEncoding}" default-value="UTF-8"
+	 */
+	protected String inputEncoding = DEFAULT_ENCODING;
+
+	/**
+	 * The source folder, which contains the original lang files. These files
+	 * are the original translation files, for translator. They are encoded
+	 * according to the inputEncoding parameter value. These files are read,
+	 * then transformed within this folder (no target folder).
+	 * 
+	 * @parameter default-value="${project.basedir}/src/main/lang"
+	 * @required
+	 */
+	protected File inputFolder = null;
+
+	/**
+	 * These folder is the target for the files used by Java. They are the
+	 * result of the native2ascii transformation of the files that are in the
+	 * inputFolder.
+	 * 
+	 * @parameter default-value="${project.basedir}/src/main/resources/lang"
+	 * @required
+	 */
+	protected File resourceLangFolder = null;
+
+	/**
+	 * The template for the file which describes the format of the file, which
+	 * will contain the description of each available translation. This template
+	 * is a Velocity template, based on 1.6 version of Velocity. This template
+	 * should be encoded in UTF-8 format. The generated file will also be
+	 * encoded in UTF-8.
+	 * <P>
+	 * In this parameter, you'll have to put a path which can be find by the
+	 * class loader.
+	 * <P>
+	 * If this parameter is empty, null or not defined, no template will be
+	 * applied.
+	 * </P>
+	 * <P>
+	 * The available variables are:
+	 * </P>
+	 * <DIR>
+	 * <UL>
+	 * translations: The list of all translation. A foreach loop like the sample
+	 * below allows you to go through each item of this list.
+	 * <UL>
+	 * translation.filename: The filename for the property file which contains
+	 * this translation (e.g.: lang_fr.properties)
+	 * <UL>
+	 * translation.language: The language for this translation (e.g.: French)
+	 * <UL>
+	 * translation.contributor: The contributor(s), who made this translation.
+	 * It's both a thank to them and the possibility to ask them to translate
+	 * new stuff. </DIR>
+	 * <P>
+	 * Here is a sample to generate a table, in an APT file, for instance for a
+	 * maven site documentation:
+	 * </P>
+	 * 
+	 * <PRE>
+	 *            --------------------
+	 *            JUpload - File Upload Applet - Applet translation (list of available translations)
+	 *            --------------------
+	 *            --------------------
+	 *            --------------------
+	 * 
+	 *   bla bla bla ... 
+	 * 
+	 * *--------------------*--------------------*
+	 * | Language | Contributor |
+	 * #foreach ($translation in $translations)
+	 * | {{{./${translation.filename}.html}${translation.language}}} | ${translation.contributor} |
+	 * #end
+	 *  * --------------------*--------------------*
+	 * 
+	 * @parameter expression="${templateAvailableTranslation}" default-value=null
+	 * </PRE>
+	 */
+	protected String templateAvailableTranslation = null;
+
+	/**
+	 * The template which will be applied for each available translation. It is
+	 * a Velocity template, based on 1.6 version of Velocity. This template
+	 * should be encoded in UTF-8 format. The generated file will also be
+	 * encoded in UTF-8.
+	 * <P>
+	 * In this parameter, you'll have to put a path which can be find by the
+	 * class loader.
+	 * <P>
+	 * If this parameter is empty, null or not defined, no template will be
+	 * applied.
+	 * </P>
+	 * <P>
+	 * The available variables are:<DIR>
+	 * <UL>
+	 * language: The language for this file.
+	 * <UL>
+	 * applet_translation: The applet translation. This text is encoded in
+	 * US-ASCII, with all unicode characters escaped in the format \\uNNNN
+	 * <UL>
+	 * coppermine_filename: null if no Coppermine translation given. If you
+	 * manage only the applet, just ignore all Coppermine stuff. Read the plugin
+	 * documentation for more information.
+	 * <UL>
+	 * coppermine_translation: The Coppermine translation in the current
+	 * language, or in English, if no translation is available. </DIR>
+	 * 
+	 * <P>
+	 * Here is a sample to generate a table, in an APT file, for instance for a
+	 * maven site documentation:
+	 * </P>
+	 * 
+	 * <PRE>
+	 *            --------------------
+	 *            JUpload - File Upload Applet - Applet translation (${language})
+	 *            --------------------
+	 *            --------------------
+	 *            --------------------
+	 * 
+	 * 
+	 * 
+	 * Translation for the applet part
+	 * 
+	 * --------------
+	 * 
+	 * ${applet_translation}
+	 * 
+	 * --------------
+	 * 
+	 * #if (${coppermine_filename})
+	 * 
+	 * Translation for the CopperminePlugin part
+	 * 
+	 * #if (${coppermine_filename} == "english.php")
+	 *    The translation for ${language} doesn't exist. Please create a new one, based on the English translation below... 
+	 * #else
+	 *    Content of the <${coppermine_filename}> file.
+	 * #end
+	 * 
+	 * --------------
+	 * 
+	 * ${coppermine_translation}
+	 * 
+	 * --------------
+	 * 
+	 * #end
+	 * </PRE>
+	 * 
+	 * @parameter expression="${templateOneTranslation}" default-value=null
+	 */
+	protected String templateOneTranslation = null;
+
+	/**
+	 * The work folder, used during the translation process. This folder will
+	 * contain the generated files. Then, if everything is Ok, these files are
+	 * copied back to the {@link #inputFolder} folder..
+	 * 
+	 * @parameter 
+	 *            default-value="${project.build.directory}/translation-workFolder"
+	 * @required
+	 */
+	protected File workFolder = null;
+
+	/*************************************************************************************
+	 ********************************************* METHODS
+	 *************************************************************************************/
+
+	/**
+	 * The default constructor initializes the Mojo logging, and the Velocity
+	 * engine.
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	public TranslationManagerMojo() throws MojoExecutionException {
+		try {
+			initVelocity();
+		} catch (Exception e) {
+			throw new MojoExecutionException(e.getClass().getName()
+					+ " in TranslationManagerMojo constructor ("
+					+ e.getMessage() + ")");
+		}
+	}
+
+	/*************************************************************************************
+	 ********************************************* METHODS
+	 *************************************************************************************/
+
+	/**
+	 * @see org.apache.maven.plugin.Mojo#execute()
+	 */
+	public void execute() throws MojoExecutionException {
+		// inputFolder must be ... a folder!
+		if (inputFolder == null) {
+			throw new NullPointerException("inputFolder may not be null");
+		} else if (!inputFolder.isDirectory()) {
+			throw new MojoExecutionException(inputFolder.getAbsolutePath()
+					+ " must be a directory");
+		}
+		getLog().debug("inputFolder: " + inputFolder.getAbsolutePath());
+		getLog().debug(
+				"resourceLangFolder: " + resourceLangFolder.getAbsolutePath());
+		getLog().debug("workFolder: " + workFolder.getAbsolutePath());
+
+		defaultFile = new File(inputFolder + File.separator + FILENAME_PREFIX
+				+ FILENAME_SUFFIX);
+		getLog().debug("defaultFile: " + defaultFile.getAbsolutePath());
+
+		// Let's go through all available files, and format each one, out of the
+		// default one.
+		File[] files = inputFolder.listFiles(noSvnFilenameFilter);
+		for (int i = 0; i < files.length; i += 1) {
+			// We format all files, out of the default one.
+			if (files[i].getName().startsWith(FILENAME_PREFIX + "_")) {
+				formatOneLangFile(files[i], inputEncoding);
+			}
+		}
+
+		// If we succeed in formatting files, let's copy them back to the lang
+		// folder.
+		copyAllLangFilesToInputFolder();
+		// Then we copy the file to the resources/lang/ folder
+		copyAllLangFilesToResourcesLangFolder();
+		// And we finish by generating the documentation, if the docFolder
+		// has been defined.
+		if (docFolder != null) {
+			generateDocForAvailableTranslations();
+
+		}
+	}
+
+	/**
+	 * This method read one lang files, and return it as a loaded Properties
+	 * instance.
+	 * 
+	 * @param propertyFile
+	 *            The property file to load
+	 * @param fileEncoding
+	 *            The inputEncoding of this property file
+	 * @throws MojoExecutionException
+	 */
+	Properties loadOneLangFile(File propertyFile, String fileEncoding)
+			throws MojoExecutionException {
+		Properties translation = new Properties();
+		InputStream is = null;
+		InputStreamReader isr = null;
+		ByteArrayInputStream bais = null;
+		try {
+			is = new FileInputStream(propertyFile);
+			isr = new InputStreamReader(is, fileEncoding);
+			int i;
+			StringBuffer sb = new StringBuffer();
+			while ((i = isr.read()) > 0) {
+				sb.append((char) i);
+			}
+			byte[] byteInUnicode = toUnicode(sb.toString()).getBytes("ASCII");
+			bais = new ByteArrayInputStream(byteInUnicode);
+			translation.load(bais);
+		} catch (IOException e) {
+			throw new MojoExecutionException(e.getClass().getName()
+					+ " while reading this lang file: "
+					+ propertyFile.getAbsolutePath() + " (" + e.getMessage()
+					+ ")");
+		} finally {
+			closeStream(isr, "isr");
+			closeStream(is, propertyFile.getAbsolutePath());
+			closeStream(bais, "bais");
+		}
+
+		return translation;
+	}
+
+	/**
+	 * This method goes through the default files. It directly writes all
+	 * comment and empty lines. For property lines, it tries to translated the
+	 * text, based on the give property file. If this doesn't succeed a
+	 * commented line, indicating that this translation is missing is written,
+	 * with the English translation to allow an easy translation of missing
+	 * texts in each translation properties file.
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	// TODO document this method
+	void formatOneLangFile(File file, String fileEncoding)
+			throws MojoExecutionException {
+		File targetFile = new File(workFolder + File.separator + file.getName());
+		InputStream isDefaultFile = null;
+		InputStreamReader isrDefaultFile = null;
+		PushbackReader pbReader = null;
+		OutputStream osTargetFile = null;
+		OutputStreamWriter osrTargetFile = null;
+
+		getLog().debug("Translating " + file.getAbsolutePath());
+		Properties propTargetTranslation = loadOneLangFile(file, fileEncoding);
+
+		try {
+			isDefaultFile = new FileInputStream(defaultFile);
+			isrDefaultFile = new InputStreamReader(isDefaultFile, fileEncoding);
+			pbReader = new PushbackReader(isrDefaultFile, 1);
+
+			osTargetFile = new FileOutputStream(targetFile);
+			osrTargetFile = new OutputStreamWriter(osTargetFile, fileEncoding);
+
+			// EOL may be the two characters (\r\n), or only one of them.
+			int lineNumber = 0;
+			boolean readingProperty = false;
+			boolean lastCharWasEOL = true;
+			boolean currentCharIsEOL = true;
+			boolean eof = false;
+			int iNextRead;
+			StringBuffer sbPropertyLine = new StringBuffer();
+			while (!eof) {
+				iNextRead = pbReader.read();
+				eof = (iNextRead < 0);
+				char c = (char) iNextRead;
+
+				// Let's manage the '\' character, for property lines, by
+				// inspecting the next character, looking for special
+				// combinations.
+				if (readingProperty && c == '\\') {
+					int charForAntiSlashCombination = pbReader.read();
+					if (charForAntiSlashCombination < 0) {
+						// We finish the stream. It's a standard '\' character.
+						// Nothing to do (we go on in current loop).
+					} else if (charForAntiSlashCombination == '\\') {
+						// We have two '\', so it's actually ... one !
+						// Nothing to do (we go on in current loop).
+					} else if (charForAntiSlashCombination == '\n'
+							|| charForAntiSlashCombination == '\r') {
+						// We found an end of line. The current property is
+						// going on next line. Let's loop to next character, and
+						// ignore this one.
+
+						// We must first skip any second end of line character.
+						int nextEOLChar = pbReader.read();
+						if (nextEOLChar >= 0) {
+							// We found a new character in the input stream. If
+							// it forms a two-char-EOL, with the last read
+							// character, we skip it
+							if (charForAntiSlashCombination == '\n'
+									&& nextEOLChar == '\r') {
+								if (!readingProperty) {
+									// We want to read the nextEOLChar
+									// character, in the next loop.
+									pbReader.unread(nextEOLChar);
+								} else {
+									// We'reading a property line. We've just
+									// skipped the end of line characters. We'll
+									// go on with next char.
+									// nothing to do
+								}
+							}
+						}
+						continue;
+					} else {
+						// It's not a special combination. We'll read next char
+						// in the next loop, and go one with the current one.
+						pbReader.unread(charForAntiSlashCombination);
+					}
+				}
+
+				lastCharWasEOL = currentCharIsEOL;
+				currentCharIsEOL = eof || (c == '\r' || c == '\n');
+
+				if (lastCharWasEOL && !currentCharIsEOL) {
+					// We're starting a new line. Is it a property line ?
+					readingProperty = (c != '#');
+					lineNumber += 1;
+				}
+
+				if (!readingProperty) {
+					// We directly write characters that are not belonging to a
+					// property line
+					if (!eof) {
+						osrTargetFile.write(c);
+					}
+				} else if (!currentCharIsEOL) {
+					// We're reading the next char of the current property line.
+					// Let's store it.
+					sbPropertyLine.append(c);
+				} else {
+					// We reached the end of a property line
+					// This line should be a property line, looking like:
+					// key = bla bla bla
+					// where "bla bla bla" is the default translation.
+					String line = sbPropertyLine.toString();
+					sbPropertyLine = new StringBuffer();
+					readingProperty = false;// Preparing management of next
+					// line.
+
+					Matcher matcher = PROPERTY_PATTERN.matcher(line);
+					if (matcher.matches()) {
+						// Ok, we found a property line.
+						String key = matcher.group(1);
+
+						// Do we have this translation available, in the
+						// target translation?
+						String translation = propTargetTranslation
+								.getProperty(key);
+						if (translation == null) {
+							osrTargetFile.write("#MISSING  " + line);
+						} else {
+							// We want to keep special characters.
+							translation = translation
+									.replaceAll("\\n", "\\\\n");
+							osrTargetFile.write(key + " = " + translation);
+						}
+					} else {
+						// Hum, hum. The line is not one of the expected
+						// cases...
+						throw new MojoExecutionException(
+								"Error while processing the "
+										+ defaultFile.getAbsolutePath()
+										+ " translation. The format of this line "
+										+ lineNumber + " is not recognized: ["
+										+ line + "]");
+					}
+					// Let's write the current char (an EOL character)
+					if (!eof) {
+						osrTargetFile.write(c);
+					}
+				}
+			}// while
+
+			// The streams are closed in the finally clause.
+		} catch (IOException e) {
+			throw new MojoExecutionException(e.getClass().getName()
+					+ " while writing this lang file: "
+					+ targetFile.getAbsolutePath() + " (" + e.getMessage()
+					+ ")");
+		} finally {
+			closeStream(pbReader, "PushBackReader");
+			closeStream(isDefaultFile, "isrDefaultFile");
+			closeStream(isDefaultFile, defaultFile.getAbsolutePath());
+			closeStream(osrTargetFile, targetFile.getAbsolutePath());
+			closeStream(osTargetFile, targetFile.getAbsolutePath());
+		}
+
+		// TODO Finish this method
+	}
+
+	/**
+	 * A utility method, to close any object which implements the Closeable
+	 * interface (InputStream, OutputStream, Reader...), without throwing any
+	 * Exception. To be used in the finally clauses of try/catch blocs.
+	 * 
+	 * @param closeable
+	 *            The object to close. If null, nothing is done. This allows
+	 *            this method to be called whether the Stream (or Writer) has
+	 *            been created or not.
+	 * @param description
+	 *            A description of the object to close. This description will be
+	 *            logged if an error occured while closing this object.
+	 */
+	void closeStream(Closeable closeable, String description) {
+		if (closeable != null) {
+			try {
+				closeable.close();
+			} catch (IOException e) {
+				getLog().warn(
+						e.getClass().getName() + " while closing the "
+								+ closeable.getClass().getName() + " ("
+								+ description + ") [" + e.getMessage() + "]");
+			}
+		}
+	}
+
+	/**
+	 * Transform a String, into a unicode encoded String, with characters not in
+	 * the ASCII chart, transformed in "\\uNNNN" string.
+	 * 
+	 * @param src
+	 * @return
+	 */
+	String toUnicode(String src) {
+		if (src == null) {
+			return null;
+		} else {
+			StringBuilder sb = new StringBuilder(src.length() * 6);
+
+			// Char by char conversion
+			for (int i = 0; i < src.length(); i++) {
+				int c = (int) src.charAt(i);
+
+				// We keep ASCII characters as is
+				if (c <= 127) {
+					// No transformation for ASCII characters
+					sb.append((char) c);
+				} else {
+					// Generates the \\uNNNN string
+					sb.append(String.format("\\u%04x", c));
+				}
+			}
+
+			return sb.toString();
+		}
+	}
+
+	/**
+	 * Copy a file, byte per byte, into a new one.
+	 * 
+	 * @param source
+	 * @param target
+	 * @throws IOException
+	 */
+	void copyFile(File source, String sourceEncoding, File target,
+			String targetEncoding) throws IOException {
+		InputStream is = new FileInputStream(source);
+		byte[] bytes = new byte[(int) source.length()];
+		is.read(bytes);
+		String template = new String(bytes, sourceEncoding);
+		OutputStream os = new FileOutputStream(target);
+		if (targetEncoding.equals(NATIVE_ENCODING)) {
+			os.write(toUnicode(template).getBytes("US-ASCII"));
+		} else {
+			os.write(template.getBytes(targetEncoding));
+		}
+		closeStream(is, "copyFile, inputStream: " + source.getAbsolutePath());
+		closeStream(os, "copyFile, outputStream: " + target.getAbsolutePath());
+	}
+
+	/**
+	 * This method copies all files to the lang folder, once they have all been
+	 * transformed successfully.
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	void copyAllLangFilesToInputFolder() throws MojoExecutionException {
+		File[] workFiles = getWorkFolder().listFiles(noSvnFilenameFilter);
+		File target;
+		for (int i = 0; i < workFiles.length; i += 1) {
+			target = new File(getInputFolder(), workFiles[i].getName());
+			try {
+				copyFile(workFiles[i], inputEncoding, target, inputEncoding);
+			} catch (IOException e) {
+				throw new MojoExecutionException(e.getClass().getName()
+						+ " while copying this lang file: "
+						+ workFiles[i].getName() + " from "
+						+ getWorkFolder().getAbsolutePath() + " to "
+						+ getInputFolder().getAbsolutePath() + " ("
+						+ e.getMessage() + ")");
+			}
+		}
+	}
+
+	/**
+	 * This method copies all files to the ./src/main/resources/lang/ folder,
+	 * once they have all been transformed successfully. During this copy, the
+	 * files are encoded in ASCII characters. All non ASCII characters are
+	 * replaced by the relevant \\uNNNN string.
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	void copyAllLangFilesToResourcesLangFolder() throws MojoExecutionException {
+		// First step : copy of the lang.properties files
+		try {
+			copyFile(new File(getInputFolder(), "lang.properties"),
+					inputEncoding, new File(getResourceLangFolder(),
+							"lang.properties"), NATIVE_ENCODING);
+		} catch (IOException e1) {
+			throw new MojoExecutionException(e1.getClass().getName()
+					+ " while copying this lang.properties file: from "
+					+ getInputFolder().getAbsolutePath() + " to "
+					+ getResourceLangFolder().getAbsolutePath() + " ("
+					+ e1.getMessage() + ")");
+		}
+
+		// Then, copy of all the 'unicoded' files.
+		File[] files = getWorkFolder().listFiles(noSvnFilenameFilter);
+		File target = resourceLangFolder;
+		for (int i = 0; i < files.length; i += 1) {
+			target = new File(getResourceLangFolder(), files[i].getName());
+			try {
+				copyFile(files[i], inputEncoding, target, NATIVE_ENCODING);
+			} catch (IOException e2) {
+				throw new MojoExecutionException(e2.getClass().getName()
+						+ " while copying this lang file: "
+						+ files[i].getName() + " from "
+						+ getWorkFolder().getAbsolutePath() + " to "
+						+ getInputFolder().getAbsolutePath() + " ("
+						+ e2.getMessage() + ")");
+			}
+		}
+	}
+
+	/**
+	 * Generates the availableTranslation, then one file for each translation,
+	 * based on the templateAvailableTranslation and templateOneTranslation
+	 * plugin parameters.
+	 * 
+	 * @throws MojoExecutionException
+	 */
+	public void generateDocForAvailableTranslations()
+			throws MojoExecutionException {
+		String action = null;
+		PrintWriter pwAvailableTranslation = null;
+
+		try {
+			action = "Init of file writer";
+			File fileAvailableTranslation = new File(getDocFolder(),
+					"available_translations" + getDocFileExtension());
+			action = "Opening Stream for "
+					+ fileAvailableTranslation.getAbsolutePath();
+			pwAvailableTranslation = new PrintWriter(fileAvailableTranslation,
+					"UTF-8");
+
+			action = "Velocity: template creation";
+			Template template = velocityEngine
+					.getTemplate(getTemplateAvailableTranslation());
+			action = "Velocity: context creation";
+			VelocityContext context = new VelocityContext();
+
+			// Then, manage each translation (based on the properly unicoded
+			// files we've just generated)
+			File[] files = getResourceLangFolder().listFiles(
+					noSvnFilenameFilter);
+			List<Map<String, String>> translations = new ArrayList<Map<String, String>>();
+			for (int i = 0; i < files.length; i += 1) {
+				// Let's read these properties.
+				Properties props = new Properties();
+				action = "Reading the properties for "
+						+ files[i].getAbsolutePath();
+				props.load(new FileInputStream(files[i]));
+
+				// Adding properties for Velocity template.
+				Map<String, String> translation = new HashMap<String, String>();
+				translation.put("filename", files[i].getName());
+				translation.put("language", props.getProperty("language"));
+				translation
+						.put("contributor", props.getProperty("contributor"));
+				translations.add(translation);
+
+				// Let's generate the file
+				action = "Generating "
+						+ fileAvailableTranslation.getAbsolutePath();
+				generateDocForOneTranslation(files[i], props);
+			}// for
+
+			// Ok, we fullfill all data for available translations. Let's
+			// generate the page.
+			context.put("translations", translations);
+			template.merge(context, pwAvailableTranslation);
+		} catch (MojoExecutionException e) {
+			throw e;
+		} catch (Exception e) {
+			throw new MojoExecutionException(e.getClass().getName()
+					+ " while: " + action + " (" + e.getMessage() + ")");
+		} finally {
+			closeStream(pwAvailableTranslation,
+					"printwriterAvailableTranslation");
+		}
+	}
+
+	VelocityEngine initVelocity() throws Exception {
+		final String LOGGER_NAME = "velocityLogger";
+
+		// TODO Remove these three test lines.
+		BasicConfigurator.configure();
+
+		velocityEngine = new VelocityEngine();
+		velocityEngine.setProperty(
+				RuntimeConstants.RUNTIME_LOG_LOGSYSTEM_CLASS,
+				"org.apache.velocity.runtime.log.Log4JLogChute");
+		velocityEngine.setProperty("runtime.log.logsystem.log4j.logger",
+				LOGGER_NAME);
+		velocityEngine.init();
+
+		return velocityEngine;
+	}
+
+	/**
+	 * @throws MojoExecutionException
+	 */
+	void generateDocForOneTranslation(File file, Properties props)
+			throws MojoExecutionException {
+		InputStream isApplet = null;
+		InputStreamReader isrApplet = null;
+		InputStream isCoppermine = null;
+		InputStreamReader isrCoppermine = null;
+		OutputStream os = null;
+		OutputStreamWriter osw = null;
+		PrintWriter pw = null;
+		String action = null;
+
+		try {
+			// Now the target file
+			File target = new File(getDocFolder(), file.getName()
+					+ getDocFileExtension());
+			os = new FileOutputStream(target);
+			// FIXME This should generate unicode escape strings (like \\uNNNN)
+			osw = new OutputStreamWriter(os, "UTF-8");
+			pw = new PrintWriter(osw);
+
+			action = "Velocity: template creation";
+			Template template = velocityEngine
+					.getTemplate(getTemplateOneTranslation());
+			action = "Velocity: context creation";
+			VelocityContext context = new VelocityContext();
+
+			// Let's open the applet input file, with the correct encoding
+			// charset.
+			action = "Reading applet translation";
+			File fileAppletTranslation = new File(getInputFolder(), file
+					.getName());
+			isApplet = new FileInputStream(fileAppletTranslation);
+			isrApplet = new InputStreamReader(isApplet, getInputEncoding());
+			StringWriter appletTranslationWriter = new StringWriter(
+					(int) fileAppletTranslation.length());
+			// Let's read the applet translation, by translating the encoding,
+			// if necessary. This translation is done by the Reader and Writer
+			// previously opened.
+			int c;
+			while ((c = isrApplet.read()) != -1) {
+				appletTranslationWriter.write(c);
+			}
+			context.put("language", props.get("language"));
+			context.put("applet_translation", appletTranslationWriter
+					.toString());
+
+			// Should we have a Coppermine translation ?
+			if (getCoppermineFolder() != null) {
+				// Let's open the Coppermine input file, with the correct
+				// encoding charset.
+				String filename = props.getProperty("coppermine.language")
+						.toLowerCase()
+						+ ".php";
+				File fileCoppermineTranslation = new File(
+						getCoppermineFolder(), filename);
+				if (!fileCoppermineTranslation.exists()) {
+					// The translation doesn't exist. We'll display the default
+					// language file, to allow contributor to translate.
+					fileCoppermineTranslation = new File(getCoppermineFolder(),
+							"english.php");
+				}
+
+				// Let's copy the Coppermine translation, by translating the
+				// encoding, if necessary. This translation is done by the
+				// Reader and Writer previously opened.
+				isCoppermine = new FileInputStream(fileCoppermineTranslation);
+				isrCoppermine = new InputStreamReader(isCoppermine, "UTF-8");
+				StringWriter coppermineTranslationWriter = new StringWriter(
+						(int) fileAppletTranslation.length());
+				while ((c = isrCoppermine.read()) != -1) {
+					coppermineTranslationWriter.write((char) c);
+				}
+
+				context.put("coppermine_filename", fileCoppermineTranslation
+						.getName());
+				context.put("coppermine_translation",
+						coppermineTranslationWriter.toString());
+			}// if(getCoppermineFolder()!=null)
+
+			template.merge(context, pw);
+		} catch (Exception e) {
+			throw new MojoExecutionException(e.getClass().getName()
+					+ " while generating file for " + file.getAbsolutePath()
+					+ " (" + e.getMessage() + ") [action = " + action + "]");
+		} finally {
+			closeStream(isApplet, "isApplet");
+			closeStream(isrApplet, "isrApplet");
+			closeStream(isCoppermine, "isCoppermine");
+			closeStream(isrCoppermine, "isrCoppermine");
+			closeStream(pw, "pw");
+			closeStream(osw, "osw");
+			closeStream(os, "os");
+		}
+	}
+
+	/**
+	 * @return the docFolder
+	 */
+	public File getDocFolder() {
+		return docFolder;
+	}
+
+	/**
+	 * @param docFolder
+	 *            the docFolder to set. docFolder may be null.
+	 * @throws MojoExecutionException
+	 */
+	public void setDocFolder(File docFolder) throws MojoExecutionException {
+		// It seems like maven set null ... not to the File itself, but to its
+		// name. That is: the folder would be: path/null !
+		if (docFolder != null && docFolder.getName().equals("null")) {
+			docFolder = null;
+		}
+		if (docFolder != null) {
+			if (!docFolder.exists()) {
+				// We accept target folder which doesn't exist, only if they are
+				// in the target path.
+				if (docFolder.getAbsolutePath().contains("/target/")
+						|| docFolder.getAbsolutePath().contains("\\target\\")) {
+					// Ok, let's create if.
+					docFolder.mkdir();
+				} else {
+					throw new MojoExecutionException("docFolder: "
+							+ docFolder.getAbsolutePath() + " must exist");
+				}
+			} else if (!docFolder.isDirectory()) {
+				// docFolder exists, but is not a folder. Forbidden.
+				throw new MojoExecutionException("docFolder: "
+						+ docFolder.getAbsolutePath()
+						+ " exists, but is not a folder");
+			}
+		}
+		this.docFolder = docFolder;
+	}
+
+	/**
+	 * @return the coppermineFolder
+	 */
+	public File getCoppermineFolder() {
+		return coppermineFolder;
+	}
+
+	/**
+	 * @param coppermineFolder
+	 *            the coppermineFolder to set. coppermineFolder may be null. In
+	 *            this case, the Coppermine files are ignored.
+	 * @throws MojoExecutionException
+	 */
+	public void setCoppermineFolder(File coppermineFolder)
+			throws MojoExecutionException {
+		// It seems like maven set null ... not to the File itself, but to its
+		// name. That is: the folder would be: path/null !
+		if (coppermineFolder != null
+				&& coppermineFolder.getName().equals("null")) {
+			coppermineFolder = null;
+		}
+		if (coppermineFolder != null) {
+			if (!coppermineFolder.exists()) {
+				throw new MojoExecutionException("coppermineFolder: "
+						+ coppermineFolder.getAbsolutePath() + " must exist");
+			} else if (!coppermineFolder.isDirectory()) {
+				// coppermineFolder exists, but is not a folder. Forbidden.
+				throw new MojoExecutionException("coppermineFolder: "
+						+ coppermineFolder.getAbsolutePath()
+						+ " exists, but is not a folder");
+			}
+		}
+		this.coppermineFolder = coppermineFolder;
+	}
+
+	/**
+	 * @return the docFileExtension
+	 */
+	public String getDocFileExtension() {
+		return (docFileExtension == null) ? "" : docFileExtension;
+	}
+
+	/**
+	 * @param docFileExtension
+	 *            the docFileExtension to set
+	 */
+	public void setDocFileExtension(String docFileExtension) {
+		this.docFileExtension = docFileExtension;
+	}
+
+	/**
+	 * @return the inputEncoding
+	 */
+	public String getInputEncoding() {
+		return inputEncoding;
+	}
+
+	/**
+	 * @param inputEncoding
+	 *            the inputEncoding to set
+	 * @throws MojoExecutionException
+	 */
+	public void setInputEncoding(String inputEncoding)
+			throws MojoExecutionException {
+		if (inputEncoding == null) {
+			throw new NullPointerException("inputEncoding may noy be null");
+		} else if (!inputEncoding.equals("UTF-8")
+				&& !inputEncoding.equals("UTF-16")) {
+			throw new MojoExecutionException(
+					"Valid values for inputEncoding are: UTF-8 and UTF-16");
+		}
+		this.inputEncoding = inputEncoding;
+	}
+
+	/**
+	 * @param inputFolder
+	 *            the inputFolder to set
+	 * @throws NullPointerException
+	 *             When inputFolder is null
+	 * @throws MojoExecutionException
+	 *             When inputFolder is not a folder.
+	 */
+	public void setInputFolder(File inputFolder) throws MojoExecutionException {
+		if (inputFolder == null) {
+			throw new NullPointerException("inputFolder may not be set to null");
+		} else if (!inputFolder.isDirectory()) {
+			throw new MojoExecutionException("inputFolder: "
+					+ inputFolder.getAbsolutePath() + " must be a directory");
+		}
+
+		this.inputFolder = inputFolder;
+
+		// The default file must be set, according to this folder.
+		defaultFile = new File(inputFolder + File.separator + FILENAME_PREFIX
+				+ FILENAME_SUFFIX);
+	}
+
+	/**
+	 * @return the inputFolder
+	 */
+	public File getInputFolder() {
+		return inputFolder;
+	}
+
+	/**
+	 * @return the resourceLangFolder
+	 */
+	public File getResourceLangFolder() {
+		return resourceLangFolder;
+	}
+
+	/**
+	 * @param resourceLangFolder
+	 *            the resourceLangFolder to set. If the folder dosn't exist, it
+	 *            will be created.
+	 * @throws NullPointerException
+	 *             When resourceLangFolder is null
+	 * @throws MojoExecutionException
+	 *             When resourceLangFolder exists, and is not a folder.
+	 */
+	public void setResourceLangFolder(File resourceLangFolder)
+			throws MojoExecutionException {
+		// resourceLangFolder must be ... a folder!
+		if (resourceLangFolder == null) {
+			throw new NullPointerException("resourceLangFolder may not ne null");
+		} else if (!resourceLangFolder.isDirectory()) {
+			throw new MojoExecutionException("resourceLangFolder: "
+					+ resourceLangFolder.getAbsolutePath()
+					+ " must be a directory");
+		}
+
+		// Ok !
+		this.resourceLangFolder = resourceLangFolder;
+	}
+
+	/**
+	 * @return the templateAvailableTranslation
+	 */
+	public String getTemplateAvailableTranslation() {
+		return templateAvailableTranslation;
+	}
+
+	/**
+	 * @param templateAvailableTranslation
+	 *            the templateAvailableTranslation to set
+	 * @throws MojoExecutionException
+	 */
+	public void setTemplateAvailableTranslation(
+			String templateAvailableTranslation) throws MojoExecutionException {
+		if (templateAvailableTranslation != null) {
+			// Let's check if the file exist.
+			File currFolder = new File(".");
+			File f = new File(currFolder, templateAvailableTranslation);
+			if (!f.isFile()) {
+				throw new MojoExecutionException(
+						"templateAvailableTranslation: "
+								+ templateAvailableTranslation
+								+ " must be a valid file");
+			}
+		}
+		this.templateAvailableTranslation = templateAvailableTranslation;
+	}
+
+	/**
+	 * @return the templateOneTranslation
+	 */
+	public String getTemplateOneTranslation() {
+		return templateOneTranslation;
+	}
+
+	/**
+	 * @param templateOneTranslation
+	 *            the templateOneTranslation to set
+	 * @throws MojoExecutionException
+	 */
+	public void setTemplateOneTranslation(String templateOneTranslation)
+			throws MojoExecutionException {
+		if (templateOneTranslation != null) {
+			// Let's check if the file exist.
+			File currFolder = new File(".");
+			File f = new File(currFolder, templateOneTranslation);
+			if (!f.isFile()) {
+				throw new MojoExecutionException("templateOneTranslation: "
+						+ templateOneTranslation + " must be a valid file");
+			}
+		}
+		this.templateOneTranslation = templateOneTranslation;
+	}
+
+	/**
+	 * The work folder may not be null, and should be in the target folder. If
+	 * it doesn't exist, we create it.
+	 * 
+	 * @param workFolder
+	 *            the workFolder to set
+	 * @throws NullPointerException
+	 *             When workFolder is null
+	 * @throws MojoExecutionException
+	 *             When workFolder exists, and is not a folder.
+	 */
+	public void setWorkFolder(File workFolder) throws MojoExecutionException {
+		if (workFolder == null) {
+			throw new MojoExecutionException(
+					"workFolder may not be set to null (" + workFolder + ")");
+		}
+
+		// If this folder doesn't exist, we create it.
+		if (!workFolder.exists()) {
+			workFolder.mkdirs();
+		}
+		// It must be a folder (it may exist before as a file...)
+		if (!workFolder.isDirectory()) {
+			throw new MojoExecutionException(
+					"The workFolder must be a folder (" + workFolder + ")");
+		}
+
+		this.workFolder = workFolder;
+
+		// The work folder must be empty, before working, or we may get old file
+		// in the execute process.
+		emptyFolder(this.workFolder);
+	}
+
+	/**
+	 * @return the workFolder
+	 */
+	public File getWorkFolder() {
+		return workFolder;
+	}
+
+	/*******************************************************************************************
+	 ************************** UTILITIES METHODS **********************************************
+	 *******************************************************************************************/
+	/**
+	 * Remove all files in a given folder. The folder remains.
+	 * 
+	 * @param folder
+	 */
+	public static void emptyFolder(File folder) {
+		// Let's throw a violent exception if folder is null or is not a folder.
+		File[] files = folder.listFiles(noSvnFilenameFilter);
+		for (int i = 0; i < files.length; i += 1) {
+			files[i].delete();
+		}
+	}
+}
Index: 3thparty/jupload/maven-translation-plugin/src/main/resources/log4j.xml
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/main/resources/log4j.xml	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/main/resources/log4j.xml	(revision 3951)
@@ -0,0 +1,21 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
+<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
+	<appender name="consoleAppender" class="org.apache.log4j.ConsoleAppender">
+		<layout class="org.apache.log4j.PatternLayout">
+			<param name="ConversionPattern" value="%d{ABSOLUTE} %5p %c{1}:%L - %m%n" />
+		</layout>
+	</appender>
+
+	<!--  Thelogger for velocity -->
+	<logger name="velocityLogger" additivity="false">
+		<level value="info" />
+		<appender-ref ref="consoleAppender" />
+	</logger>
+	<!-- The default logger -->
+	<root>
+		<priority value="info" />
+		<appender-ref ref="consoleAppender" />
+	</root>
+
+</log4j:configuration>
Index: 3thparty/jupload/maven-translation-plugin/src/site/site.xml
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/site/site.xml	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/site/site.xml	(revision 3951)
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="ISO-8859-1"?>
+<project>
+	<body>
+		<menu name="Translation documentation">
+			<item name="Index this web site" href="index.html" />
+			<item name="Translation overview" href="overview.html" />
+		</menu>
+
+		<links>
+			<item name="Maven" href="http://maven.apache.org/" />
+		</links>
+
+		${reports}
+
+	</body>
+</project>
Index: 3thparty/jupload/maven-translation-plugin/src/site/apt/overview.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/site/apt/overview.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/site/apt/overview.apt	(revision 3951)
@@ -0,0 +1,98 @@
+           --------------------
+           JUpload - jupload-translation - Translation overview
+           --------------------
+           --------------------
+           --------------------
+
+
+  <<Content>>
+  
+  * {{{A}General presentation}}
+  
+  * {{{B}Why this plugin was developped?}}
+  
+  * {{{C}What does it do?}}
+  
+
+           
+{A}. General presentation
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+  By default, __the plugin is not activated__. That is: if you execute a standard Maven compilation, the applet code is
+  compiled with the translation files, stored in JUpload package, whether you are using a JUpload release package, or 
+  a checkout from JUpload SVN. If you __updated translation__, please read the {{{./howto-useit.html}HowTo use it}} page. 
+
+  This plugin manages the translation files. It makes it easy for translator to produce new translation, and (more difficult) 
+  to update existing translation, especially for adding the missing translation files.
+  
+  The plugin is based on two set of files:
+  
+  * The ''./jupload-translation/src/lang'' folder contains the human readable files. The translator should work on these
+  files only. These files are formatted by the plugin. So all files are generated, according to the lang.property file. 
+  In each translation, each missing text (based on the lang.property file) is replaced by a commented line, beginning by
+  MISSING, and containing the English translation. It makes it easy for translator to update an existing translation.  
+  
+  * The ''./jupload-translation/src/resources/lang'' are generated from the previous one. They are used only by java code, 
+  during the applet execution. They should not be used by translators.
+
+
+{B}. Why this plugin was developped?
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
+* Missing text
+
+  JUpload is widely translated (more than 20 languages). But most translation are partial ones: new text may appear in
+  new JUpload version, and the existing translation are not maintained by the original translator, who may have no need 
+  to upgrade to the last JUpload version. To make this easier, previous version contained a translation formatter which 
+  generates comments like this one: 
+  
+---------------------
+  #MISSING key = The English translation
+---------------------
+
+* Unicode formatting
+  
+  But then, communicating new translation is not easy: the need is to send to the project administrator new translation. Java 
+  properties behavior implies that these translation are translated in 'native' text (that is: all non-ASCII characters are 
+  transformed in \uNNNN strings, where NNNN is the unicode code for these characters). The result is hardly understandable,
+  and make it hard for translator to contribute to existing translation.
+  
+   
+* Translation code complexity
+
+  In previous version, the managing of the translation files was done in ant scripts. These scripts are complex to manage
+  and can hardly be modified by other people.
+  
+  The use of maven plugin make this code be in Java. It is then easier to understand, and fully covered by JUnit tests.  
+  
+  One consequence is that it's difficult to identify the lacking   
+
+  
+{C}. What does it do?
+  
+    The plugins follows these steps, to manage the translation files:
+    
+    * It reads all input files, from the input folder (default to: ./jupload-translation/src/lang folder)
+    
+    * The lang.properties is the default language, in the applet code. It is also the format template for the jupload-translation
+    plugin
+    
+    * All files from the input folder, are formatted according to the lang.properties file, and stored in UTF-8 (that is, 
+    in human readable format) in the work folder (default to ./jupload-translation/target/translation).
+    
+    * Once all files are successfully translated:
+    
+      * The UTF-8 files are copied "as is" to the input folder. This folder is 
+      the 'true' source for further translation improvement.
+      
+      * The UTF-8 are translated in ASCII containing unicode (\uNNNN strings) files, which are written into the resourcesLang 
+      folder (default to ./jupload-translation/src/resources/lang), where the Java code expects them for use during 
+      the applet execution.
+      
+      []
+
+    []
+    
+    __Note:__ this last step should not exist, with maven build. All generated code should be out of SVN. That is: these
+    generated files should be written directly beneath the target folder. This behavior is kept to maintain compatibility 
+    with ant build. This also makes JUpload be a mono-module project, which make it easier to handle for most people. 
Index: 3thparty/jupload/maven-translation-plugin/src/site/apt/howto-useit.apt
===================================================================
--- 3thparty/jupload/maven-translation-plugin/src/site/apt/howto-useit.apt	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/src/site/apt/howto-useit.apt	(revision 3951)
@@ -0,0 +1,26 @@
+           --------------------
+           JUpload - jupload-translation - HowTo use it?
+           --------------------
+           --------------------
+           --------------------
+
+
+  <<Content>>
+  
+  * {{{A}Who should use it?}}
+  
+  * {{{B}Why this plugin was developped?}}
+
+
+__TODO: Finish this page!__
+           
+{A}. Who should use it?
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+  To execute it, you must activate the plugin in the compilation phase. 
+
+           
+{B}. Who should use it?
+~~~~~~~~~~~~~~~~~~~~~~~~~
+
+
Index: 3thparty/jupload/maven-translation-plugin/pom.xml
===================================================================
--- 3thparty/jupload/maven-translation-plugin/pom.xml	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/pom.xml	(revision 3951)
@@ -0,0 +1,160 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
+	<modelVersion>4.0.0</modelVersion>
+	<groupId>net.sf.jupload</groupId>
+	<artifactId>maven-translation-plugin</artifactId>
+	<packaging>maven-plugin</packaging>
+	<version>1.0.0</version>
+	<name>jupload-translation</name>
+	<description>This plugin manages the translation of JUpload. It's aim
+		is to standardize the file formats, and to emphasize the missing
+		translation in each translation file.</description>
+	<url>http://jupload.sourceforge.net</url>
+
+	<profiles>
+		<profile>
+			<!--
+				This profile activate all reporting for the JUpload site. It's
+				activated by default. It's main use is ... that it can be
+				deactivated. Useful, for checking the APT files rendering. Executing
+				'mvn site -Dskip.reporting' will deactivate default profiles, and
+				quickly generate the maven site, from the previously run reports.
+			-->
+			<id>reporting</id>
+			<activation>
+				<property>
+					<name>!skip.reporting</name>
+				</property>
+			</activation>
+			<reporting>
+				<plugins>
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>cobertura-maven-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-pmd-plugin</artifactId>
+						<version>2.4</version>
+						<configuration>
+							<targetJdk>1.5</targetJdk>
+							<rulesets>
+								<ruleset>/rulesets/basic.xml</ruleset>
+								<ruleset>/rulesets/controversial.xml</ruleset>
+							</rulesets>
+							<format>xml</format>
+							<linkXref>true</linkXref>
+							<sourceEncoding>utf-8</sourceEncoding>
+							<minimumTokens>100</minimumTokens>
+						</configuration>
+					</plugin>
+					<plugin>
+						<artifactId>maven-surefire-plugin</artifactId>
+						<version>2.5</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-javadoc-plugin</artifactId>
+						<version>2.6.1</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-jxr-plugin</artifactId>
+						<version>2.1</version>
+					</plugin>
+					<plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-clover-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+					<!--
+						One of these plugins seem to generates an error, when executing
+						the release:perform <plugin> <groupId>org.codehaus.mojo</groupId>
+						<artifactId>scmchangelog-maven-plugin</artifactId>
+						<version>1.3</version> </plugin> <plugin>
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-changelog-plugin</artifactId>
+						<version>2.1</version> </plugin>
+					-->
+					<!--
+						<plugin> Needs
+						org.apache.maven.shared:maven-doxia-tools:jar:1.0.2, whose
+						download doesn't work, from my network !
+						<groupId>org.apache.maven.plugins</groupId>
+						<artifactId>maven-changes-plugin</artifactId>
+						<version>2.3</version> </plugin>
+					-->
+					<plugin>
+						<groupId>org.codehaus.mojo</groupId>
+						<artifactId>taglist-maven-plugin</artifactId>
+						<version>2.4</version>
+					</plugin>
+				</plugins>
+			</reporting>
+		</profile>
+	</profiles>
+
+	<dependencies>
+		<!--
+			<dependency> <groupId>commons-lang</groupId>
+			<artifactId>commons-lang</artifactId> <version>2.5</version>
+			</dependency>
+		-->
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.5</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>log4j</groupId>
+			<artifactId>log4j</artifactId>
+			<version>1.2.13</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.maven</groupId>
+			<artifactId>maven-plugin-api</artifactId>
+			<version>2.0</version>
+		</dependency>
+		<dependency>
+			<groupId>org.apache.velocity</groupId>
+			<artifactId>velocity</artifactId>
+			<version>1.6.4</version>
+		</dependency>
+	</dependencies>
+	<build>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-compiler-plugin</artifactId>
+				<configuration>
+					<source>1.5</source>
+					<target>1.5</target>
+				</configuration>
+			</plugin>
+		</plugins>
+	</build>
+	<distributionManagement>
+		<!--
+			We have no Maven repository yet. So release are to be deployed on a
+			local repository.... TODO: have a real repository. Publish to Maven
+			Central Repository?
+		-->
+		<repository>
+			<id>${jupload.distributionManagement.repository.id}</id>
+			<name>${jupload.distributionManagement.repository.name}</name>
+			<url>${jupload.distributionManagement.repository.url}</url>
+		</repository>
+		<snapshotRepository>
+			<id>${jupload.distributionManagement.snapshotRepository.id}</id>
+			<name>${jupload.distributionManagement.snapshotRepository.name}</name>
+			<url>${jupload.distributionManagement.snapshotRepository.url}</url>
+		</snapshotRepository>
+	</distributionManagement>
+
+	<!--
+		Reporting: see the 'reporting' profile, here above.  
+	 -->
+
+</project>
Index: 3thparty/jupload/maven-translation-plugin/.settings/org.eclipse.core.resources.prefs
===================================================================
--- 3thparty/jupload/maven-translation-plugin/.settings/org.eclipse.core.resources.prefs	(revision 3951)
+++ 3thparty/jupload/maven-translation-plugin/.settings/org.eclipse.core.resources.prefs	(revision 3951)
@@ -0,0 +1,11 @@
+#Thu Sep 30 19:04:55 CEST 2010
+eclipse.preferences.version=1
+encoding//src/test/resources/lang.utf-16=UTF-16
+encoding//src/test/resources/lang.utf-8=UTF-8
+encoding//src/test/resources/lang.utf-8/lang.properties=UTF-8
+encoding//src/test/resources/lang.utf-8/lang_fr.properties=UTF-8
+encoding//src/test/resources/lang.verif.utf-16=UTF-16
+encoding//src/test/resources/lang.verif.utf-16_to_apt=UTF-16
+encoding//src/test/resources/lang.verif.utf-16_to_unicode=UTF-16
+encoding//src/test/resources/lang.verif.utf-8=UTF-8
+encoding//src/test/resources/lang.verif.utf-8/lang.properties=UTF-8
