├── .dockerignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── reporting-an-issue.md ├── dependabot.yml └── workflows │ └── publish-docker.yml ├── .gitignore ├── .jshintrc ├── .travis.yml ├── Dockerfile ├── Gruntfile.js ├── LICENSE ├── README.md ├── apptainer.def ├── config-default.json ├── config.js ├── data └── .gitignore ├── docs ├── generateDocs.bat ├── generateDocs.sh ├── generateSwaggerAPI.js ├── index.adoc ├── readme_4th_DEM.PNG ├── readme_4th_Ortho.PNG ├── readme_4th_images.png ├── readme_greg12_gcp1.png ├── readme_greg12_ortho_gcp.png ├── readme_gregg12_images.png ├── readme_web.png ├── swagger.json └── swagger2markup-cli-1.0.1.jar ├── helpers └── odmOptionsToJson.py ├── index.js ├── libs ├── Directories.js ├── ProgressReceiver.js ├── S3.js ├── Task.js ├── TaskManager.js ├── apps.js ├── auth │ ├── NoTokenRequiredAuth.js │ ├── SimpleTokenAuth.js │ ├── TokenAuthBase.js │ └── factory.js ├── logger.js ├── odmInfo.js ├── odmRunner.js ├── processRunner.js ├── statusCodes.js ├── taskNew.js ├── utils.js └── ziputils.js ├── micmac ├── VERSION ├── odm_options.json ├── opendm │ ├── __init__.py │ ├── config.py │ ├── context.py │ ├── gcp.py │ ├── io.py │ ├── location.py │ ├── log.py │ ├── progress.py │ └── system.py ├── requirements.txt ├── run.py ├── run.sh └── settings.yaml ├── package.json ├── processes.json ├── public ├── css │ ├── bootstrap.min.css │ ├── fileinput.css │ ├── fileinput.min.css │ └── main.css ├── examples │ └── index.html ├── fonts │ ├── glyphicons-halflings-regular.eot │ ├── glyphicons-halflings-regular.svg │ ├── glyphicons-halflings-regular.ttf │ └── glyphicons-halflings-regular.woff ├── img │ ├── loading-sm.gif │ └── loading.gif ├── index.html ├── js │ ├── dropzone.js │ ├── locales │ │ ├── LANG.js │ │ ├── ar.js │ │ ├── bg.js │ │ ├── ca.js │ │ ├── cr.js │ │ ├── cz.js │ │ ├── da.js │ │ ├── de.js │ │ ├── el.js │ │ ├── es.js │ │ ├── fa.js │ │ ├── fi.js │ │ ├── fr.js │ │ ├── hu.js │ │ ├── id.js │ │ ├── it.js │ │ ├── ja.js │ │ ├── nl.js │ │ ├── pl.js │ │ ├── pt-BR.js │ │ ├── pt.js │ │ ├── ro.js │ │ ├── ru.js │ │ ├── sk.js │ │ ├── th.js │ │ ├── tr.js │ │ ├── uk.js │ │ ├── zh-TW.js │ │ └── zh.js │ ├── main.js │ ├── plugins │ │ ├── canvas-to-blob.js │ │ ├── canvas-to-blob.min.js │ │ ├── purify.js │ │ ├── purify.min.js │ │ ├── sortable.js │ │ └── sortable.min.js │ └── vendor │ │ ├── bootstrap.js │ │ ├── bootstrap.min.js │ │ ├── jquery-1.11.2.min.js │ │ ├── knockout-3.4.0.js │ │ ├── ko.observableDictionary.js │ │ ├── modernizr-2.8.3.min.js │ │ └── npm.js └── themes │ ├── fa │ └── fa.js │ └── gly │ └── gly.js ├── scripts ├── color_relief.txt ├── gdal2tiles.py ├── hsv_merge.py └── postprocess.sh ├── services └── nodeodm.service ├── tests ├── data │ └── .gitignore ├── gdal2tiles_output.txt ├── odm_options.json ├── odm_output.txt ├── potree_output.txt └── processing_results │ ├── all.zip │ ├── dsm_tiles │ ├── 16 │ │ ├── 16020 │ │ │ └── 42443.png │ │ └── 16021 │ │ │ └── 42443.png │ ├── 17 │ │ ├── 32041 │ │ │ └── 84886.png │ │ └── 32042 │ │ │ └── 84886.png │ ├── 18 │ │ ├── 64083 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ │ └── 64084 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ ├── .gitignore │ └── tilemapresource.xml │ ├── dtm_tiles │ ├── 16 │ │ ├── 16020 │ │ │ └── 42443.png │ │ └── 16021 │ │ │ └── 42443.png │ ├── 17 │ │ ├── 32041 │ │ │ └── 84886.png │ │ └── 32042 │ │ │ └── 84886.png │ ├── 18 │ │ ├── 64083 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ │ └── 64084 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ ├── .gitignore │ └── tilemapresource.xml │ ├── images.json │ ├── odm_dem │ ├── .gitignore │ ├── dsm.tif │ └── dtm.tif │ ├── odm_georeferencing │ ├── .gitignore │ ├── odm_georeferenced_model.csv │ ├── odm_georeferenced_model.las │ ├── odm_georeferenced_model.laz │ └── odm_georeferenced_model.ply │ ├── odm_meshing │ └── .gitignore │ ├── odm_orthophoto │ ├── .gitignore │ ├── odm_orthophoto.mbtiles │ ├── odm_orthophoto.png │ └── odm_orthophoto.tif │ ├── odm_texturing │ ├── .gitignore │ ├── non_visible_faces_texture.jpg │ ├── odm_textured_model.obj │ ├── odm_textured_model_geo.mtl │ ├── odm_textured_model_geo.obj │ ├── texture_0.jpg │ └── texture_1.jpg │ ├── opensfm │ └── features │ │ └── test.txt │ ├── orthophoto_tiles │ ├── 16 │ │ ├── 16020 │ │ │ └── 42443.png │ │ └── 16021 │ │ │ └── 42443.png │ ├── 17 │ │ ├── 32041 │ │ │ └── 84886.png │ │ └── 32042 │ │ │ └── 84886.png │ ├── 18 │ │ ├── 64083 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ │ └── 64084 │ │ │ ├── 169772.png │ │ │ └── 169773.png │ ├── .gitignore │ └── tilemapresource.xml │ └── potree_pointcloud │ └── cloud.js └── tmp └── .gitignore /.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | tests 3 | tmp 4 | nodemicmac.sif 5 | node 6 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: '' 3 | about: Create an issue 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **************************************** 11 | PLEASE REMOVE THIS NOTE AFTER READING IT! 12 | 13 | First of all, thank you for taking the time to report an issue. 14 | 15 | For questions, comments and feature requests, please open a topic on https://community.opendronemap.org/. This is not the right place. 16 | 17 | Please open an issue only to report faults and bugs and follow the format specified below. 18 | **************************************** 19 | 20 | ### What is the problem? 21 | 22 | [Type answer here] 23 | 24 | ### What should be the expected behavior? 25 | 26 | [Type answer here] 27 | 28 | ### How can we reproduce this? (What steps did you do to trigger the problem? Be detailed) 29 | 30 | [Type answer here] 31 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/reporting-an-issue.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Reporting an issue 3 | about: Create an issue 4 | title: '' 5 | labels: '' 6 | assignees: '' 7 | 8 | --- 9 | 10 | **************************************** 11 | PLEASE REMOVE THIS NOTE AFTER READING IT! 12 | 13 | First of all, thank you for taking the time to report an issue. 14 | 15 | For questions, comments and feature requests, please open a topic on https://community.opendronemap.org/. This is not the right place. 16 | 17 | Please open an issue only to report faults and bugs and follow the format specified below. 18 | **************************************** 19 | 20 | ### What is the problem? 21 | 22 | [Type answer here] 23 | 24 | ### What should be the expected behavior? 25 | 26 | [Type answer here] 27 | 28 | ### How can we reproduce this? (What steps did you do to trigger the problem? Be detailed) 29 | 30 | [Type answer here] 31 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://docs.github.com/code-security/dependabot/dependabot-version-updates/configuration-options-for-the-dependabot.yml-file 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" 9 | directory: "/" 10 | schedule: 11 | interval: "weekly" 12 | 13 | - package-ecosystem: "pip" 14 | directory: "/" 15 | schedule: 16 | interval: "weekly" 17 | -------------------------------------------------------------------------------- /.github/workflows/publish-docker.yml: -------------------------------------------------------------------------------- 1 | name: Publish Docker 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | tags: 8 | - v* 9 | 10 | # Triggered by ODM build (after docker push) 11 | workflow_dispatch: 12 | 13 | jobs: 14 | build: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v2 19 | - name: Set up QEMU 20 | uses: docker/setup-qemu-action@v1 21 | - name: Set up Docker Buildx 22 | uses: docker/setup-buildx-action@v1 23 | - name: Login to DockerHub 24 | uses: docker/login-action@v1 25 | with: 26 | username: ${{ secrets.DOCKERHUB_USERNAME }} 27 | password: ${{ secrets.DOCKERHUB_TOKEN }} 28 | # Use the repository information of the checked-out code to format docker tags 29 | - name: Docker meta 30 | id: docker_meta 31 | uses: crazy-max/ghaction-docker-meta@v1 32 | with: 33 | images: opendronemap/nodemicmac 34 | tag-semver: | 35 | {{version}} 36 | - name: Build and push Docker image 37 | id: docker_build 38 | uses: docker/build-push-action@v2 39 | with: 40 | file: ./Dockerfile 41 | platforms: linux/amd64, linux/arm64 42 | push: true 43 | tags: | 44 | ${{ steps.docker_meta.outputs.tags }} 45 | opendronemap/nodemicmac:latest 46 | - name: Update repo description 47 | uses: peter-evans/dockerhub-description@v2 48 | with: 49 | username: ${{ secrets.DOCKERHUB_USERNAME }} 50 | password: ${{ secrets.DOCKERHUB_TOKEN }} 51 | repository: opendronemap/nodemicmac 52 | short-description: ${{ github.event.repository.description }} 53 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | 6 | # Runtime data 7 | pids 8 | *.pid 9 | *.seed 10 | *.pid.lock 11 | 12 | # Directory for instrumented libs generated by jscoverage/JSCover 13 | lib-cov 14 | 15 | # Coverage directory used by tools like istanbul 16 | coverage 17 | 18 | # nyc test coverage 19 | .nyc_output 20 | 21 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 22 | .grunt 23 | 24 | # node-waf configuration 25 | .lock-wscript 26 | 27 | # Compiled binary addons (http://nodejs.org/api/addons.html) 28 | build/Release 29 | 30 | # Dependency directories 31 | node_modules 32 | jspm_packages 33 | 34 | # Optional npm cache directory 35 | .npm 36 | 37 | # Optional REPL history 38 | .node_repl_history 39 | 40 | # Elastic Beanstalk 41 | .elasticbeanstalk 42 | 43 | .vscode 44 | 45 | package-lock.json 46 | 47 | .idea/* 48 | .idea 49 | 50 | micmac/build 51 | micmac/build/* 52 | 53 | *.pyc 54 | 55 | node 56 | nodemicmac.sif 57 | node-MicMac.log 58 | -------------------------------------------------------------------------------- /.jshintrc: -------------------------------------------------------------------------------- 1 | { 2 | "esnext": true, 3 | "node": true 4 | } -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | sudo: required 2 | 3 | services: 4 | - docker 5 | 6 | before_install: 7 | - docker build -t opendronemap/node-opendronemap . 8 | 9 | script: docker run opendronemap/node-opendronemap --powercycle 10 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:21.04 2 | 3 | EXPOSE 3000 4 | 5 | ENV DEBIAN_FRONTEND noninteractive 6 | 7 | USER root 8 | 9 | # Use old-releases for 21.04 10 | RUN printf "deb http://old-releases.ubuntu.com/ubuntu/ hirsute main restricted\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute-updates main restricted\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute universe\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute-updates universe\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute multiverse\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute-updates multiverse\ndeb http://old-releases.ubuntu.com/ubuntu/ hirsute-backports main restricted universe multiverse" > /etc/apt/sources.list 11 | 12 | RUN apt-get update 13 | RUN apt-get install -y -qq --no-install-recommends software-properties-common build-essential cmake git \ 14 | exiv2 libimage-exiftool-perl proj-bin gdal-bin figlet imagemagick pdal libpdal-dev \ 15 | libboost-all-dev libtbb-dev libssl-dev libcurl4-openssl-dev pkg-config libpth-dev \ 16 | curl libx11-dev python3-pip python3-setuptools python3-shapely apt-utils p7zip-full 17 | 18 | RUN pip3 install -U shyaml 19 | RUN pip3 install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org appsettings 20 | RUN pip3 install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org utm 21 | RUN pip3 install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org pyproj #==2.2.0 22 | RUN pip3 install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host files.pythonhosted.org scikit-image 23 | 24 | RUN curl --silent --location https://deb.nodesource.com/setup_14.x | bash - 25 | RUN apt-get install -y nodejs 26 | RUN npm install --production 27 | 28 | # Build Entwine 29 | WORKDIR "/staging" 30 | RUN git clone --depth 1 https://github.com/OpenDroneMap/entwine /staging/entwine 31 | RUN cd /staging/entwine && \ 32 | mkdir build && \ 33 | cd build && \ 34 | cmake \ 35 | -DCMAKE_INSTALL_PREFIX=/usr \ 36 | -DWITH_TESTS=OFF \ 37 | -DCMAKE_BUILD_TYPE=Release \ 38 | ../ && \ 39 | make -j$(cat /proc/cpuinfo | grep processor | wc -l) && make install 40 | 41 | 42 | RUN mkdir /var/www 43 | WORKDIR "/var/www" 44 | COPY . /var/www 45 | 46 | RUN npm install 47 | RUN mkdir -p tmp /code 48 | RUN mkdir -p /code 49 | 50 | # Build MicMac 51 | RUN git clone --depth 1 https://github.com/OpenDroneMap/micmac micmac-build 52 | RUN cd micmac-build && \ 53 | rm -rf build && mkdir build && cd build && \ 54 | cmake \ 55 | -DBUILD_POISSON=0 \ 56 | -DBUILD_RNX2RTKP=0 \ 57 | -DWITH_OPENCL=OFF \ 58 | -DWITH_OPEN_MP=OFF \ 59 | -DWITH_ETALONPOLY=OFF \ 60 | -DWERROR=OFF \ 61 | ../ && \ 62 | make clean && \ 63 | make -j$(cat /proc/cpuinfo | grep processor | wc -l) && make install && \ 64 | mkdir -p /code/micmac && \ 65 | cd .. && \ 66 | cp -Rdp bin binaire-aux lib include /code/micmac 67 | 68 | ENV PATH "$PATH:/code/micmac/bin" 69 | 70 | RUN ln -s "$(which python3)" /usr/bin/python 71 | ENV python "$(which python3)" 72 | RUN figlet -f slant NodeMICMAC 73 | 74 | RUN mkdir -p /code/opendm 75 | COPY micmac/opendm /code/opendm 76 | COPY micmac/odm_options.json /code 77 | COPY micmac/settings.yaml /code 78 | COPY micmac/VERSION /code 79 | COPY micmac/run.sh /code 80 | COPY micmac/run.py /code 81 | 82 | RUN apt clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* /staging /var/www/micmac-build 83 | 84 | WORKDIR "/var/www" 85 | 86 | ENTRYPOINT ["/usr/bin/node", "/var/www/index.js"] 87 | -------------------------------------------------------------------------------- /Gruntfile.js: -------------------------------------------------------------------------------- 1 | module.exports = function(grunt) { 2 | 3 | require('time-grunt')(grunt); 4 | 5 | grunt.initConfig({ 6 | jshint: { 7 | options: { 8 | jshintrc: ".jshintrc" 9 | }, 10 | all: ['Gruntfile.js', 'libs/**/*.js', 'docs/**/*.js', 'index.js', 'config.js'] 11 | } 12 | }); 13 | 14 | grunt.loadNpmTasks('grunt-contrib-jshint'); 15 | grunt.registerTask('default', ['jshint']); 16 | }; -------------------------------------------------------------------------------- /apptainer.def: -------------------------------------------------------------------------------- 1 | Bootstrap: docker 2 | From: opendronemap/nodemicmac:master 3 | 4 | %labels 5 | Author Sylvain POULAIN 6 | Version 1.0 7 | Description Apptainer container for NodeMICMAC and WebGIS with Entwine and MicMac. 8 | 9 | %environment 10 | export PATH=$PATH:/code/micmac/bin 11 | export python=$(which python3) 12 | 13 | %post 14 | 15 | mkdir -p /var/www 16 | 17 | mkdir -p "/var/www" 18 | cd "/var/www" 19 | mkdir -p tmp 20 | 21 | %runscript 22 | cd "/var/www" 23 | exec /usr/bin/node /var/www/index.js "$@" 24 | %startscript 25 | cd "/var/www" 26 | exec /usr/bin/node /var/www/index.js "$@" 27 | -------------------------------------------------------------------------------- /config-default.json: -------------------------------------------------------------------------------- 1 | { 2 | "instance": "node-MicMac", 3 | "odm_path": "/code", 4 | 5 | "logger": { 6 | "level": "info", 7 | "maxFileSize": 104857600, 8 | "maxFiles": 10, 9 | "logDirectory": "" 10 | }, 11 | 12 | "port": "auto", 13 | "deamon": false, 14 | "parallelQueueProcessing": 2, 15 | "cleanupTasksAfter": 2880, 16 | "test": false, 17 | "testSkipOrthophotos": false, 18 | "testSkipDems": false, 19 | "token": "", 20 | "authorizedIps": [], 21 | "maxImages": "" 22 | } 23 | -------------------------------------------------------------------------------- /data/.gitignore: -------------------------------------------------------------------------------- 1 | * 2 | -------------------------------------------------------------------------------- /docs/generateDocs.bat: -------------------------------------------------------------------------------- 1 | node generateSwaggerAPI.js 2 | java -jar swagger2markup-cli-1.0.1.jar convert -i swagger.json -f index 3 | -------------------------------------------------------------------------------- /docs/generateDocs.sh: -------------------------------------------------------------------------------- 1 | node generateSwaggerAPI.js 2 | java -jar swagger2markup-cli-1.0.1.jar convert -i swagger.json -f index 3 | -------------------------------------------------------------------------------- /docs/generateSwaggerAPI.js: -------------------------------------------------------------------------------- 1 | /* 2 | Node-OpenDroneMap Node.js App and REST API to access OpenDroneMap. 3 | Copyright (C) 2016 Node-OpenDroneMap Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | let swaggerJSDoc = require('swagger-jsdoc'); 20 | let fs = require('fs'); 21 | 22 | let packageJson = JSON.parse(fs.readFileSync('../package.json')); 23 | 24 | let options = { 25 | swaggerDefinition: { 26 | info: { 27 | title: packageJson.name, 28 | version: packageJson.version, 29 | description: packageJson.description, 30 | license: { 31 | name: packageJson.license 32 | }, 33 | contact: { 34 | name: packageJson.author 35 | } 36 | }, 37 | consumes: ["application/json"], 38 | produces: ["application/json", "application/zip"], 39 | basePath: "/", 40 | schemes: ["http"] 41 | }, 42 | apis: ['../index.js'], // Path to the API docs 43 | }; 44 | 45 | // Initialize swagger-jsdoc -> returns validated swagger spec in json format 46 | let swaggerSpec = swaggerJSDoc(options); 47 | fs.writeFileSync('swagger.json', JSON.stringify(swaggerSpec)); -------------------------------------------------------------------------------- /docs/readme_4th_DEM.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_4th_DEM.PNG -------------------------------------------------------------------------------- /docs/readme_4th_Ortho.PNG: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_4th_Ortho.PNG -------------------------------------------------------------------------------- /docs/readme_4th_images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_4th_images.png -------------------------------------------------------------------------------- /docs/readme_greg12_gcp1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_greg12_gcp1.png -------------------------------------------------------------------------------- /docs/readme_greg12_ortho_gcp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_greg12_ortho_gcp.png -------------------------------------------------------------------------------- /docs/readme_gregg12_images.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_gregg12_images.png -------------------------------------------------------------------------------- /docs/readme_web.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/readme_web.png -------------------------------------------------------------------------------- /docs/swagger2markup-cli-1.0.1.jar: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/docs/swagger2markup-cli-1.0.1.jar -------------------------------------------------------------------------------- /helpers/odmOptionsToJson.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | ''' 3 | Node-OpenDroneMap Node.js App and REST API to access OpenDroneMap. 4 | Copyright (C) 2016 Node-OpenDroneMap Contributors 5 | 6 | This program is free software: you can redistribute it and/or modify 7 | it under the terms of the GNU General Public License as published by 8 | the Free Software Foundation, either version 3 of the License, or 9 | (at your option) any later version. 10 | 11 | This program is distributed in the hope that it will be useful, 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 14 | GNU General Public License for more details. 15 | 16 | You should have received a copy of the GNU General Public License 17 | along with this program. If not, see . 18 | ''' 19 | 20 | import sys 21 | import imp 22 | import argparse 23 | import json 24 | import os 25 | 26 | dest_file = os.environ.get("ODM_OPTIONS_TMP_FILE") 27 | 28 | sys.path.append(sys.argv[2]) 29 | 30 | try: 31 | imp.load_source('opendm', sys.argv[2] + '/opendm/__init__.py') 32 | except: 33 | pass 34 | try: 35 | imp.load_source('context', sys.argv[2] + '/opendm/context.py') 36 | except: 37 | pass 38 | odm = imp.load_source('config', sys.argv[2] + '/opendm/config.py') 39 | 40 | options = {} 41 | class ArgumentParserStub(argparse.ArgumentParser): 42 | def add_argument(self, *args, **kwargs): 43 | argparse.ArgumentParser.add_argument(self, *args, **kwargs) 44 | options[args[0]] = {} 45 | for name, value in kwargs.items(): 46 | options[args[0]][str(name)] = str(value) 47 | 48 | def add_mutually_exclusive_group(self): 49 | return ArgumentParserStub() 50 | 51 | if not hasattr(odm, 'parser'): 52 | # ODM >= 2.0 53 | odm.config(parser=ArgumentParserStub()) 54 | else: 55 | # ODM 1.0 56 | odm.parser = ArgumentParserStub() 57 | odm.config() 58 | 59 | out = json.dumps(options) 60 | print(out) 61 | if dest_file is not None: 62 | with open(dest_file, "w") as f: 63 | f.write(out) 64 | -------------------------------------------------------------------------------- /libs/Directories.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | let config = require('../config'); 20 | let path = require('path'); 21 | 22 | class Directories{ 23 | static get data(){ 24 | return !config.test ? "data" : path.join("tests", "data"); 25 | } 26 | } 27 | 28 | module.exports = Directories; 29 | -------------------------------------------------------------------------------- /libs/ProgressReceiver.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | const logger = require('./logger'); 20 | const dgram = require('dgram'); 21 | 22 | module.exports = class ProgressReceiver{ 23 | constructor(){ 24 | const server = dgram.createSocket({type: 'udp4', reuseAddr: true}); 25 | this.callbacks = []; 26 | 27 | server.on('error', (err) => { 28 | logger.warn(`Progress listener server error: ${err.stack}`); 29 | server.close(); 30 | }); 31 | 32 | server.on('message', (msg) => { 33 | const parts = String(msg).split("/"); 34 | if (parts.length === 4){ 35 | const cmd = parts[0]; 36 | if (cmd === 'PGUP'){ 37 | let [_, pid, uuid, globalProgress] = parts; 38 | globalProgress = parseFloat(globalProgress); 39 | 40 | if (!isNaN(globalProgress)){ 41 | this.callbacks.forEach(callback => callback(uuid, globalProgress)); 42 | } 43 | } 44 | } 45 | }); 46 | 47 | server.on('listening', () => { 48 | const address = server.address(); 49 | logger.info(`Listening on ${address.address}:${address.port} UDP for progress updates`); 50 | }); 51 | 52 | server.bind(6367); 53 | } 54 | 55 | addListener(callback){ 56 | this.callbacks.push(callback); 57 | } 58 | }; 59 | 60 | -------------------------------------------------------------------------------- /libs/apps.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | const fs = require('fs'); 19 | const path = require('path'); 20 | 21 | let sevenZ = "7z"; 22 | let unzip = "unzip"; 23 | 24 | if (fs.existsSync(path.join("apps", "7z", "7z.exe"))){ 25 | sevenZ = path.resolve(path.join("apps", "7z", "7z.exe")); 26 | } 27 | 28 | if (fs.existsSync(path.join("apps", "unzip", "unzip.exe"))){ 29 | unzip = path.resolve(path.join("apps", "unzip", "unzip.exe")); 30 | } 31 | 32 | module.exports = { 33 | sevenZ, unzip 34 | }; 35 | -------------------------------------------------------------------------------- /libs/auth/NoTokenRequiredAuth.js: -------------------------------------------------------------------------------- 1 | /* 2 | Node-OpenDroneMap Node.js App and REST API to access OpenDroneMap. 3 | Copyright (C) 2018 Node-OpenDroneMap Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | const TokenAuthBase = require('./TokenAuthBase'); 19 | 20 | module.exports = class NoTokenRequiredAuth extends TokenAuthBase{ 21 | // Always return valid 22 | validateToken(token, cb){ cb(null, true); } 23 | }; -------------------------------------------------------------------------------- /libs/auth/SimpleTokenAuth.js: -------------------------------------------------------------------------------- 1 | /* 2 | Node-OpenDroneMap Node.js App and REST API to access OpenDroneMap. 3 | Copyright (C) 2018 Node-OpenDroneMap Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | const TokenAuthBase = require('./TokenAuthBase'); 19 | 20 | module.exports = class SimpleTokenAuth extends TokenAuthBase{ 21 | // @param token {String} token to use for authentication 22 | constructor(token){ 23 | super(token); 24 | 25 | this.token = token; 26 | } 27 | 28 | validateToken(token, cb){ 29 | if (this.token === token){ 30 | return cb(null, true); 31 | }else{ 32 | cb(new Error("token does not match."), false); 33 | } 34 | } 35 | }; -------------------------------------------------------------------------------- /libs/auth/TokenAuthBase.js: -------------------------------------------------------------------------------- 1 | /* 2 | Node-OpenDroneMap Node.js App and REST API to access OpenDroneMap. 3 | Copyright (C) 2018 Node-OpenDroneMap Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU General Public License 16 | along with this program. If not, see . 17 | */ 18 | let logger = require('../logger'); 19 | 20 | module.exports = /*abstract */ class TokenAuthBase{ 21 | initialize(cb){ 22 | logger.info(`Authentication using ${this.constructor.name.replace(/Auth$/, "")}`); 23 | cb(); 24 | } 25 | 26 | cleanup(cb){ 27 | cb(); 28 | } 29 | 30 | validateToken(token, cb){ cb(new Error("Not implemented"), false); } 31 | 32 | getMiddleware(){ 33 | return (req, res, next) => { 34 | this.validateToken(req.query.token, (err, valid) => { 35 | if (valid) next(); 36 | else{ 37 | res.json({ error: "Invalid authentication token: " + err.message }); 38 | } 39 | }); 40 | }; 41 | } 42 | }; -------------------------------------------------------------------------------- /libs/auth/factory.js: -------------------------------------------------------------------------------- 1 | const NoTokenRequiredAuth = require('./NoTokenRequiredAuth'); 2 | const SimpleTokenAuth = require('./SimpleTokenAuth'); 3 | 4 | module.exports = { 5 | fromConfig: function(config){ 6 | if (config.token){ 7 | return new SimpleTokenAuth(config.token); 8 | }else{ 9 | return new NoTokenRequiredAuth(); 10 | } 11 | } 12 | } -------------------------------------------------------------------------------- /libs/logger.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | 20 | let config = require('../config'); 21 | let winston = require('winston'); 22 | let fs = require('fs'); 23 | let path = require('path'); 24 | 25 | // Set up logging 26 | // Configure custom File transport to write plain text messages 27 | let logPath = ( config.logger.logDirectory ? 28 | config.logger.logDirectory : 29 | path.join(__dirname, "..") ); 30 | 31 | // Check that log file directory can be written to 32 | try { 33 | fs.accessSync(logPath, fs.W_OK); 34 | } catch (e) { 35 | console.log( "Log directory '" + logPath + "' cannot be written to" ); 36 | throw e; 37 | } 38 | logPath += path.sep; 39 | logPath += config.instance + ".log"; 40 | 41 | let transports = []; 42 | if (!config.deamon){ 43 | transports.push(new winston.transports.Console({ level: config.logger.level, format: winston.format.simple() })); 44 | } 45 | 46 | let logger = winston.createLogger({ transports }); 47 | logger.add(new winston.transports.File({ 48 | format: winston.format.simple(), 49 | filename: logPath, // Write to projectname.log 50 | json: false, // Write in plain text, not JSON 51 | maxsize: config.logger.maxFileSize, // Max size of each file 52 | maxFiles: config.logger.maxFiles, // Max number of files 53 | level: config.logger.level // Level of log messages 54 | })); 55 | 56 | module.exports = logger; 57 | -------------------------------------------------------------------------------- /libs/processRunner.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | let fs = require('fs'); 20 | let apps = require('./apps'); 21 | let path = require('path'); 22 | let assert = require('assert'); 23 | let spawn = require('child_process').spawn; 24 | let config = require('../config.js'); 25 | let logger = require('./logger'); 26 | let utils = require('./utils'); 27 | 28 | 29 | function makeRunner(command, args, requiredOptions = [], outputTestFile = null, skipOnTest = true){ 30 | return function(options, done, outputReceived){ 31 | for (let requiredOption of requiredOptions){ 32 | assert(options[requiredOption] !== undefined, `${requiredOption} must be defined`); 33 | } 34 | 35 | let commandArgs = args; 36 | if (typeof commandArgs === 'function') commandArgs = commandArgs(options); 37 | 38 | logger.info(`About to run: ${command} ${commandArgs.join(" ")}`); 39 | 40 | if (config.test && skipOnTest){ 41 | logger.info("Test mode is on, command will not execute"); 42 | 43 | if (outputTestFile){ 44 | fs.readFile(path.resolve(__dirname, outputTestFile), 'utf8', (err, text) => { 45 | if (!err){ 46 | if (outputReceived !== undefined){ 47 | let lines = text.split("\n"); 48 | lines.forEach(line => outputReceived(line)); 49 | } 50 | 51 | done(null, 0, null); 52 | }else{ 53 | logger.warn(`Error: ${err.message}`); 54 | done(err); 55 | } 56 | }); 57 | }else{ 58 | done(null, 0, null); 59 | } 60 | 61 | return;// Skip rest 62 | } 63 | 64 | // Launch 65 | const env = utils.clone(process.env); 66 | env.LD_LIBRARY_PATH = path.join(config.odm_path, "SuperBuild", "install", "lib"); 67 | 68 | let cwd = undefined; 69 | if (options.cwd) cwd = options.cwd; 70 | 71 | let childProcess = spawn(command, commandArgs, { env, cwd }); 72 | 73 | childProcess 74 | .on('exit', (code, signal) => done(null, code, signal)) 75 | .on('error', done); 76 | 77 | if (outputReceived !== undefined){ 78 | childProcess.stdout.on('data', chunk => outputReceived(chunk.toString())); 79 | childProcess.stderr.on('data', chunk => outputReceived(chunk.toString())); 80 | }else{ 81 | childProcess.stdout.on('data', () => {}); 82 | childProcess.stderr.on('data', () => {}); 83 | } 84 | 85 | return childProcess; 86 | }; 87 | } 88 | 89 | module.exports = { 90 | runPostProcessingScript: makeRunner(path.join(__dirname, "..", "scripts", "postprocess.sh"), 91 | function(options){ 92 | return [options.projectFolderPath]; 93 | }, 94 | ["projectFolderPath"]), 95 | 96 | sevenZip: makeRunner(apps.sevenZ, function(options){ 97 | return ["a", "-mx=0", "-y", "-r", "-bd", options.destination].concat(options.pathsToArchive); 98 | }, 99 | ["destination", "pathsToArchive", "cwd"], 100 | null, 101 | false), 102 | 103 | sevenUnzip: makeRunner(apps.sevenZ, function(options){ 104 | let cmd = "x"; // eXtract files with full paths 105 | if (options.noDirectories) cmd = "e"; //Extract files from archive (without using directory names) 106 | 107 | return [cmd, "-aoa", "-bd", "-y", `-o${options.destination}`, options.file]; 108 | }, 109 | ["destination", "file"], 110 | null, 111 | false), 112 | 113 | unzip: makeRunner(apps.unzip, function(options){ 114 | const opts = options.noDirectories ? ["-j"] : []; 115 | return opts.concat(["-qq", "-o", options.file, "-d", options.destination]); 116 | }, 117 | ["destination", "file"], 118 | null, 119 | false) 120 | }; 121 | -------------------------------------------------------------------------------- /libs/statusCodes.js: -------------------------------------------------------------------------------- 1 | /* 2 | NodeODM App and REST API to access ODM. 3 | Copyright (C) 2016 NodeODM Contributors 4 | 5 | This program is free software: you can redistribute it and/or modify 6 | it under the terms of the GNU Affero General Public License as published by 7 | the Free Software Foundation, either version 3 of the License, or 8 | (at your option) any later version. 9 | 10 | This program is distributed in the hope that it will be useful, 11 | but WITHOUT ANY WARRANTY; without even the implied warranty of 12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 | GNU General Public License for more details. 14 | 15 | You should have received a copy of the GNU Affero General Public License 16 | along with this program. If not, see . 17 | */ 18 | "use strict"; 19 | module.exports = { 20 | QUEUED: 10, 21 | RUNNING: 20, 22 | FAILED: 30, 23 | COMPLETED: 40, 24 | CANCELED: 50 25 | }; 26 | -------------------------------------------------------------------------------- /libs/utils.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | 3 | const path = require('path'); 4 | const os = require('os'); 5 | const crypto = require('crypto'); 6 | 7 | module.exports = { 8 | get: function(scope, prop, defaultValue){ 9 | let parts = prop.split("."); 10 | let current = scope; 11 | for (let i = 0; i < parts.length; i++){ 12 | if (current[parts[i]] !== undefined && i < parts.length - 1){ 13 | current = current[parts[i]]; 14 | }else if (current[parts[i]] !== undefined && i < parts.length){ 15 | return current[parts[i]]; 16 | }else{ 17 | return defaultValue; 18 | } 19 | } 20 | return defaultValue; 21 | }, 22 | 23 | sanitize: function(filePath){ 24 | filePath = filePath.replace(/[^\w.-]/g, "_"); 25 | return filePath; 26 | }, 27 | 28 | parseUnsafePathsList: function(paths){ 29 | // Parse a list (or a JSON encoded string representing a list) 30 | // of paths and remove all traversals (., ..) and guarantee 31 | // that the paths are relative 32 | 33 | if (typeof paths === "string"){ 34 | try{ 35 | paths = JSON.parse(paths); 36 | }catch(e){ 37 | return []; 38 | } 39 | } 40 | 41 | if (!Array.isArray(paths)){ 42 | return []; 43 | } 44 | 45 | return paths.map(p => { 46 | const safeSuffix = path.normalize(p).replace(/^(\.\.(\/|\\|$))+/, ''); 47 | return path.join('./', safeSuffix); 48 | }); 49 | }, 50 | 51 | clone: function(json){ 52 | return JSON.parse(JSON.stringify(json)); 53 | }, 54 | 55 | tmpPath: function(extension = ".txt"){ 56 | return path.join(os.tmpdir(), `nodeodm_${crypto.randomBytes(6).readUIntLE(0,6).toString(36)}${extension}`); 57 | } 58 | }; 59 | 60 | -------------------------------------------------------------------------------- /libs/ziputils.js: -------------------------------------------------------------------------------- 1 | const processRunner = require('./processRunner'); 2 | const nodeUnzip = require('node-unzip-2'); 3 | const config = require('../config'); 4 | const fs = require('fs'); 5 | 6 | module.exports = { 7 | unzip: function(file, outputDir, cb, noDirectories = false){ 8 | if (config.hasUnzip){ 9 | processRunner.unzip({ 10 | file: file, 11 | destination: outputDir, 12 | noDirectories 13 | }, (err, code, _) => { 14 | if (err) cb(err); 15 | else{ 16 | if (code === 0) cb(); 17 | else cb(new Error(`Could not extract .zip file, unzip exited with code ${code}`)); 18 | } 19 | }); 20 | }else if (config.has7z){ 21 | processRunner.sevenUnzip({ 22 | file: file, 23 | destination: outputDir, 24 | noDirectories 25 | }, (err, code, _) => { 26 | if (err) cb(err); 27 | else{ 28 | if (code === 0) cb(); 29 | else cb(new Error(`Could not extract .zip file, 7z exited with code ${code}`)); 30 | } 31 | }); 32 | }else{ 33 | fs.createReadStream(file).pipe(nodeUnzip.Extract({ path: outputDir })) 34 | .on('close', cb) 35 | .on('error', cb); 36 | } 37 | } 38 | } 39 | -------------------------------------------------------------------------------- /micmac/VERSION: -------------------------------------------------------------------------------- 1 | 1.0.beta4 2 | -------------------------------------------------------------------------------- /micmac/odm_options.json: -------------------------------------------------------------------------------- 1 | { 2 | "--project-path": { 3 | "metavar": "", 4 | "help": "Path to the project folder." 5 | }, 6 | "--gcp": { 7 | "default": "None", 8 | "metavar": "", 9 | "help": "Path to the files containing the ground control points used for georeferencing. Default: None" 10 | }, 11 | "--max-concurrency": { 12 | "default": "4", 13 | "type": "", 14 | "metavar": "", 15 | "help": "The maximum number of cores to use in processing. Default: 4" 16 | }, 17 | "--resize-to": { 18 | "default": "800", 19 | "type": "", 20 | "metavar": "", 21 | "help": "Scale image width for tie-point extraction. Default: 800" 22 | }, 23 | "--zoom": { 24 | "default": "4", 25 | "type": "", 26 | "metavar": "", 27 | "help": "The level of DEM construction. 4 means 4x native GSD. Default: 4 Values: 1, 2, 4, 8" 28 | }, 29 | "--matcher-distance": { 30 | "metavar": "", 31 | "help": "Distance threshold in meters to find pre-matching images based on GPS exif data." 32 | }, 33 | "--multi-scale":{ 34 | "action":"store_true", 35 | "default":"False", 36 | "help":"Uses an image file pair based multi-scale tie-point generation routine similar to Photoscan." 37 | }, 38 | "--remove-ortho-tiles":{ 39 | "action":"store_true", 40 | "default":"False", 41 | "help":"Remove every other ortho tile. Speeds up ortho creation and radiometric equalization." 42 | }, 43 | "--camera-cloud":{ 44 | "action":"store_true", 45 | "default":"False", 46 | "help":"Creates a sparse point cloud with camera positions." 47 | }, 48 | "--image-footprint":{ 49 | "action":"store_true", 50 | "default":"False", 51 | "help":"Creates a point cloud and geojson with image footprints." 52 | }, 53 | "--ccd-width": { 54 | "type": "", 55 | "metavar": "", 56 | "help": "The CCD sensor width in millimeters (mm). Example: 6.17" 57 | }, 58 | "--ccd-height": { 59 | "type": "", 60 | "metavar": "", 61 | "help": "The CCD sensor height in millimeters (mm). Example: 4.55" 62 | }, 63 | "-h": { 64 | "action": "help", 65 | "default": "==SUPPRESS==", 66 | "help": "show this help message and exit" 67 | }, 68 | "--images": { 69 | "metavar": "", 70 | "help": "Path to input images" 71 | }, 72 | "--version": { 73 | "action": "version", 74 | "version": "Node MicMac", 75 | "help": "Displays version number and exits. " 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /micmac/opendm/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/micmac/opendm/__init__.py -------------------------------------------------------------------------------- /micmac/opendm/config.py: -------------------------------------------------------------------------------- 1 | import argparse 2 | from opendm import io 3 | from opendm import log 4 | from opendm import context 5 | from appsettings import SettingsParser 6 | 7 | import sys 8 | 9 | with open(io.join_paths(context.root_path, 'VERSION')) as version_file: 10 | __version__ = version_file.read().strip() 11 | 12 | 13 | def alphanumeric_string(string): 14 | import re 15 | if re.match('^[a-zA-Z0-9_-]+$', string) is None: 16 | msg = '{0} is not a valid name. Must use alphanumeric characters.'.format(string) 17 | raise argparse.ArgumentTypeError(msg) 18 | return string 19 | 20 | 21 | parser = SettingsParser(description='DroneMapper MicMac', 22 | usage='%(prog)s [options] ', 23 | yaml_file=open(context.settings_path)) 24 | 25 | def config(): 26 | parser.add_argument('--images', '-i', 27 | metavar='', 28 | help='Path to input images'), 29 | 30 | parser.add_argument('--project-path', 31 | metavar='', 32 | help='Path to the project folder') 33 | 34 | parser.add_argument('--gcp', 35 | metavar='', 36 | help='Path to the gcp files') 37 | 38 | parser.add_argument('name', 39 | metavar='', 40 | type=alphanumeric_string, 41 | help='Name of Project (i.e subdirectory of projects folder)') 42 | 43 | parser.add_argument('--max-concurrency', 44 | metavar='', 45 | default=4, 46 | type=int, 47 | help='The maximum number of cores to use in processing. ' 48 | 'Default: 4') 49 | 50 | parser.add_argument('--resize-to', 51 | metavar='', 52 | default=800, 53 | type=int, 54 | help='Scale image width for tie-point extraction. ' 55 | 'Default: 800') 56 | 57 | parser.add_argument('--zoom', 58 | metavar='', 59 | default=4, 60 | type=int, 61 | help='The level of DEM construction. 4 means 4x native GSD. ' 62 | 'Default: 4 Values: 1, 2, 4, 8') 63 | 64 | parser.add_argument('--matcher-distance', 65 | metavar='', 66 | type=int, 67 | help='Distance threshold in meters to find pre-matching ' 68 | 'images based on GPS exif data. Default: 0') 69 | 70 | parser.add_argument('--multi-scale', 71 | action='store_true', 72 | default=False, 73 | help='Uses an image file pair based multi-scale tie-point ' 74 | 'generation routine similar to Photoscan.') 75 | 76 | parser.add_argument('--remove-ortho-tiles', 77 | action='store_true', 78 | default=False, 79 | help='Remove every other ortho tile. Speeds up ortho creation and radiometric equalization.') 80 | 81 | parser.add_argument('--camera-cloud', 82 | action='store_true', 83 | default=False, 84 | help='Creates a sparse point cloud with camera positions') 85 | 86 | parser.add_argument('--image-footprint', 87 | action='store_true', 88 | default=False, 89 | help='Creates a point cloud and geojson with image footprints') 90 | 91 | parser.add_argument('--ccd-width', 92 | metavar='', 93 | type=float, 94 | help='The CCD sensor width in millimeters (mm). Example: 6.17') 95 | 96 | parser.add_argument('--ccd-height', 97 | metavar='', 98 | type=float, 99 | help='The CCD sensor height in millimeters (mm). Example: 4.55') 100 | 101 | parser.add_argument('--version', 102 | action='version', 103 | version='DroneMapper MicMac {0}'.format(__version__), 104 | help='Displays version number and exits. ') 105 | 106 | args = parser.parse_args() 107 | 108 | # check that the project path setting has been set properly 109 | if not args.project_path: 110 | log.MM_ERROR('You need to set the project path in the ' 111 | 'settings.yaml file before you can run MicMac, ' 112 | 'or use `--project-path `. Run `python ' 113 | 'run.py --help` for more information. ') 114 | sys.exit(1) 115 | 116 | return args 117 | -------------------------------------------------------------------------------- /micmac/opendm/context.py: -------------------------------------------------------------------------------- 1 | import os 2 | import multiprocessing 3 | 4 | # Define some needed locations 5 | scripts_path = os.path.abspath(os.path.dirname(__file__)) 6 | root_path, _ = os.path.split(scripts_path) 7 | 8 | settings_path = os.path.join(root_path, 'settings.yaml') 9 | 10 | # Define the number of cores 11 | num_cores = multiprocessing.cpu_count() -------------------------------------------------------------------------------- /micmac/opendm/io.py: -------------------------------------------------------------------------------- 1 | import os 2 | import shutil, errno 3 | 4 | 5 | def get_files_list(path_dir): 6 | return os.listdir(path_dir) 7 | 8 | 9 | def absolute_path_file(path_file): 10 | return os.path.abspath(path_file) 11 | 12 | 13 | def extract_file_from_path_file(path_file): 14 | path, file = os.path.split(path_file) 15 | return file 16 | 17 | 18 | def extract_path_from_file(file): 19 | path_file = os.path.abspath(os.path.dirname(file)) 20 | path, file = os.path.split(path_file) 21 | return path 22 | 23 | 24 | def join_paths(path1, path2): 25 | return os.path.join(path1, path2) 26 | 27 | 28 | def file_exists(path_file): 29 | return os.path.isfile(path_file) 30 | 31 | 32 | def dir_exists(dirname): 33 | return os.path.isdir(dirname) 34 | 35 | 36 | def copy(src, dst): 37 | try: 38 | shutil.copytree(src, dst) 39 | except OSError as e: 40 | if e.errno == errno.ENOTDIR: 41 | shutil.copy(src, dst) 42 | else: raise 43 | 44 | 45 | def rename_file(src, dst): 46 | try: 47 | os.rename(src, dst) 48 | return True 49 | except OSError as e: 50 | if e.errno == errno.ENOENT: 51 | return False 52 | else: 53 | raise 54 | 55 | 56 | # find a file in the root directory 57 | def find(filename, folder): 58 | for root, dirs, files in os.walk(folder): 59 | return '/'.join((root, filename)) if filename in files else None -------------------------------------------------------------------------------- /micmac/opendm/location.py: -------------------------------------------------------------------------------- 1 | import math 2 | from opendm import log 3 | from pyproj import Proj, Transformer, CRS 4 | from osgeo import osr 5 | 6 | def extract_utm_coords(photos, images_path, output_coords_file): 7 | """ 8 | Create a coordinate file containing the GPS positions of all cameras 9 | to be used later in the ODM toolchain for automatic georeferecing 10 | :param photos ([ODM_Photo]) list of photos 11 | :param images_path (str) path to dataset images 12 | :param output_coords_file (str) path to output coordinates file 13 | :return None 14 | """ 15 | if len(photos) == 0: 16 | raise Exception("No input images, cannot create coordinates file of GPS positions") 17 | 18 | utm_zone = None 19 | hemisphere = None 20 | coords = [] 21 | reference_photo = None 22 | for photo in photos: 23 | if photo.latitude is None or photo.longitude is None or photo.altitude is None: 24 | log.MM_ERROR("Failed parsing GPS position for %s, skipping" % photo.filename) 25 | continue 26 | 27 | if utm_zone is None: 28 | utm_zone, hemisphere = get_utm_zone_and_hemisphere_from(photo.longitude, photo.latitude) 29 | 30 | try: 31 | coord = convert_to_utm(photo.longitude, photo.latitude, photo.altitude, utm_zone, hemisphere) 32 | except: 33 | raise Exception("Failed to convert GPS position to UTM for %s" % photo.filename) 34 | 35 | coords.append(coord) 36 | 37 | if utm_zone is None: 38 | raise Exception("No images seem to have GPS information") 39 | 40 | # Calculate average 41 | dx = 0.0 42 | dy = 0.0 43 | num = float(len(coords)) 44 | for coord in coords: 45 | dx += coord[0] / num 46 | dy += coord[1] / num 47 | 48 | dx = int(math.floor(dx)) 49 | dy = int(math.floor(dy)) 50 | 51 | # Open output file 52 | with open(output_coords_file, "w") as f: 53 | f.write("WGS84 UTM %s%s\n" % (utm_zone, hemisphere)) 54 | f.write("%s %s\n" % (dx, dy)) 55 | for coord in coords: 56 | f.write("%s %s %s\n" % (coord[0] - dx, coord[1] - dy, coord[2])) 57 | 58 | def transform2(from_srs, to_srs, x, y): 59 | return transformer(from_srs, to_srs).TransformPoint(x, y, 0)[:2] 60 | 61 | def transform3(from_srs, to_srs, x, y, z): 62 | return transformer(from_srs, to_srs).TransformPoint(x, y, z) 63 | 64 | def proj_srs_convert(srs): 65 | """ 66 | Convert a Proj SRS object to osr SRS object 67 | """ 68 | res = osr.SpatialReference() 69 | epsg = srs.to_epsg() 70 | 71 | if epsg: 72 | res.ImportFromEPSG(epsg) 73 | else: 74 | proj4 = srs.to_proj4() 75 | res.ImportFromProj4(proj4) 76 | 77 | return res 78 | 79 | def transformer(from_srs, to_srs): 80 | src = proj_srs_convert(from_srs) 81 | tgt = proj_srs_convert(to_srs) 82 | return osr.CoordinateTransformation(src, tgt) 83 | 84 | def get_utm_zone_and_hemisphere_from(lon, lat): 85 | """ 86 | Calculate the UTM zone and hemisphere that a longitude/latitude pair falls on 87 | :param lon longitude 88 | :param lat latitude 89 | :return [utm_zone, hemisphere] 90 | """ 91 | utm_zone = (int(math.floor((lon + 180.0)/6.0)) % 60) + 1 92 | hemisphere = 'S' if lat < 0 else 'N' 93 | return [utm_zone, hemisphere] 94 | 95 | def convert_to_utm(lon, lat, alt, utm_zone, hemisphere): 96 | """ 97 | Convert longitude, latitude and elevation values to UTM 98 | :param lon longitude 99 | :param lat latitude 100 | :param alt altitude 101 | :param utm_zone UTM zone number 102 | :param hemisphere one of 'N' or 'S' 103 | :return [x,y,z] UTM coordinates 104 | """ 105 | if hemisphere == 'N': 106 | p = Proj(proj='utm',zone=utm_zone,ellps='WGS84', preserve_units=True) 107 | else: 108 | p = Proj(proj='utm',zone=utm_zone,ellps='WGS84', preserve_units=True, south=True) 109 | 110 | x,y = p(lon, lat) 111 | return [x, y, alt] 112 | 113 | def parse_srs_header(header): 114 | """ 115 | Parse a header coming from GCP or coordinate file 116 | :param header (str) line 117 | :return Proj object 118 | """ 119 | log.MM_INFO(f'Parsing spatial reference system (SRS) header: {header}') 120 | header = header.strip() 121 | ref = header.split(' ') 122 | try: 123 | if ref[0] == 'WGS84' and ref[1] == 'UTM': 124 | datum = ref[0] 125 | utm_pole = (ref[2][len(ref[2]) - 1]).upper() 126 | utm_zone = int(ref[2][:-1]) 127 | 128 | proj_args = { 129 | 'zone': utm_zone, 130 | 'datum': datum 131 | } 132 | 133 | proj4 = '+proj=utm +zone={zone} +datum={datum} +units=m +no_defs=True' 134 | if utm_pole == 'S': 135 | proj4 += ' +south=True' 136 | 137 | srs = CRS.from_proj4(proj4.format(**proj_args)) 138 | elif '+proj' in header: 139 | srs = CRS.from_proj4(header.strip('\'')) 140 | elif header.lower().startswith("epsg:"): 141 | srs = CRS.from_epsg(header.lower()[5:]) 142 | else: 143 | log.MM_ERROR(f'Could not parse coordinates. Bad SRS supplied: {header}') 144 | except RuntimeError as e: 145 | log.MM_ERROR('Uh oh! There seems to be a problem with your coordinates/GCP file.\n\n' 146 | 'The line: %s\n\n' 147 | 'Is not valid. Projections that are valid include:\n' 148 | ' - EPSG:*****\n' 149 | ' - WGS84 UTM **(N|S)\n' 150 | ' - Any valid proj4 string (for example, +proj=utm +zone=32 +north +ellps=WGS84 +datum=WGS84 +units=m +no_defs)\n\n' 151 | 'Modify your input and try again.' % header) 152 | raise RuntimeError(e) 153 | return srs 154 | -------------------------------------------------------------------------------- /micmac/opendm/log.py: -------------------------------------------------------------------------------- 1 | import logging 2 | 3 | HEADER = '\033[95m' 4 | OKBLUE = '\033[94m' 5 | OKGREEN = '\033[92m' 6 | WARNING = '\033[93m' 7 | FAIL = '\033[91m' 8 | ENDC = '\033[0m' 9 | 10 | logging.addLevelName(logging.INFO, '%s[%s]' % (OKBLUE, logging.getLevelName(logging.INFO))) 11 | logging.addLevelName(logging.WARNING, '%s[%s]' % (WARNING, logging.getLevelName(logging.WARNING))) 12 | logging.addLevelName(logging.ERROR, '%s[%s]' % (FAIL, logging.getLevelName(logging.ERROR))) 13 | logging.addLevelName(logging.DEBUG, '%s[%s]' % (OKGREEN, logging.getLevelName(logging.DEBUG))) 14 | 15 | logging.basicConfig(level=logging.DEBUG, format='%(levelname)-14s %(message)s' + ENDC) 16 | 17 | MM_INFO = logging.info 18 | MM_WARNING = logging.warning 19 | MM_ERROR = logging.error 20 | MM_EXCEPTION = logging.exception 21 | MM_DEBUG = logging.debug -------------------------------------------------------------------------------- /micmac/opendm/progress.py: -------------------------------------------------------------------------------- 1 | import socket 2 | import os 3 | from opendm import log 4 | 5 | PROGRESS_BROADCAST_PORT = 6367 #ODMR 6 | try: 7 | sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 8 | except: 9 | log.ODM_WARNING("Cannot create UDP socket, progress reporting will be disabled.") 10 | sock = None 11 | 12 | class Broadcaster: 13 | def __init__(self, port): 14 | self.port = port 15 | self.project_name = "" 16 | self.pid = os.getpid() 17 | 18 | def set_project_name(self, project_name): 19 | self.project_name = project_name 20 | 21 | def send_update(self, global_progress): 22 | """ 23 | Update any listener on the pipeline progress (in percentage terms) 24 | """ 25 | if not sock: 26 | return 27 | 28 | UDP_IP = "127.0.0.1" 29 | 30 | if global_progress > 100: 31 | log.ODM_WARNING("Global progress is > 100 (%s), please contact the developers." % global_progress) 32 | global_progress = 100 33 | 34 | try: 35 | sock.sendto("PGUP/{}/{}/{}".format(self.pid, self.project_name, float(global_progress)).encode('utf-8'), (UDP_IP, self.port)) 36 | except: 37 | log.ODM_WARNING("Failed to broadcast progress update on UDP port %s" % str(self.port)) 38 | 39 | progressbc = Broadcaster(PROGRESS_BROADCAST_PORT) -------------------------------------------------------------------------------- /micmac/opendm/system.py: -------------------------------------------------------------------------------- 1 | import os 2 | import errno 3 | import datetime 4 | import subprocess 5 | 6 | from opendm import log 7 | 8 | 9 | def run(cmd, env_vars={}): 10 | """Run a system command""" 11 | log.MM_DEBUG('running %s' % cmd) 12 | 13 | env = os.environ.copy() 14 | env["PATH"] = env["PATH"] + ":" + "::/code:/code/micmac/bin:/code/micmac/binaire-aux/linux" 15 | 16 | for k in env_vars: 17 | env[k] = str(env_vars[k]) 18 | 19 | retcode = subprocess.call(cmd, shell=True, env=env) 20 | 21 | if retcode < 0: 22 | log.MM_ERROR("Child was terminated by signal {}".format(-retcode)) 23 | elif retcode > 0: 24 | log.MM_ERROR("Child returned {}".format(retcode)) 25 | 26 | 27 | def now(): 28 | """Return the current time""" 29 | return datetime.datetime.now().strftime('%a %b %d %H:%M:%S %Z %Y') 30 | 31 | 32 | def now_raw(): 33 | return datetime.datetime.now() 34 | 35 | 36 | def benchmark(start, benchmarking_file, process): 37 | """ 38 | runs a benchmark with a start datetime object 39 | :return: the running time (delta) 40 | """ 41 | # Write to benchmark file 42 | delta = (datetime.datetime.now() - start).total_seconds() 43 | with open(benchmarking_file, 'a') as b: 44 | b.write('%s runtime: %s seconds\n' % (process, delta)) 45 | 46 | 47 | def mkdir_p(path): 48 | """Make a directory including parent directories. 49 | """ 50 | try: 51 | os.makedirs(path) 52 | except os.error as exc: 53 | if exc.errno != errno.EEXIST or not os.path.isdir(path): 54 | raise 55 | 56 | 57 | def calculate_EPSG(utmZone, south): 58 | """Calculate and return the EPSG""" 59 | if south: 60 | return 32700 + utmZone 61 | else: 62 | return 32600 + utmZone 63 | -------------------------------------------------------------------------------- /micmac/requirements.txt: -------------------------------------------------------------------------------- 1 | Shapely 2 | utm 3 | pyproj==2.2.0 4 | scikit-image 5 | -------------------------------------------------------------------------------- /micmac/run.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | echo "NodeMICMAC" 3 | 4 | RUNPATH="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 5 | $RUNPATH/run.py "$@" 6 | exit 0 -------------------------------------------------------------------------------- /micmac/settings.yaml: -------------------------------------------------------------------------------- 1 | project_path: '/' -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "NodeODM", 3 | "version": "1.6.0", 4 | "description": "REST API to access ODM", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "git+https://github.com/OpenDroneMap/NodeODM.git" 12 | }, 13 | "keywords": [ 14 | "opendronemap" 15 | ], 16 | "author": "Piero Toffanin", 17 | "license": "AGPL-3.0", 18 | "bugs": { 19 | "url": "https://github.com/OpenDroneMap/NodeODM/issues" 20 | }, 21 | "homepage": "https://github.com/OpenDroneMap/NodeODM#readme", 22 | "dependencies": { 23 | "archiver": "^3.0.0", 24 | "async": "^2.6.1", 25 | "aws-sdk": "^2.368.0", 26 | "body-parser": "^1.18.3", 27 | "cors": "^2.8.5", 28 | "express": "^4.16.4", 29 | "glob": "^7.1.3", 30 | "mime": "^2.4.0", 31 | "minimist": "^1.2.0", 32 | "multer": "^1.4.1", 33 | "mv": "^2.1.1", 34 | "node-schedule": "^1.3.1", 35 | "node-unzip-2": "^0.2.7", 36 | "request": "^2.88.0", 37 | "rimraf": "^2.6.2", 38 | "swagger-jsdoc": "^3.2.6", 39 | "systeminformation": "3.42.0", 40 | "tree-kill": "^1.2.1", 41 | "uuid": "^3.3.2", 42 | "winston": "^3.3.3" 43 | }, 44 | "devDependencies": { 45 | "grunt": "^1.0.3", 46 | "grunt-contrib-jshint": "^1.0.0", 47 | "nodemon": "^1.18.4", 48 | "time-grunt": "^1.4.0" 49 | } 50 | } 51 | -------------------------------------------------------------------------------- /processes.json: -------------------------------------------------------------------------------- 1 | [{ 2 | "script" : "index.js", 3 | "name" : "node-OpenDroneMap", 4 | "watch" : false, 5 | "ignore_watch" : ["[\\/\\\\]\\./", "node_modules", "git-hooks", "test", "tmp", "data", "^.*\.log$"] 6 | }] 7 | -------------------------------------------------------------------------------- /public/css/fileinput.min.css: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.3.3 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Author: Kartik Visweswaran 6 | * Copyright: 2014 - 2016, Kartik Visweswaran, Krajee.com 7 | * 8 | * Licensed under the BSD 3-Clause 9 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 10 | */.file-loading{top:0;right:0;width:25px;height:25px;font-size:999px;text-align:right;color:#fff;background:url(../img/loading.gif) top left no-repeat;border:none}.file-object{margin:0 0 -5px;padding:0}.btn-file{position:relative;overflow:hidden}.btn-file input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;text-align:right;opacity:0;background:none;cursor:inherit;display:block}.file-caption-name{display:inline-block;overflow:hidden;height:20px;word-break:break-all}.input-group-lg .file-caption-name{height:25px}.file-zoom-dialog{text-align:left}.file-error-message{color:#a94442;background-color:#f2dede;margin:5px;border:1px solid #ebccd1;border-radius:4px;padding:15px}.file-error-message pre,.file-error-message ul{margin:0;text-align:left}.file-preview-frame,.file-preview-other{text-align:center;vertical-align:middle}.file-error-message pre{margin:5px 0}.file-caption-disabled{background-color:#EEE;cursor:not-allowed;opacity:1}.file-preview{border-radius:5px;border:1px solid #ddd;padding:5px;width:100%;margin-bottom:5px}.file-preview-frame{position:relative;display:table;margin:8px;height:160px;border:1px solid #ddd;box-shadow:1px 1px 5px 0 #a2958a;padding:6px;float:left}.file-preview-frame:not(.file-preview-error):hover{box-shadow:3px 3px 5px 0 #333}.file-preview-image{vertical-align:middle}.file-preview-text{display:block;color:#428bca;border:1px solid #ddd;font-family:Menlo,Monaco,Consolas,"Courier New",monospace;outline:0;padding:8px;resize:none}.file-input-ajax-new .fileinput-remove-button,.file-input-ajax-new .fileinput-upload-button,.file-input-ajax-new .no-browse .input-group-btn,.file-input-new .close,.file-input-new .file-preview,.file-input-new .fileinput-remove-button,.file-input-new .fileinput-upload-button,.file-input-new .glyphicon-file,.file-input-new .no-browse .input-group-btn{display:none}.file-preview-html{border:1px solid #ddd;padding:8px;overflow:auto}.file-zoom-dialog .file-preview-text{font-size:1.2em}.file-preview-other{left:0;top:0;right:0;bottom:0;margin:auto;padding:10px}.file-preview-other:hover{opacity:.8}.file-actions,.file-other-error{text-align:left}.file-other-icon{font-size:4.8em}.file-zoom-dialog .file-other-icon{font-size:8em;font-size:55vmin}.file-caption-main{width:100%}.file-input-ajax-new .no-browse .form-control,.file-input-new .no-browse .form-control{border-top-right-radius:4px;border-bottom-right-radius:4px}.file-thumb-loading{background:url(../img/loading.gif) center center no-repeat content-box!important}.file-actions{margin-top:15px}.file-footer-buttons{float:right}.file-upload-indicator{display:inline;cursor:default;opacity:.8;width:60%}.file-upload-indicator:hover{font-weight:700;opacity:1}.file-footer-caption{display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;width:160px;text-align:center;padding-top:4px;font-size:11px;color:#777;margin:5px auto}.file-preview-error{opacity:.65;box-shadow:none}.file-preview-frame:not(.file-preview-error) .file-footer-caption:hover{color:#000}.file-drop-zone{border:1px dashed #aaa;border-radius:4px;height:100%;text-align:center;vertical-align:middle;margin:12px 15px 12px 12px;padding:5px}.file-drop-zone-title{color:#aaa;font-size:1.6em;padding:85px 10px;cursor:default}.clickable .file-drop-zone-title,.file-preview .clickable{cursor:pointer}.file-drop-zone.clickable:hover{border:2px dashed #999}.file-drop-zone.clickable:focus{border:2px solid #5acde2}.file-drop-zone .file-preview-thumbnails{cursor:default}.file-highlighted{border:2px dashed #999!important;background-color:#f0f0f0}.file-uploading{background:url(../img/loading-sm.gif) center bottom 10px no-repeat;opacity:.65}.file-thumb-progress .progress,.file-thumb-progress .progress-bar{height:10px;font-size:9px;line-height:10px}.file-thumbnail-footer{position:relative}.file-thumb-progress{height:10px;position:absolute;top:35px;left:0;right:0}.file-zoom-fullscreen.modal{position:fixed;top:0;right:0;bottom:0;left:0}.file-zoom-fullscreen .modal-dialog{position:fixed;margin:0;width:100%;height:100%;padding:0}.file-zoom-fullscreen .modal-content{border-radius:0;box-shadow:none}.file-zoom-fullscreen .modal-body{overflow-y:auto}.file-zoom-dialog .modal-body{position:relative!important}.file-zoom-dialog .btn-navigate{position:absolute;padding:0;margin:0;background:0 0;text-decoration:none;outline:0;opacity:.7;top:45%;font-size:4em;color:#1c94c4}.file-zoom-dialog .floating-buttons{position:absolute;top:5px;right:10px}.floating-buttons,.floating-buttons .btn{z-index:3000}.file-zoom-dialog .kv-zoom-actions .btn,.floating-buttons .btn{margin-left:3px}.file-zoom-dialog .btn-navigate:not([disabled]):focus,.file-zoom-dialog .btn-navigate:not([disabled]):hover{outline:0;box-shadow:none;opacity:.5}.file-zoom-dialog .btn-navigate[disabled]{opacity:.3}.file-zoom-dialog .btn-prev{left:1px}.file-zoom-dialog .btn-next{right:1px}.file-drag-handle{display:inline;margin-right:2px;font-size:16px;cursor:move;cursor:-webkit-grabbing}.file-drag-handle:hover{opacity:.7}.file-zoom-content{height:480px;text-align:center}.file-preview-initial.sortable-chosen{background-color:#d9edf7}.file-preview-frame.sortable-ghost{background-color:#eee}.btn-file ::-ms-browse{width:100%;height:100%} -------------------------------------------------------------------------------- /public/css/main.css: -------------------------------------------------------------------------------- 1 | .row:first-child{ 2 | margin-top: 30px; 3 | } 4 | 5 | .task{ 6 | border: 1px solid #ecf0f1; 7 | padding: 8px; 8 | position: relative; 9 | margin-bottom: 16px; 10 | } 11 | 12 | .task .statusIcon{ 13 | position: absolute; 14 | right: 8px; 15 | top: 8px; 16 | } 17 | 18 | .spinning{ 19 | animation: spin 3s infinite linear; 20 | } 21 | 22 | @keyframes spin { 23 | from {transform:rotate(0deg);} 24 | to {transform:rotate(360deg);} 25 | } 26 | 27 | .pulsePositive { 28 | animation: pulsatePositive 2s ease-out; 29 | animation-iteration-count: 1; 30 | background-color: #fff; 31 | } 32 | @keyframes pulsatePositive { 33 | 0% {background-color: #fff;} 34 | 50% {background-color: lightgreen;} 35 | 100% {background-color: #fff;} 36 | } 37 | 38 | .pulseNegative { 39 | animation: pulsateNegative 2s ease-out; 40 | animation-iteration-count: 1; 41 | background-color: #fff; 42 | } 43 | @keyframes pulsateNegative { 44 | 0% {background-color: #fff;} 45 | 50% {background-color: pink;} 46 | 100% {background-color: #fff;} 47 | } 48 | 49 | .task .actionButtons{ 50 | text-align: right; 51 | } 52 | 53 | .task .consoleOutput{ 54 | width: 100%; 55 | height: 200px; 56 | font-family: monospace; 57 | font-size: 90%; 58 | } 59 | 60 | .selectric-items li{ 61 | background: #fff; 62 | } 63 | 64 | #options .checkbox{ 65 | margin-right: 143px; 66 | } -------------------------------------------------------------------------------- /public/examples/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | Krajee JQuery Plugins - © Kartik 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 20 |
21 | 22 |
23 | 24 | 25 |
26 |
27 |
28 | 29 | 30 | 33 |
34 |
35 |
36 | 37 |
38 |
39 | 40 |
41 |
42 |
43 | 44 |
45 |
46 |
47 | 48 |
49 |
50 |
51 | 52 | 53 |
54 |
55 |
56 | 57 |
58 |
59 |
60 | 61 | 62 | 63 | 64 |
65 |
66 |
67 | 68 |
69 |
70 |
71 |
72 | 73 |
74 |
75 | 76 | 77 |
78 |

Multi Language Inputs

79 |
80 | 81 | 82 |
83 | 84 | 85 |
86 |
87 |
88 |
89 | 90 | 161 | -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/public/fonts/glyphicons-halflings-regular.eot -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/public/fonts/glyphicons-halflings-regular.ttf -------------------------------------------------------------------------------- /public/fonts/glyphicons-halflings-regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/public/fonts/glyphicons-halflings-regular.woff -------------------------------------------------------------------------------- /public/img/loading-sm.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/public/img/loading-sm.gif -------------------------------------------------------------------------------- /public/img/loading.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/public/img/loading.gif -------------------------------------------------------------------------------- /public/js/locales/LANG.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput <_LANG_> Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['_LANG_'] = { 15 | fileSingle: 'file', 16 | filePlural: 'files', 17 | browseLabel: 'Add …', 18 | removeLabel: 'Clear All', 19 | removeTitle: 'Clear selected files', 20 | cancelLabel: 'Cancel', 21 | cancelTitle: 'Abort ongoing upload', 22 | uploadLabel: 'Upload', 23 | uploadTitle: 'Upload selected files', 24 | msgNo: 'No', 25 | msgCancelled: 'Cancelled', 26 | msgZoomModalHeading: 'Detailed Preview', 27 | msgSizeTooLarge: 'File "{name}" ({size} KB) exceeds maximum allowed upload size of {maxSize} KB.', 28 | msgFilesTooLess: 'You must select at least {n} {files} to upload.', 29 | msgFilesTooMany: 'Number of files selected for upload ({n}) exceeds maximum allowed limit of {m}.', 30 | msgFileNotFound: 'File "{name}" not found!', 31 | msgFileSecured: 'Security restrictions prevent reading the file "{name}".', 32 | msgFileNotReadable: 'File "{name}" is not readable.', 33 | msgFilePreviewAborted: 'File preview aborted for "{name}".', 34 | msgFilePreviewError: 'An error occurred while reading the file "{name}".', 35 | msgInvalidFileType: 'Invalid type for file "{name}". Only "{types}" files are supported.', 36 | msgInvalidFileExtension: 'Invalid extension for file "{name}". Only "{extensions}" files are supported.', 37 | msgUploadAborted: 'The file upload was aborted', 38 | msgValidationError: 'Validation Error', 39 | msgLoading: 'Loading file {index} of {files} …', 40 | msgProgress: 'Loading file {index} of {files} - {name} - {percent}% completed.', 41 | msgSelected: '{n} {files} selected', 42 | msgFoldersNotAllowed: 'Drag & drop files only! Skipped {n} dropped folder(s).', 43 | msgImageWidthSmall: 'Width of image file "{name}" must be at least {size} px.', 44 | msgImageHeightSmall: 'Height of image file "{name}" must be at least {size} px.', 45 | msgImageWidthLarge: 'Width of image file "{name}" cannot exceed {size} px.', 46 | msgImageHeightLarge: 'Height of image file "{name}" cannot exceed {size} px.', 47 | msgImageResizeError: 'Could not get the image dimensions to resize.', 48 | msgImageResizeException: 'Error while resizing the image.
{errors}
', 49 | dropZoneTitle: 'Drag & drop files here …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Remove file', 53 | uploadTitle: 'Upload file', 54 | zoomTitle: 'View details', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Not uploaded yet', 57 | indicatorSuccessTitle: 'Uploaded', 58 | indicatorErrorTitle: 'Upload Error', 59 | indicatorLoadingTitle: 'Uploading ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/ar.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Arabic Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Yasser Lotfy 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['ar'] = { 16 | fileSingle: 'ملف', 17 | filePlural: 'ملفات', 18 | browseLabel: 'تصفح …', 19 | removeLabel: 'إزالة', 20 | removeTitle: 'إزالة الملفات المختارة', 21 | cancelLabel: 'إلغاء', 22 | cancelTitle: 'إنهاء الرفع الحالي', 23 | uploadLabel: 'رفع', 24 | uploadTitle: 'رفع الملفات المختارة', 25 | msgNo: 'لا', 26 | msgCancelled: 'ألغيت', 27 | msgZoomModalHeading: 'معاينة تفصيلية', 28 | msgSizeTooLarge: 'الملف "{name}" ({size} ك.ب) تعدى الحد الأقصى المسموح للرفع {maxSize} ك.ب.', 29 | msgFilesTooLess: 'يجب عليك اختيار {n} {files} على الأقل للرفع.', 30 | msgFilesTooMany: 'عدد الملفات المختارة للرفع ({n}) تعدت الحد الأقصى المسموح به لعدد {m}.', 31 | msgFileNotFound: 'الملف "{name}" غير موجود!', 32 | msgFileSecured: 'قيود أمنية تمنع قراءة الملف "{name}".', 33 | msgFileNotReadable: 'الملف "{name}" غير قابل للقراءة.', 34 | msgFilePreviewAborted: 'تم إلغاء معاينة الملف "{name}".', 35 | msgFilePreviewError: 'حدث خطأ أثناء قراءة الملف "{name}".', 36 | msgInvalidFileType: 'نوعية غير صالحة للملف "{name}". فقط هذه النوعيات مدعومة "{types}".', 37 | msgInvalidFileExtension: 'امتداد غير صالح للملف "{name}". فقط هذه الملفات مدعومة "{extensions}".', 38 | msgUploadAborted: 'تم إلغاء رفع الملف', 39 | msgValidationError: 'خطأ التحقق من صحة', 40 | msgLoading: 'تحميل ملف {index} من {files} …', 41 | msgProgress: 'تحميل ملف {index} من {files} - {name} - {percent}% منتهي.', 42 | msgSelected: '{n} {files} مختار(ة)', 43 | msgFoldersNotAllowed: 'اسحب وأفلت الملفات فقط! تم تخطي {n} مجلد(ات).', 44 | msgImageWidthSmall: 'عرض ملف الصورة "{name}" يجب أن يكون على الأقل {size} px.', 45 | msgImageHeightSmall: 'طول ملف الصورة "{name}" يجب أن يكون على الأقل {size} px.', 46 | msgImageWidthLarge: 'عرض ملف الصورة "{name}" لا يمكن أن يتعدى {size} px.', 47 | msgImageHeightLarge: 'طول ملف الصورة "{name}" لا يمكن أن يتعدى {size} px.', 48 | msgImageResizeError: 'لم يتمكن من معرفة أبعاد الصورة لتغييرها.', 49 | msgImageResizeException: 'حدث خطأ أثناء تغيير أبعاد الصورة.
{errors}
', 50 | dropZoneTitle: 'اسحب وأفلت الملفات هنا …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'إزالة الملف', 54 | uploadTitle: 'رفع الملف', 55 | zoomTitle: 'مشاهدة التفاصيل', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'لم يتم الرفع بعد', 58 | indicatorSuccessTitle: 'تم الرفع', 59 | indicatorErrorTitle: 'خطأ بالرفع', 60 | indicatorLoadingTitle: 'جارٍ الرفع ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/bg.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Bulgarian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['bg'] = { 15 | fileSingle: 'файл', 16 | filePlural: 'файла', 17 | browseLabel: 'Избери …', 18 | removeLabel: 'Премахни', 19 | removeTitle: 'Изчисти избраните', 20 | cancelLabel: 'Откажи', 21 | cancelTitle: 'Откажи качването', 22 | uploadLabel: 'Качи', 23 | uploadTitle: 'Качи избраните файлове', 24 | msgNo: 'Не', 25 | msgCancelled: 'Отменен', 26 | msgZoomModalHeading: 'Детайлен преглед', 27 | msgSizeTooLarge: 'Файла "{name}" ({size} KB) надвишава максималните разрешени {maxSize} KB.', 28 | msgFilesTooLess: 'Трябва да изберете поне {n} {files} файла.', 29 | msgFilesTooMany: 'Броя файлове избрани за качване ({n}) надвишава ограниченито от максимум {m}.', 30 | msgFileNotFound: 'Файлът "{name}" не може да бъде намерен!', 31 | msgFileSecured: 'От съображения за сигурност не може да прочетем файла "{name}".', 32 | msgFileNotReadable: 'Файлът "{name}" не е четим.', 33 | msgFilePreviewAborted: 'Прегледа на файла е прекратен за "{name}".', 34 | msgFilePreviewError: 'Грешка при опит за четене на файла "{name}".', 35 | msgInvalidFileType: 'Невалиден тип на файла "{name}". Разрешени са само "{types}".', 36 | msgInvalidFileExtension: 'Невалидно разрешение на "{name}". Разрешени са само "{extensions}".', 37 | msgUploadAborted: 'Качите файла, бе прекратена', 38 | msgValidationError: 'утвърждаване грешка', 39 | msgLoading: 'Зареждане на файл {index} от общо {files} …', 40 | msgProgress: 'Зареждане на файл {index} от общо {files} - {name} - {percent}% завършени.', 41 | msgSelected: '{n} {files} избрани', 42 | msgFoldersNotAllowed: 'Само пуснати файлове! Пропуснати {n} пуснати папки.', 43 | msgImageWidthSmall: 'Широчината на изображението "{name}" трябва да е поне {size} px.', 44 | msgImageHeightSmall: 'Височината на изображението "{name}" трябва да е поне {size} px.', 45 | msgImageWidthLarge: 'Широчината на изображението "{name}" не може да е по-голяма от {size} px.', 46 | msgImageHeightLarge: 'Височината на изображението "{name}" нее може да е по-голяма от {size} px.', 47 | msgImageResizeError: 'Не може да размерите на изображението, за да промените размера.', 48 | msgImageResizeException: 'Грешка при промяна на размера на изображението.
{errors}
', 49 | dropZoneTitle: 'Пуснете файловете тук …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Махни файл', 53 | uploadTitle: 'Качване на файл', 54 | zoomTitle: 'Вижте детайли', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Все още не е качил', 57 | indicatorSuccessTitle: 'Качено', 58 | indicatorErrorTitle: 'Качи Error', 59 | indicatorLoadingTitle: 'Качва се ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/ca.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Català Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['ca'] = { 15 | fileSingle: 'arxiu', 16 | filePlural: 'arxius', 17 | browseLabel: 'Examinar …', 18 | removeLabel: 'Treure', 19 | removeTitle: 'Treure arxius seleccionats', 20 | cancelLabel: 'Cancel', 21 | cancelTitle: 'Avortar la pujada en curs', 22 | uploadLabel: 'Pujar arxiu', 23 | uploadTitle: 'Pujar arxius seleccionats', 24 | msgNo: 'No', 25 | msgCancelled: 'cancel·lat', 26 | msgZoomModalHeading: 'Vista prèvia detallada', 27 | msgSizeTooLarge: 'Arxiu "{name}" ({size} KB) excedeix la mida màxima permès de {maxSize} KB.', 28 | msgFilesTooLess: 'Heu de seleccionar almenys {n} {files} a carregar.', 29 | msgFilesTooMany: 'El nombre d\'arxius seleccionats a carregar ({n}) excedeix el límit màxim permès de {m}.', 30 | msgFileNotFound: 'Arxiu "{name}" no trobat.', 31 | msgFileSecured: 'No es pot accedir a l\'arxiu "{name}" perquè estarà sent usat per una altra aplicació o no tinguem permisos de lectura.', 32 | msgFileNotReadable: 'No es pot accedir a l\'arxiu "{name}".', 33 | msgFilePreviewAborted: 'Previsualització de l\'arxiu "{name}" cancel·lada.', 34 | msgFilePreviewError: 'S\'ha produït un error mentre es llegia el fitxer "{name}".', 35 | msgInvalidFileType: 'Tipus de fitxer no vàlid per a "{name}". Només arxius "{types}" són permesos.', 36 | msgInvalidFileExtension: 'Extensió de fitxer no vàlid per a "{name}". Només arxius "{extensions}" són permesos.', 37 | msgUploadAborted: 'La càrrega d\'arxius s\'ha cancel·lat', 38 | msgValidationError: 'Error de validació', 39 | msgLoading: 'Pujant fitxer {index} de {files} …', 40 | msgProgress: 'Pujant fitxer {index} de {files} - {name} - {percent}% completat.', 41 | msgSelected: '{n} {files} seleccionat(s)', 42 | msgFoldersNotAllowed: 'Arrossegueu i deixeu anar únicament arxius. Omesa(es) {n} carpeta(es).', 43 | msgImageWidthSmall: 'L\'ample de la imatge "{name}" ha de ser almenys {size} px.', 44 | msgImageHeightSmall: 'L\'alçada de la imatge "{name}" ha de ser almenys {size} px.', 45 | msgImageWidthLarge: 'L\'ample de la imatge "{name}" no pot excedir de {size} px.', 46 | msgImageHeightLarge: 'L\'alçada de la imatge "{name}" no pot excedir de {size} px.', 47 | msgImageResizeError: 'No s\'ha pogut obtenir les dimensions d\'imatge per canviar la mida.', 48 | msgImageResizeException: 'Error en canviar la mida de la imatge.
{errors}
', 49 | dropZoneTitle: 'Arrossegueu i deixeu anar aquí els arxius …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Eliminar arxiu', 53 | uploadTitle: 'Pujar arxiu', 54 | zoomTitle: 'Veure detalls', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'No pujat encara', 57 | indicatorSuccessTitle: 'Subido', 58 | indicatorErrorTitle: 'Pujar Error', 59 | indicatorLoadingTitle: 'Pujant ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/cr.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Croatian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Milos Stojanovic 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['cr'] = { 16 | fileSingle: 'datoteka', 17 | filePlural: 'datoteke', 18 | browseLabel: 'Izaberi …', 19 | removeLabel: 'Ukloni', 20 | removeTitle: 'Ukloni označene datoteke', 21 | cancelLabel: 'Odustani', 22 | cancelTitle: 'Prekini trenutno otpremanje', 23 | uploadLabel: 'Otpremi', 24 | uploadTitle: 'Otpremi označene datoteke', 25 | msgNo: 'Ne', 26 | msgCancelled: 'Otkazan', 27 | msgZoomModalHeading: 'Detaljni pregled', 28 | msgSizeTooLarge: 'Datoteka "{name}" ({size} KB) prekoračuje maksimalnu dozvoljenu veličinu datoteke od {maxSize} KB.', 29 | msgFilesTooLess: 'Morate odabrati najmanje {n} {files} za otpremanje.', 30 | msgFilesTooMany: 'Broj datoteka označenih za otpremanje ({n}) prekoračuje maksimalni dozvoljeni limit od {m}.', 31 | msgFileNotFound: 'Datoteka "{name}" nije pronađena!', 32 | msgFileSecured: 'Datoteku "{name}" nije moguće pročitati zbog bezbednosnih ograničenja.', 33 | msgFileNotReadable: 'Datoteku "{name}" nije moguće pročitati.', 34 | msgFilePreviewAborted: 'Generisanje prikaza nije moguće za "{name}".', 35 | msgFilePreviewError: 'Došlo je do greške prilikom čitanja datoteke "{name}".', 36 | msgInvalidFileType: 'Datoteka "{name}" je pogrešnog formata. Dozvoljeni formati su "{types}".', 37 | msgInvalidFileExtension: 'Ekstenzija datoteke "{name}" nije dozvoljena. Dozvoljene ekstenzije su "{extensions}".', 38 | msgUploadAborted: 'Prijenos datoteka je prekinut', 39 | msgValidationError: 'Provjera pogrešaka', 40 | msgLoading: 'Učitavanje datoteke {index} od {files} …', 41 | msgProgress: 'Učitavanje datoteke {index} od {files} - {name} - {percent}% završeno.', 42 | msgSelected: '{n} {files} je označeno', 43 | msgFoldersNotAllowed: 'Moguće je prevlačiti samo datoteke! Preskočeno je {n} fascikla.', 44 | msgImageWidthSmall: 'Širina slikovnu datoteku "{name}" moraju biti najmanje {size} px.', 45 | msgImageHeightSmall: 'Visina slikovnu datoteku "{name}" moraju biti najmanje {size} px.', 46 | msgImageWidthLarge: 'Širina slikovnu datoteku "{name}" ne može prelaziti {size} px.', 47 | msgImageHeightLarge: 'Visina slikovnu datoteku "{name}" ne može prelaziti {size} px.', 48 | msgImageResizeError: 'Nije mogao dobiti dimenzije slike na veličinu.', 49 | msgImageResizeException: 'Greška prilikom promjene veličine slike.
{errors}
', 50 | dropZoneTitle: 'Prevucite datoteke ovde …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'Uklonite datoteku', 54 | uploadTitle: 'Postavi datoteku', 55 | zoomTitle: 'Pregledavati pojedinosti', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'Još nije učitao', 58 | indicatorSuccessTitle: 'Preneseno', 59 | indicatorErrorTitle: 'Postavi Greška', 60 | indicatorLoadingTitle: 'Prijenos ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/cz.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Czech Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['cz'] = { 15 | fileSingle: 'soubor', 16 | filePlural: 'soubory', 17 | browseLabel: 'Vybrat …', 18 | removeLabel: 'Odstranit', 19 | removeTitle: 'Vyčistit vybrané soubory', 20 | cancelLabel: 'Storno', 21 | cancelTitle: 'Přerušit nahrávání', 22 | uploadLabel: 'Nahrát', 23 | uploadTitle: 'Nahrát vybrané soubory', 24 | msgNo: 'Ne', 25 | msgCancelled: 'Zrušeno', 26 | msgZoomModalHeading: 'Detailní náhled', 27 | msgSizeTooLarge: 'Soubor "{name}" ({size} KB): překročení - maximální povolená velikost {maxSize} KB.', 28 | msgFilesTooLess: 'Musíte vybrat nejméně {n} {files} pro nahrání.', 29 | msgFilesTooMany: 'Počet vybraných souborů pro nahrání ({n}): překročení - maximální povolený limit {m}.', 30 | msgFileNotFound: 'Soubor "{name}" nebyl nalezen!', 31 | msgFileSecured: 'Zabezpečení souboru znemožnilo číst soubor "{name}".', 32 | msgFileNotReadable: 'Soubor "{name}" není čitelný.', 33 | msgFilePreviewAborted: 'Náhled souboru byl přerušen pro "{name}".', 34 | msgFilePreviewError: 'Nastala chyba při načtení souboru "{name}".', 35 | msgInvalidFileType: 'Neplatný typ souboru "{name}". Pouze "{types}" souborů jsou podporovány.', 36 | msgInvalidFileExtension: 'Neplatná extenze souboru "{name}". Pouze "{extensions}" souborů jsou podporovány.', 37 | msgUploadAborted: 'Soubor nahrávání byl přerušen', 38 | msgValidationError: 'Chyba ověření', 39 | msgLoading: 'Nahrávání souboru {index} z {files} …', 40 | msgProgress: 'Nahrávání souboru {index} z {files} - {name} - {percent}% dokončeno.', 41 | msgSelected: '{n} {files} vybrano', 42 | msgFoldersNotAllowed: 'Táhni a pusť pouze soubory! Vynechané {n} pustěné složk(y).', 43 | msgImageWidthSmall: 'Šířka image soubor "{name}", musí být alespoň {size} px.', 44 | msgImageHeightSmall: 'Výška image soubor "{name}", musí být alespoň {size} px.', 45 | msgImageWidthLarge: 'Šířka obrazového souboru "{name}" nelze překročit {size} px.', 46 | msgImageHeightLarge: 'Výška obrazového souboru "{name}" nelze překročit {size} px.', 47 | msgImageResizeError: 'Nelze získat rozměry obrázku změnit velikost.', 48 | msgImageResizeException: 'Chyba při změně velikosti obrázku.
{errors}
', 49 | dropZoneTitle: 'Táhni a pusť soubory sem …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Odstranit soubor', 53 | uploadTitle: 'nahrát soubor', 54 | zoomTitle: 'zobrazit podrobnosti', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Ještě nenahrál', 57 | indicatorSuccessTitle: 'Nahraný', 58 | indicatorErrorTitle: 'Nahrát Chyba', 59 | indicatorLoadingTitle: 'Nahrávání ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/da.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Danish Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['da'] = { 15 | fileSingle: 'fil', 16 | filePlural: 'filer', 17 | browseLabel: 'Browse …', 18 | removeLabel: 'Fjern', 19 | removeTitle: 'Fjern valgte filer', 20 | cancelLabel: 'Fortryd', 21 | cancelTitle: 'Afbryd nuværende upload', 22 | uploadLabel: 'Upload', 23 | uploadTitle: 'Upload valgte filer', 24 | msgNo: 'Ingen', 25 | msgCancelled: 'aflyst', 26 | msgZoomModalHeading: 'Detaljeret visning', 27 | msgSizeTooLarge: 'Fil "{name}" ({size} KB) er større end de tilladte {maxSize} KB.', 28 | msgFilesTooLess: 'Du skal mindst vælge {n} {files} til upload.', 29 | msgFilesTooMany: '({n}) filer valgt til upload, men maks. {m} er tilladt.', 30 | msgFileNotFound: 'Filen "{name}" blev ikke fundet!', 31 | msgFileSecured: 'Sikkerhedsrestriktioner forhindrer læsning af "{name}".', 32 | msgFileNotReadable: 'Filen "{name}" kan ikke indlæses.', 33 | msgFilePreviewAborted: 'Filpreview annulleret for "{name}".', 34 | msgFilePreviewError: 'Der skete en fejl under læsningen af filen "{name}".', 35 | msgInvalidFileType: 'Ukendt type for filen "{name}". Kun "{types}" kan bruges.', 36 | msgInvalidFileExtension: 'Ukendt filtype for filen "{name}". Kun "{extensions}" filer kan bruges.', 37 | msgUploadAborted: 'Filupload annulleret', 38 | msgValidationError: 'Validering Fejl', 39 | msgLoading: 'Henter fil {index} af {files} …', 40 | msgProgress: 'Henter fil {index} af {files} - {name} - {percent}% færdiggjort.', 41 | msgSelected: '{n} {files} valgt', 42 | msgFoldersNotAllowed: 'Drag & drop kun filer! {n} mappe(r) sprunget over.', 43 | msgImageWidthSmall: 'Bredden af billedet "{name}" skal være på mindst {size} px.', 44 | msgImageHeightSmall: 'Højden af billedet "{name}" skal være på mindst {size} px.', 45 | msgImageWidthLarge: 'Bredden af billedet "{name}" må ikke være over {size} px.', 46 | msgImageHeightLarge: 'Højden af billedet "{name}" må ikke være over {size} px.', 47 | msgImageResizeError: 'Kunne ikke få billedets dimensioner for at ændre størrelsen.', 48 | msgImageResizeException: 'Fejl ved at ændre størrelsen på billedet.
{errors}
', 49 | dropZoneTitle: 'Drag & drop filer her …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Fjern fil', 53 | uploadTitle: 'Upload fil', 54 | zoomTitle: 'Se detaljer', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Ikke uploadet endnu', 57 | indicatorSuccessTitle: 'Uploadet', 58 | indicatorErrorTitle: 'Upload fejl', 59 | indicatorLoadingTitle: 'Uploader ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/de.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput German Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | */ 9 | (function ($) { 10 | "use strict"; 11 | 12 | $.fn.fileinputLocales['de'] = { 13 | fileSingle: 'Datei', 14 | filePlural: 'Dateien', 15 | browseLabel: 'Auswählen …', 16 | removeLabel: 'Löschen', 17 | removeTitle: 'Ausgewählte löschen', 18 | cancelLabel: 'Laden', 19 | cancelTitle: 'Hochladen abbrechen', 20 | uploadLabel: 'Hochladen', 21 | uploadTitle: 'Hochladen der ausgewählten Dateien', 22 | msgNo: 'Keine', 23 | msgCancelled: 'Abgebrochen', 24 | msgZoomModalHeading: 'ausführliche Vorschau', 25 | msgSizeTooLarge: 'Datei "{name}" ({size} KB) überschreitet maximal zulässige Upload-Größe von {maxSize} KB.', 26 | msgFilesTooLess: 'Sie müssen mindestens {n} {files} zum Hochladen auswählen.', 27 | msgFilesTooMany: 'Anzahl der Dateien für den Upload ausgewählt ({n}) überschreitet maximal zulässige Grenze von {m} Stück.', 28 | msgFileNotFound: 'Datei "{name}" wurde nicht gefunden!', 29 | msgFileSecured: 'Sicherheitseinstellungen verhindern das Lesen der Datei "{name}".', 30 | msgFileNotReadable: 'Die Datei "{name}" ist nicht lesbar.', 31 | msgFilePreviewAborted: 'Dateivorschau abgebrochen für "{name}".', 32 | msgFilePreviewError: 'Beim Lesen der Datei "{name}" ein Fehler aufgetreten.', 33 | msgInvalidFileType: 'Ungültiger Typ für Datei "{name}". Nur Dateien der Typen "{types}" werden unterstützt.', 34 | msgInvalidFileExtension: 'Ungültige Erweiterung für Datei "{name}". Nur Dateien mit der Endung "{extensions}" werden unterstützt.', 35 | msgUploadAborted: 'Der Datei-Upload wurde abgebrochen', 36 | msgValidationError: 'Validierungs fehler', 37 | msgLoading: 'Lade Datei {index} von {files} hoch…', 38 | msgProgress: 'Datei {index} von {files} - {name} - zu {percent}% fertiggestellt.', 39 | msgSelected: '{n} {files} ausgewählt', 40 | msgFoldersNotAllowed: 'Drag & Drop funktioniert nur bei Dateien! {n} Ordner übersprungen.', 41 | msgImageWidthSmall: 'Breite der Bilddatei "{name}" muss mindestens {size} px betragen.', 42 | msgImageHeightSmall: 'Höhe der Bilddatei "{name}" muss mindestens {size} px betragen.', 43 | msgImageWidthLarge: 'Breite der Bilddatei "{name}" nicht überschreiten {size} px.', 44 | msgImageHeightLarge: 'Höhe der Bilddatei "{name}" nicht überschreiten {size} px.', 45 | msgImageResizeError: 'Konnte nicht die Bildabmessungen zu ändern.', 46 | msgImageResizeException: 'Fehler beim Ändern der Größe des Bildes.
{errors}
', 47 | dropZoneTitle: 'Dateien hierher ziehen …', 48 | dropZoneClickTitle: '
(or click to select {files})', 49 | fileActionSettings: { 50 | removeTitle: 'Datei entfernen', 51 | uploadTitle: 'Datei hochladen', 52 | zoomTitle: 'Details anzeigen', 53 | dragTitle: 'Move / Rearrange', 54 | indicatorNewTitle: 'Noch nicht hochgeladen', 55 | indicatorSuccessTitle: 'Hochgeladen', 56 | indicatorErrorTitle: 'Upload Fehler', 57 | indicatorLoadingTitle: 'Hochladen ...' 58 | }, 59 | previewZoomButtonTitles: { 60 | prev: 'View previous file', 61 | next: 'View next file', 62 | toggleheader: 'Toggle header', 63 | fullscreen: 'Toggle full screen', 64 | borderless: 'Toggle borderless mode', 65 | close: 'Close detailed preview' 66 | } 67 | }; 68 | })(window.jQuery); 69 | -------------------------------------------------------------------------------- /public/js/locales/el.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Greek Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['el'] = { 15 | fileSingle: 'Αρχείο', 16 | filePlural: 'Αρχεία', 17 | browseLabel: 'Αναζήτηση …', 18 | removeLabel: 'Ακύρωση', 19 | removeTitle: 'Εκκαθάριση αρχείων', 20 | cancelLabel: 'Ακύρωση', 21 | cancelTitle: 'Ακύρωση μεταφόρτωσης', 22 | uploadLabel: 'Μεταφόρτωση', 23 | uploadTitle: 'Μεταφόρτωση επιλεγμένων αρχείων', 24 | msgNo: 'Όχι', 25 | msgCancelled: 'Ακυρώθηκε', 26 | msgZoomModalHeading: 'λεπτομερής Προεπισκόπηση', 27 | msgSizeTooLarge: 'Το αρχείο "{name}" ({size} KB) υπερβαίνει το μέγιστο επιτρεπόμενο μέγεθος μεταφόρτωσης {maxSize} KB.', 28 | msgFilesTooLess: 'Πρέπει να επιλέξετε τουλάχιστον {n} {files} για να ξεκινήσει η μεταφόρτωση.', 29 | msgFilesTooMany: 'Ο αριθμός των αρχείων που έχουν επιλεγεί για μεταφόρτωση ({n}) υπερβαίνει το μέγιστο επιτρεπόμενο αριθμό {m}.', 30 | msgFileNotFound: 'Το αρχείο με όνομα "{name}" δεν βρέθηκε!', 31 | msgFileSecured: 'Περιορισμοί ασφαλείας εμπόδισαν την ανάγνωση του αρχείου"{name}".', 32 | msgFileNotReadable: 'Το αρχείο με όνομα "{name}" δεν είναι αναγνώσιμο.', 33 | msgFilePreviewAborted: 'Η προεπισκόπηση του αρχείου ακυρώθηκε για "{name}".', 34 | msgFilePreviewError: 'Παρουσιάστηκε σφάλμα κατά την ανάγνωση του αρχείου "{name}".', 35 | msgInvalidFileType: 'Μη έγκυρος τύπος αρχείου "{name}". Οι τύποι αρχείων που υποστηρίζονται είναι : "{types}".', 36 | msgInvalidFileExtension: 'Μη έγκυρη επέκταση αρχείου "{name}". Οι επεκτάσεις που υποστηρίζονται είναι: "{extensions}" .', 37 | msgUploadAborted: 'Το ανέβασμα των αρχείων ματαιώθηκε', 38 | msgValidationError: 'Σπικύρωση σφάλματος', 39 | msgLoading: 'Φόρτωση αρχείου {index} από {files} …', 40 | msgProgress: 'Φόρτωση αρχείου {index} απο {files} - {name} - {percent}% ολοκληρώθηκε.', 41 | msgSelected: '{n} {files} επιλέχθηκαν', 42 | msgFoldersNotAllowed: 'Μπορείτε να σύρετε μόνο αρχεία! Παραβλέφθηκαν {n} φάκελος(οι).', 43 | msgImageWidthSmall: 'Πλάτος του αρχείου εικόνας "{name}" πρέπει να είναι τουλάχιστον {size} px.', 44 | msgImageHeightSmall: 'Ύψος του αρχείου εικόνας "{name}" πρέπει να είναι τουλάχιστον {size} px.', 45 | msgImageWidthLarge: 'Πλάτος του αρχείου εικόνας "{name}" δεν μπορεί να υπερβαίνει το {size} px.', 46 | msgImageHeightLarge: 'Ύψος του αρχείου εικόνας "{name}" δεν μπορεί να υπερβαίνει το {size} px.', 47 | msgImageResizeError: 'Δεν θα μπορούσε να πάρει τις διαστάσεις της εικόνας για να αλλάξετε το μέγεθος.', 48 | msgImageResizeException: 'Σφάλμα κατά την αλλαγή μεγέθους της εικόνας.
{errors}
', 49 | dropZoneTitle: 'Σύρετε τα αρχεία εδώ …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Αφαιρέστε το αρχείο', 53 | uploadTitle: 'Ανεβάστε το αρχείο', 54 | zoomTitle: 'Δείτε λεπτομέρειες', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Δεν ανεβάσει ακόμα', 57 | indicatorSuccessTitle: 'Προστέθηκε', 58 | indicatorErrorTitle: 'Ανέβασμα Σφάλμα', 59 | indicatorLoadingTitle: 'Μεταφόρτωση ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/es.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Spanish Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['es'] = { 15 | fileSingle: 'archivo', 16 | filePlural: 'archivos', 17 | browseLabel: 'Examinar …', 18 | removeLabel: 'Quitar', 19 | removeTitle: 'Quitar archivos seleccionados', 20 | cancelLabel: 'Cancelar', 21 | cancelTitle: 'Abortar la subida en curso', 22 | uploadLabel: 'Subir archivo', 23 | uploadTitle: 'Subir archivos seleccionados', 24 | msgNo: 'No', 25 | msgCancelled: 'Cancelado', 26 | msgZoomModalHeading: 'Vista previa detallada', 27 | msgSizeTooLarge: 'Archivo "{name}" ({size} KB) excede el tamaño máximo permitido de {maxSize} KB.', 28 | msgFilesTooLess: 'Debe seleccionar al menos {n} {files} a cargar.', 29 | msgFilesTooMany: 'El número de archivos seleccionados a cargar ({n}) excede el límite máximo permitido de {m}.', 30 | msgFileNotFound: 'Archivo "{name}" no encontrado.', 31 | msgFileSecured: 'No es posible acceder al archivo "{name}" porque estará siendo usado por otra aplicación o no tengamos permisos de lectura.', 32 | msgFileNotReadable: 'No es posible acceder al archivo "{name}".', 33 | msgFilePreviewAborted: 'Previsualización del archivo "{name}" cancelada.', 34 | msgFilePreviewError: 'Ocurrió un error mientras se leía el archivo "{name}".', 35 | msgInvalidFileType: 'Tipo de archivo no válido para "{name}". Sólo archivos "{types}" son permitidos.', 36 | msgInvalidFileExtension: 'Extensión de archivo no válido para "{name}". Sólo archivos "{extensions}" son permitidos.', 37 | msgUploadAborted: 'La carga de archivos se ha cancelado', 38 | msgValidationError: 'Error de validacion', 39 | msgLoading: 'Subiendo archivo {index} de {files} …', 40 | msgProgress: 'Subiendo archivo {index} de {files} - {name} - {percent}% completado.', 41 | msgSelected: '{n} {files} seleccionado(s)', 42 | msgFoldersNotAllowed: 'Arrastre y suelte únicamente archivos. Omitida(s) {n} carpeta(s).', 43 | msgImageWidthSmall: 'El ancho de la imagen "{name}" debe ser al menos {size} px.', 44 | msgImageHeightSmall: 'La altura de la imagen "{name}" debe ser al menos {size} px.', 45 | msgImageWidthLarge: 'El ancho de la imagen "{name}" no puede exceder de {size} px.', 46 | msgImageHeightLarge: 'La altura de la imagen "{name}" no puede exceder de {size} px.', 47 | msgImageResizeError: 'No se pudo obtener las dimensiones de imagen para cambiar el tamaño.', 48 | msgImageResizeException: 'Error al cambiar el tamaño de la imagen.
{errors}
', 49 | dropZoneTitle: 'Arrastre y suelte aquí los archivos …', 50 | dropZoneClickTitle: '
(o haga click para seleccionar {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Eliminar archivo', 53 | uploadTitle: 'Subir archivo', 54 | zoomTitle: 'Ver detalles', 55 | dragTitle: 'Mover / Arreglar de nuevo', 56 | indicatorNewTitle: 'No subido todavía', 57 | indicatorSuccessTitle: 'Subido', 58 | indicatorErrorTitle: 'Subir Error', 59 | indicatorLoadingTitle: 'Subiendo ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'Ver archivo anterior', 63 | next: 'Ver archivo siguiente', 64 | toggleheader: 'Activar encabezado', 65 | fullscreen: 'Activar pantalla completa', 66 | borderless: 'Activar el modo sin bordes', 67 | close: 'Cerrar vista detallada' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/fa.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Persian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Milad Nekofar 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['fa'] = { 16 | fileSingle: 'فایل', 17 | filePlural: 'فایل', 18 | browseLabel: 'مرور …', 19 | removeLabel: 'حذف', 20 | removeTitle: 'پاکسازی فایل‌های انتخاب شده', 21 | cancelLabel: 'لغو', 22 | cancelTitle: 'لغو بارگزاری جاری', 23 | uploadLabel: 'بارگذاری', 24 | uploadTitle: 'بارگذاری فایل‌های انتخاب شده', 25 | msgNo: 'No', 26 | msgCancelled: 'Cancelled', 27 | msgZoomModalHeading: 'Detailed Preview', 28 | msgSizeTooLarge: 'فایل "{name}" ({size} کیلوبایت) از حداکثر مجاز {maxSize} کیلوبایت.', 29 | msgFilesTooLess: 'شما باید حداقل {n} {files} فایل برای بارگذاری انتخاب کنید.', 30 | msgFilesTooMany: 'تعداد فایل‌های انتخاب شده برای بارگذاری ({n}) از حداکثر مجاز عبور کرده است {m}.', 31 | msgFileNotFound: 'فایل "{name}" یافت نشد!', 32 | msgFileSecured: 'محدودیت های امنیتی مانع خواندن فایل "{name}" است.', 33 | msgFileNotReadable: 'فایل "{name}" قابل نوشتن نیست.', 34 | msgFilePreviewAborted: 'پیشنمایش فایل "{name}". شکست خورد', 35 | msgFilePreviewError: 'در هنگام خواندن فایل "{name}" خطایی رخ داد.', 36 | msgInvalidFileType: 'نوع فایل "{name}" معتبر نیست. فقط "{types}" پشیبانی می‌شود.', 37 | msgInvalidFileExtension: 'پسوند فایل "{name}" معتبر نیست. فقط "{extensions}" پشتیبانی می‌شود.', 38 | msgUploadAborted: 'The file upload was aborted', 39 | msgValidationError: 'خطای اعتبار سنجی', 40 | msgLoading: 'بارگیری فایل {index} از {files} …', 41 | msgProgress: 'بارگیری فایل {index} از {files} - {name} - {percent}% تمام شد.', 42 | msgSelected: '{n} {files} انتخاب شده', 43 | msgFoldersNotAllowed: 'فقط فایل‌ها را بکشید و رها کنید! {n} پوشه نادیده گرفته شد.', 44 | msgImageWidthSmall: 'عرض فایل تصویر "{name}" باید حداقل {size} پیکسل باشد.', 45 | msgImageHeightSmall: 'ارتفاع فایل تصویر "{name}" باید حداقل {size} پیکسل باشد.', 46 | msgImageWidthLarge: 'عرض فایل تصویر "{name}" نمیتواند از {size} پیکسل بیشتر باشد.', 47 | msgImageHeightLarge: 'ارتفاع فایل تصویر "{name}" نمی‌تواند از {size} پیکسل بیشتر باشد.', 48 | msgImageResizeError: 'یافت نشد ابعاد تصویر را برای تغییر اندازه.', 49 | msgImageResizeException: 'خطا در هنگام تغییر اندازه تصویر.
{errors}
', 50 | dropZoneTitle: 'فایل‌ها را بکشید و در اینجا رها کنید …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'حذف فایل', 54 | uploadTitle: 'آپلود فایل', 55 | zoomTitle: 'دیدن جزئیات', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'آپلود نشده است', 58 | indicatorSuccessTitle: 'آپلود شده', 59 | indicatorErrorTitle: 'بارگذاری خطا', 60 | indicatorLoadingTitle: 'آپلود ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/fi.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Finnish Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales.fi = { 15 | fileSingle: 'tiedosto', 16 | filePlural: 'tiedostot', 17 | browseLabel: 'Selaa …', 18 | removeLabel: 'Poista', 19 | removeTitle: 'Tyhjännä valitut tiedostot', 20 | cancelLabel: 'Peruuta', 21 | cancelTitle: 'Peruuta lataus', 22 | uploadLabel: 'Lataa', 23 | uploadTitle: 'Lataa valitut tiedostot', 24 | msgSizeTooLarge: 'Tiedosto "{name}" ({size} Kt) ylittää suurimman sallitun tiedoston koon, joka on {maxSize} Kt. Yritä uudelleen!', 25 | msgFilesTooLess: 'Vähintään {n} {files} tiedostoa on valittava ladattavaksi. Ole hyvä ja yritä uudelleen!', 26 | msgFilesTooMany: 'Valittujen tiedostojen lukumäärä ({n}) ylittää suurimman sallitun määrän {m}. Ole hyvä ja yritä uudelleen!', 27 | msgFileNotFound: 'Tiedostoa "{name}" ei löydy!', 28 | msgFileSecured: 'Tietoturvarajoitukset estävät tiedoston "{name}" lukemisen.', 29 | msgFileNotReadable: 'Tiedosto "{name}" ei ole luettavissa.', 30 | msgFilePreviewAborted: 'Tiedoston "{name}" esikatselu keskeytetty.', 31 | msgFilePreviewError: 'Virhe on tapahtunut luettaessa tiedostoa "{name}".', 32 | msgInvalidFileType: 'Tiedosto "{name}" on väärän tyyppinen. Ainoastaan tiedostot tyyppiä "{types}" ovat tuettuja.', 33 | msgInvalidFileExtension: 'Tiedoston "{name}" tarkenne on epäkelpo. Ainoastaan tarkenteet "{extensions}" ovat tuettuja.', 34 | msgValidationError: 'Tiedoston latausvirhe', 35 | msgLoading: 'Ladataan tiedostoa {index} / {files} …', 36 | msgProgress: 'Ladataan tiedostoa {index} / {files} - {name} - {percent}% valmistunut.', 37 | msgSelected: '{n} tiedostoa valittu', 38 | msgFoldersNotAllowed: 'Raahaa ja pudota ainoastaan tiedostoja! Ohitettu {n} raahattua kansiota.', 39 | dropZoneTitle: 'Raahaa ja pudota tiedostot tähän …', 40 | dropZoneClickTitle: '
(or click to select {files})', 41 | fileActionSettings: { 42 | removeTitle: 'Remove file', 43 | uploadTitle: 'Upload file', 44 | zoomTitle: 'View Details', 45 | dragTitle: 'Move / Rearrange', 46 | indicatorNewTitle: 'Not uploaded yet', 47 | indicatorSuccessTitle: 'Uploaded', 48 | indicatorErrorTitle: 'Upload Error', 49 | indicatorLoadingTitle: 'Uploading ...' 50 | }, 51 | previewZoomButtonTitles: { 52 | prev: 'View previous file', 53 | next: 'View next file', 54 | toggleheader: 'Toggle header', 55 | fullscreen: 'Toggle full screen', 56 | borderless: 'Toggle borderless mode', 57 | close: 'Close detailed preview' 58 | } 59 | }; 60 | 61 | $.extend($.fn.fileinput.defaults, $.fn.fileinputLocales.fi); 62 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/fr.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput French Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['fr'] = { 15 | fileSingle: 'fichier', 16 | filePlural: 'fichiers', 17 | browseLabel: 'Parcourir…', 18 | removeLabel: 'Retirer', 19 | removeTitle: 'Retirer les fichiers sélectionnés', 20 | cancelLabel: 'Annuler', 21 | cancelTitle: "Annuler l'envoi en cours", 22 | uploadLabel: 'Transférer', 23 | uploadTitle: 'Transférer les fichiers sélectionnés', 24 | msgNo: 'Non', 25 | msgCancelled: 'Annulé', 26 | msgZoomModalHeading: 'Aperçu détaillé', 27 | msgSizeTooLarge: 'Le fichier "{name}" ({size} Ko) dépasse la taille maximale autorisée qui est de {maxSize} Ko.', 28 | msgFilesTooLess: 'Vous devez sélectionner au moins {n} {files} à transmettre.', 29 | msgFilesTooMany: 'Le nombre de fichier sélectionné ({n}) dépasse la quantité maximale autorisée qui est de {m}.', 30 | msgFileNotFound: 'Le fichier "{name}" est introuvable !', 31 | msgFileSecured: "Des restrictions de sécurité vous empêchent d'accéder au fichier \"{name}\".", 32 | msgFileNotReadable: 'Le fichier "{name}" est illisble.', 33 | msgFilePreviewAborted: 'Prévisualisation du fichier "{name}" annulée.', 34 | msgFilePreviewError: 'Une erreur est survenue lors de la lecture du fichier "{name}".', 35 | msgInvalidFileType: 'Type de document invalide pour "{name}". Seulement les documents de type "{types}" sont autorisés.', 36 | msgInvalidFileExtension: 'Extension invalide pour le fichier "{name}". Seules les extensions "{extensions}" sont autorisées.', 37 | msgUploadAborted: 'Le téléchargement du fichier a été interrompu', 38 | msgValidationError: 'Erreur de validation', 39 | msgLoading: 'Transmission du fichier {index} sur {files}…', 40 | msgProgress: 'Transmission du fichier {index} sur {files} - {name} - {percent}% faits.', 41 | msgSelected: '{n} {files} sélectionné(s)', 42 | msgFoldersNotAllowed: 'Glissez et déposez uniquement des fichiers ! {n} répertoire(s) exclu(s).', 43 | msgImageWidthSmall: 'Largeur de fichier image "{name}" doit être d\'au moins {size} px.', 44 | msgImageHeightSmall: 'Hauteur de fichier image "{name}" doit être d\'au moins {size} px.', 45 | msgImageWidthLarge: 'Largeur de fichier image "{name}" ne peut pas dépasser {size} px.', 46 | msgImageHeightLarge: 'Hauteur de fichier image "{name}" ne peut pas dépasser {size} px.', 47 | msgImageResizeError: "Impossible d'obtenir les dimensions de l'image à redimensionner.", 48 | msgImageResizeException: "Erreur lors du redimensionnement de l'image.
{errors}
", 49 | dropZoneTitle: 'Glissez et déposez les fichiers ici…', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Supprimer le fichier', 53 | uploadTitle: 'Télécharger un fichier', 54 | zoomTitle: 'Voir les détails', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Pas encore téléchargé', 57 | indicatorSuccessTitle: 'Posté', 58 | indicatorErrorTitle: 'Ajouter erreur', 59 | indicatorLoadingTitle: 'ajout ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/hu.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Hungarian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['hu'] = { 15 | fileSingle: 'fájl', 16 | filePlural: 'fájl', 17 | browseLabel: 'Böngész …', 18 | removeLabel: 'Eltávolít', 19 | removeTitle: 'Kijelölt fájlok törlése', 20 | cancelLabel: 'Mégse', 21 | cancelTitle: 'Feltöltés megszakítása', 22 | uploadLabel: 'Feltöltés', 23 | uploadTitle: 'Kijelölt fájlok feltöltése', 24 | msgNo: 'No', 25 | msgCancelled: 'Cancelled', 26 | msgZoomModalHeading: 'Részletes Preview', 27 | msgSizeTooLarge: '"{name}" fájl ({size} KB) mérete nagyobb a megengedettnél {maxSize} KB.', 28 | msgFilesTooLess: 'Legalább {n} {files} ki kell választania a feltöltéshez.', 29 | msgFilesTooMany: 'A feltölteni kívánt fájlok száma ({n}) elérte a megengedett maximumot {m}.', 30 | msgFileNotFound: '"{name}" fájl nem található!', 31 | msgFileSecured: 'Biztonsági beállítások nem engedik olvasni a fájlt "{name}".', 32 | msgFileNotReadable: '"{name}" fájl nem olvasható', 33 | msgFilePreviewAborted: '"{name}" fájl feltöltése megszakítva.', 34 | msgFilePreviewError: 'Hiba lépett fel a "{name}" fájl olvasása közben.', 35 | msgInvalidFileType: 'Nem megengedett fájl "{name}". Csak a "{types}" fájl típusok támogatottak.', 36 | msgInvalidFileExtension: 'Nem megengedett kiterjesztés / fájltípus "{name}". Csak a "{extensions}" kiterjesztés(ek) / fájltípus(ok) támogatottak.', 37 | msgUploadAborted: 'A fájl feltöltés megszakítva', 38 | msgValidationError: 'Érvényesítés hiba', 39 | msgLoading: '{index} / {files} töltése …', 40 | msgProgress: 'Feltöltés: {index} / {files} - {name} - {percent}% kész.', 41 | msgSelected: '{n} {files} kiválasztva.', 42 | msgFoldersNotAllowed: 'Csak fájlokat húzzon ide! Kihagyva {n} könyvtár.', 43 | msgImageWidthSmall: 'Szélessége image file "{name}" legalább {size} px.', 44 | msgImageHeightSmall: 'Magassága image file "{name}" legalább {size} px.', 45 | msgImageWidthLarge: 'Szélessége image file "{name}" nem haladhatja meg a {size} px.', 46 | msgImageHeightLarge: 'Magassága image file "{name}" nem haladhatja meg a {size} px.', 47 | msgImageResizeError: 'Nem lehet megszerezni a kép méretei átméretezni.', 48 | msgImageResizeException: 'Hiba történt a méretezés.
{errors}
', 49 | dropZoneTitle: 'Fájlok húzása ide …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'A fájl eltávolítása', 53 | uploadTitle: 'fájl feltöltése', 54 | zoomTitle: 'Részletek megtekintése', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Nem feltöltve', 57 | indicatorSuccessTitle: 'Feltöltött', 58 | indicatorErrorTitle: 'Feltöltés Error', 59 | indicatorLoadingTitle: 'Feltöltése ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/id.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Indonesian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Bambang Riswanto 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['id'] = { 16 | fileSingle: 'berkas', 17 | filePlural: 'berkas', 18 | browseLabel: 'Pilih File …', 19 | removeLabel: 'Hapus', 20 | removeTitle: 'Hapus berkas terpilih', 21 | cancelLabel: 'Batal', 22 | cancelTitle: 'Batalkan proses pengunggahan', 23 | uploadLabel: 'Unggah', 24 | uploadTitle: 'Unggah berkas terpilih', 25 | msgNo: 'Tidak', 26 | msgCancelled: 'Dibatalkan', 27 | msgZoomModalHeading: 'Pratinjau terperinci', 28 | msgSizeTooLarge: 'Berkas "{name}" ({size} KB) melebihi ukuran upload maksimal yaitu {maxSize} KB.', 29 | msgFilesTooLess: 'Anda harus memilih setidaknya {n} {files} untuk diunggah.', 30 | msgFilesTooMany: '({n}) berkas yang dipilih untuk diunggah melebihi ukuran upload maksimal yaitu {m}.', 31 | msgFileNotFound: 'Berkas "{name}" tak ditemukan!', 32 | msgFileSecured: 'Sistem keamanan mencegah untuk membaca berkas "{name}".', 33 | msgFileNotReadable: 'Berkas "{name}" tak dapat dibaca.', 34 | msgFilePreviewAborted: 'Pratinjau untuk berkas "{name}" dibatalkan.', 35 | msgFilePreviewError: 'Kesalahan saat membaca berkas "{name}".', 36 | msgInvalidFileType: 'Jenis berkas "{name}" tidak sah. Hanya berkas "{types}" yang didukung.', 37 | msgInvalidFileExtension: 'Ekstensi berkas "{name}" tidak sah. Hanya ekstensi "{extensions}" yang didukung.', 38 | msgUploadAborted: 'Pengunggahan berkas dibatalkan', 39 | msgValidationError: 'Kesalahan validasi', 40 | msgLoading: 'Memuat {index} dari {files} berkas …', 41 | msgProgress: 'Memuat {index} dari {files} berkas - {name} - {percent}% selesai.', 42 | msgSelected: '{n} {files} dipilih', 43 | msgFoldersNotAllowed: 'Hanya tahan dan lepas file saja! {n} folder diabaikan.', 44 | msgImageWidthSmall: 'Lebar dari gambar "{name}" harus sekurangnya {size} px.', 45 | msgImageHeightSmall: 'Tinggi dari gambar "{name}" harus sekurangnya {size} px.', 46 | msgImageWidthLarge: 'Lebar dari gambar "{name}" tak boleh melebihi {size} px.', 47 | msgImageHeightLarge: 'Tinggi dari gambar "{name}" tak boleh melebihi {size} px.', 48 | msgImageResizeError: 'Tak dapat menentukan dimensi gambar untuk mengubah ukuran.', 49 | msgImageResizeException: 'Kesalahan saat mengubah ukuran gambar.
{errors}
', 50 | dropZoneTitle: 'Tarik dan lepaskan berkas disini …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'Hapus berkas', 54 | uploadTitle: 'Unggah berkas', 55 | zoomTitle: 'Tampilkan Rincian', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'Belum diunggah', 58 | indicatorSuccessTitle: 'Sudah diunggah', 59 | indicatorErrorTitle: 'Kesalahan pengunggahan', 60 | indicatorLoadingTitle: 'Mengunggah ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/it.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Italian Translation 3 | * 4 | * Author: Lorenzo Milesi 5 | * 6 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 7 | * any HTML markup tags in the messages must not be converted or translated. 8 | * 9 | * @see http://github.com/kartik-v/bootstrap-fileinput 10 | * 11 | * NOTE: this file must be saved in UTF-8 encoding. 12 | */ 13 | (function ($) { 14 | "use strict"; 15 | 16 | $.fn.fileinputLocales['it'] = { 17 | fileSingle: 'file', 18 | filePlural: 'file', 19 | browseLabel: 'Sfoglia…', 20 | removeLabel: 'Rimuovi', 21 | removeTitle: 'Rimuovi i file selezionati', 22 | cancelLabel: 'Annulla', 23 | cancelTitle: 'Annulla i caricamenti in corso', 24 | uploadLabel: 'Carica', 25 | uploadTitle: 'Carica i file selezionati', 26 | msgNo: 'No', 27 | msgCancelled: 'Annullato', 28 | msgZoomModalHeading: 'Anteprima dettagliata', 29 | msgSizeTooLarge: 'Il file "{name}" ({size} KB) eccede la dimensione massima di caricamento di {maxSize} KB.', 30 | msgFilesTooLess: 'Devi selezionare almeno {n} {files} da caricare.', 31 | msgFilesTooMany: 'Il numero di file selezionati per il caricamento ({n}) eccede il numero massimo di file accettati {m}.', 32 | msgFileNotFound: 'File "{name}" non trovato!', 33 | msgFileSecured: 'Restrizioni di sicurezza impediscono la lettura del file "{name}".', 34 | msgFileNotReadable: 'Il file "{name}" non \xE8 leggibile.', 35 | msgFilePreviewAborted: 'Generazione anteprima per "{name}" annullata.', 36 | msgFilePreviewError: 'Errore durante la lettura del file "{name}".', 37 | msgInvalidFileType: 'Tipo non valido per il file "{name}". Sono ammessi solo file di tipo "{types}".', 38 | msgInvalidFileExtension: 'Estensione non valida per il file "{name}". Sono ammessi solo file con estensione "{extensions}".', 39 | msgUploadAborted: 'Il caricamento del file è stata interrotta', 40 | msgValidationError: 'Errore di convalida', 41 | msgLoading: 'Caricamento file {index} di {files}…', 42 | msgProgress: 'Caricamento file {index} di {files} - {name} - {percent}% completato.', 43 | msgSelected: '{n} {files} selezionati', 44 | msgFoldersNotAllowed: 'Trascina solo file! Ignorata/e {n} cartella/e.', 45 | msgImageWidthSmall: 'Larghezza di file immagine "{name}" deve essere di almeno {size} px.', 46 | msgImageHeightSmall: 'Altezza di file immagine "{name}" deve essere di almeno {size} px.', 47 | msgImageWidthLarge: 'Larghezza di file immagine "{name}" non può superare {size} px.', 48 | msgImageHeightLarge: 'Altezza di file immagine "{name}" non può superare {size} px.', 49 | msgImageResizeError: "Impossibile ottenere le dimensioni dell'immagine per ridimensionare.", 50 | msgImageResizeException: "Errore durante il ridimensionamento dell'immagine.
{errors}
", 51 | dropZoneTitle: 'Trascina i file qui…', 52 | dropZoneClickTitle: '
(or click to select {files})', 53 | fileActionSettings: { 54 | removeTitle: 'Rimuovere il file', 55 | uploadTitle: 'Caricare un file', 56 | zoomTitle: 'Guarda i dettagli', 57 | dragTitle: 'Move / Rearrange', 58 | indicatorNewTitle: 'Non ancora caricato', 59 | indicatorSuccessTitle: 'Caricati', 60 | indicatorErrorTitle: 'Carica Errore', 61 | indicatorLoadingTitle: 'Caricamento ...' 62 | }, 63 | previewZoomButtonTitles: { 64 | prev: 'View previous file', 65 | next: 'View next file', 66 | toggleheader: 'Toggle header', 67 | fullscreen: 'Toggle full screen', 68 | borderless: 'Toggle borderless mode', 69 | close: 'Close detailed preview' 70 | } 71 | }; 72 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/ja.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Japanese Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Yuta Hoshina 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | * slugCallback 12 | * \u4e00-\u9fa5 : Kanji (Chinese characters) 13 | * \u3040-\u309f : Hiragana (Japanese syllabary) 14 | * \u30a0-\u30ff\u31f0-\u31ff : Katakana (including phonetic extension) 15 | * \u3200-\u32ff : Enclosed CJK Letters and Months 16 | * \uff00-\uffef : Halfwidth and Fullwidth Forms 17 | */ 18 | (function ($) { 19 | "use strict"; 20 | 21 | $.fn.fileinputLocales['ja'] = { 22 | fileSingle: 'ファイル', 23 | filePlural: 'ファイル', 24 | browseLabel: 'ファイルを選択…', 25 | removeLabel: '削除', 26 | removeTitle: '選択したファイルを削除', 27 | cancelLabel: 'キャンセル', 28 | cancelTitle: 'アップロードをキャンセル', 29 | uploadLabel: 'アップロード', 30 | uploadTitle: '選択したファイルをアップロード', 31 | msgNo: 'いいえ', 32 | msgCancelled: 'キャンセル', 33 | msgZoomModalHeading: 'ファイル詳細', 34 | msgSizeTooLarge: 'ファイル"{name}" ({size} KB)はアップロード可能な上限容量{maxSize} KBを超えています', 35 | msgFilesTooLess: '最低{n}個の{files}を選択してください', 36 | msgFilesTooMany: '選択したファイルの数({n}個)はアップロード可能な上限数({m}個)を超えています', 37 | msgFileNotFound: 'ファイル"{name}"はありませんでした', 38 | msgFileSecured: 'ファイル"{name}"は読み取り権限がないため取得できません', 39 | msgFileNotReadable: 'ファイル"{name}"は読み込めません', 40 | msgFilePreviewAborted: 'ファイル"{name}"のプレビューを中止しました', 41 | msgFilePreviewError: 'ファイル"{name}"の読み込み中にエラーが発生しました', 42 | msgInvalidFileType: '"{name}"は無効なファイル形式です。"{types}"形式のファイルのみサポートしています', 43 | msgInvalidFileExtension: '"{name}"は無効なファイル拡張子です。拡張子が"{extensions}"のファイルのみサポートしています', 44 | msgUploadAborted: 'ファイルのアップロードが中止されました', 45 | msgValidationError: '検証エラー', 46 | msgLoading: '{files}個中{index}個目のファイルを読み込み中…', 47 | msgProgress: '{files}個中{index}個のファイルを読み込み中 - {name} - {percent}% 完了', 48 | msgSelected: '{n}個の{files}を選択', 49 | msgFoldersNotAllowed: 'ドラッグ&ドロップが可能なのはファイルのみです。{n}個のフォルダ-は無視されました', 50 | msgImageWidthSmall: '画像ファイル"{name}"の幅が小さすぎます。画像サイズの幅は少なくとも{size}px必要です', 51 | msgImageHeightSmall: '画像ファイル"{name}"の高さが小さすぎます。画像サイズの高さは少なくとも{size}px必要です', 52 | msgImageWidthLarge: '画像ファイル"{name}"の幅がアップロード可能な画像サイズ({size}px)を超えています', 53 | msgImageHeightLarge: '画像ファイル"{name}"の高さがアップロード可能な画像サイズ({size}px)を超えています', 54 | msgImageResizeError: 'リサイズ時に画像サイズが取得できませんでした', 55 | msgImageResizeException: '画像のリサイズ時にエラーが発生しました。
{errors}
', 56 | dropZoneTitle: 'ファイルをドラッグ&ドロップ…', 57 | dropZoneClickTitle: '
(or click to select {files})', 58 | slugCallback: function(text) { 59 | return text ? text.split(/(\\|\/)/g).pop().replace(/[^\w\u4e00-\u9fa5\u3040-\u309f\u30a0-\u30ff\u31f0-\u31ff\u3200-\u32ff\uff00-\uffef\-.\\\/ ]+/g, '') : ''; 60 | }, 61 | fileActionSettings: { 62 | removeTitle: 'ファイルを削除', 63 | uploadTitle: 'ファイルをアップロード', 64 | zoomTitle: 'プレビュー', 65 | dragTitle: 'Move / Rearrange', 66 | indicatorNewTitle: 'まだアップロードされていません', 67 | indicatorSuccessTitle: 'アップロード済み', 68 | indicatorErrorTitle: 'アップロード失敗', 69 | indicatorLoadingTitle: 'アップロード中...' 70 | }, 71 | previewZoomButtonTitles: { 72 | prev: 'View previous file', 73 | next: 'View next file', 74 | toggleheader: 'Toggle header', 75 | fullscreen: 'Toggle full screen', 76 | borderless: 'Toggle borderless mode', 77 | close: 'Close detailed preview' 78 | } 79 | }; 80 | })(window.jQuery); 81 | -------------------------------------------------------------------------------- /public/js/locales/nl.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Dutch Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['nl'] = { 15 | fileSingle: 'bestand', 16 | filePlural: 'bestanden', 17 | browseLabel: 'Zoek …', 18 | removeLabel: 'Verwijder', 19 | removeTitle: 'Verwijder geselecteerde bestanden', 20 | cancelLabel: 'Annuleren', 21 | cancelTitle: 'Annuleer upload', 22 | uploadLabel: 'Upload', 23 | uploadTitle: 'Upload geselecteerde bestanden', 24 | msgNo: 'Nee', 25 | msgCancelled: 'Geannuleerd', 26 | msgZoomModalHeading: 'Gedetailleerd voorbeeld', 27 | msgSizeTooLarge: 'Bestand "{name}" ({size} KB) is groter dan de toegestane {maxSize} KB.', 28 | msgFilesTooLess: 'U moet minstens {n} {files} selecteren om te uploaden.', 29 | msgFilesTooMany: 'Aantal geselecteerde bestanden ({n}) is meer dan de toegestane {m}.', 30 | msgFileNotFound: 'Bestand "{name}" niet gevonden!', 31 | msgFileSecured: 'Bestand kan niet gelezen worden in verband met beveiligings redenen "{name}".', 32 | msgFileNotReadable: 'Bestand "{name}" is niet leesbaar.', 33 | msgFilePreviewAborted: 'Bestand weergaven geannuleerd voor "{name}".', 34 | msgFilePreviewError: 'Er is een fout opgetreden met het lezen van "{name}".', 35 | msgInvalidFileType: 'Geen geldig bestand "{name}". Alleen "{types}" zijn toegestaan.', 36 | msgInvalidFileExtension: 'Geen geldige extensie "{name}". Alleen "{extensions}" zijn toegestaan.', 37 | msgUploadAborted: 'Het uploaden van bestanden is afgebroken', 38 | msgValidationError: 'Bevestiging fout', 39 | msgLoading: 'Bestanden laden {index} van de {files} …', 40 | msgProgress: 'Bestanden laden {index} van de {files} - {name} - {percent}% compleet.', 41 | msgSelected: '{n} {files} geselecteerd', 42 | msgFoldersNotAllowed: 'Drag & drop alleen bestanden! {n} overgeslagen map(pen).', 43 | msgImageWidthSmall: 'Breedte van het foto-bestand "{name}" moet minstens {size} px zijn.', 44 | msgImageHeightSmall: 'Hoogte van het foto-bestand "{name}" moet minstens {size} px zijn.', 45 | msgImageWidthLarge: 'Breedte van het foto-bestand "{name}" kan niet hoger zijn dan {size} px.', 46 | msgImageHeightLarge: 'Hoogte van het foto bestand "{name}" kan niet hoger zijn dan {size} px.', 47 | msgImageResizeError: 'Kon de foto afmetingen niet lezen om te verkleinen.', 48 | msgImageResizeException: 'Fout bij het verkleinen van de foto.
{errors}
', 49 | dropZoneTitle: 'Drag & drop bestanden hier …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Verwijder bestand', 53 | uploadTitle: 'bestand uploaden', 54 | zoomTitle: 'Bekijk details', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Nog niet geupload', 57 | indicatorSuccessTitle: 'geupload', 58 | indicatorErrorTitle: 'fout uploaden', 59 | indicatorLoadingTitle: 'uploaden ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/pl.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Polish Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['pl'] = { 15 | fileSingle: 'plik', 16 | filePlural: 'pliki', 17 | browseLabel: 'Przeglądaj …', 18 | removeLabel: 'Usuń', 19 | removeTitle: 'Usuń zaznaczone pliki', 20 | cancelLabel: 'Przerwij', 21 | cancelTitle: 'Anuluj wysyłanie', 22 | uploadLabel: 'Wgraj', 23 | uploadTitle: 'Wgraj zaznaczone pliki', 24 | msgNo: 'Nie', 25 | msgCancelled: 'Odwołany', 26 | msgZoomModalHeading: 'Szczegółowe Podgląd', 27 | msgSizeTooLarge: 'Plik o nazwie "{name}" ({size} KB) przekroczył maksymalną dopuszczalną wielkość pliku wynoszącą {maxSize} KB.', 28 | msgFilesTooLess: 'Musisz wybrać przynajmniej {n} {files} do wgrania.', 29 | msgFilesTooMany: 'Liczba plików wybranych do wgrania w liczbie ({n}), przekracza maksymalny dozwolony limit wynoszący {m}.', 30 | msgFileNotFound: 'Plik "{name}" nie istnieje!', 31 | msgFileSecured: 'Ustawienia zabezpieczeń uniemożliwiają odczyt pliku "{name}".', 32 | msgFileNotReadable: 'Plik "{name}" nie jest plikiem do odczytu.', 33 | msgFilePreviewAborted: 'Podgląd pliku "{name}" został przerwany.', 34 | msgFilePreviewError: 'Wystąpił błąd w czasie odczytu pliku "{name}".', 35 | msgInvalidFileType: 'Nieznny typ pliku "{name}". Tylko następujące rodzaje plików "{types}", są obsługiwane.', 36 | msgInvalidFileExtension: 'Złe rozszerzenie dla pliku "{name}". Tylko następujące rozszerzenia plików "{extensions}", są obsługiwane.', 37 | msgUploadAborted: 'Plik przesyłanie zostało przerwane', 38 | msgValidationError: 'Błąd walidacji', 39 | msgLoading: 'Wczytywanie pliku {index} z {files} …', 40 | msgProgress: 'Wczytywanie pliku {index} z {files} - {name} - {percent}% zakończone.', 41 | msgSelected: '{n} {files} zaznaczonych', 42 | msgFoldersNotAllowed: 'Metodą przeciągnij i upuść, można przenosić tylko pliki. Pominięto {n} katalogów.', 43 | msgImageWidthSmall: 'Szerokość pliku obrazu "{name}" musi być co najmniej {size} px.', 44 | msgImageHeightSmall: 'Wysokość pliku obrazu "{name}" musi być co najmniej {size} px.', 45 | msgImageWidthLarge: 'Szerokość pliku obrazu "{name}" nie może przekraczać {size} px.', 46 | msgImageHeightLarge: 'Wysokość pliku obrazu "{name}" nie może przekraczać {size} px.', 47 | msgImageResizeError: 'Nie udało się uzyskać wymiary obrazu, aby zmienić rozmiar.', 48 | msgImageResizeException: 'Błąd podczas zmiany rozmiaru obrazu.
{errors}
', 49 | dropZoneTitle: 'Przeciągnij i upuść pliki tu …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Usuń plik', 53 | uploadTitle: 'przesyłanie pliku', 54 | zoomTitle: 'Pokaż szczegóły', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Jeszcze nie przesłanych', 57 | indicatorSuccessTitle: 'Dodane', 58 | indicatorErrorTitle: 'Prześlij błąd', 59 | indicatorLoadingTitle: 'Zamieszczanie ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/pt-BR.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Brazillian Portuguese Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['pt-BR'] = { 15 | fileSingle: 'arquivo', 16 | filePlural: 'arquivos', 17 | browseLabel: 'Procurar…', 18 | removeLabel: 'Remover', 19 | removeTitle: 'Remover arquivos selecionados', 20 | cancelLabel: 'Cancelar', 21 | cancelTitle: 'Interromper envio em andamento', 22 | uploadLabel: 'Enviar', 23 | uploadTitle: 'Enviar arquivos selecionados', 24 | msgNo: 'Não', 25 | msgCancelled: 'Cancelado', 26 | msgZoomModalHeading: 'Pré-visualização detalhada', 27 | msgSizeTooLarge: 'O arquivo "{name}" ({size} KB) excede o tamanho máximo permitido de {maxSize} KB.', 28 | msgFilesTooLess: 'Você deve selecionar pelo menos {n} {files} para enviar.', 29 | msgFilesTooMany: 'O número de arquivos selecionados para o envio ({n}) excede o limite máximo permitido de {m}.', 30 | msgFileNotFound: 'O arquivo "{name}" não foi encontrado!', 31 | msgFileSecured: 'Restrições de segurança impedem a leitura do arquivo "{name}".', 32 | msgFileNotReadable: 'O arquivo "{name}" não pode ser lido.', 33 | msgFilePreviewAborted: 'A pré-visualização do arquivo "{name}" foi interrompida.', 34 | msgFilePreviewError: 'Ocorreu um erro ao ler o arquivo "{name}".', 35 | msgInvalidFileType: 'Tipo inválido para o arquivo "{name}". Apenas arquivos "{types}" são permitidos.', 36 | msgInvalidFileExtension: 'Extensão inválida para o arquivo "{name}". Apenas arquivos "{extensions}" são permitidos.', 37 | msgUploadAborted: 'O upload do arquivo foi abortada', 38 | msgValidationError: 'Erro de validação', 39 | msgLoading: 'Enviando arquivo {index} de {files}…', 40 | msgProgress: 'Enviando arquivo {index} de {files} - {name} - {percent}% completo.', 41 | msgSelected: '{n} {files} selecionado(s)', 42 | msgFoldersNotAllowed: 'Arraste e solte apenas arquivos! {n} soltar pasta(s) ignoradas.', 43 | msgImageWidthSmall: 'Largura do arquivo de imagem "{name}" deve ser pelo menos {size} px.', 44 | msgImageHeightSmall: 'Altura do arquivo de imagem "{name}" deve ser pelo menos {size} px.', 45 | msgImageWidthLarge: 'Largura do arquivo de imagem "{name}" não pode exceder {size} px.', 46 | msgImageHeightLarge: 'Altura do arquivo de imagem "{name}" não pode exceder {size} px.', 47 | msgImageResizeError: 'Could not get the image dimensions to resize.', 48 | msgImageResizeException: 'Erro ao redimensionar a imagem.
{errors}
', 49 | dropZoneTitle: 'Arraste e solte os arquivos aqui…', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Remover arquivo', 53 | uploadTitle: 'Carregar arquivo', 54 | zoomTitle: 'Ver detalhes', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Ainda não carregou', 57 | indicatorSuccessTitle: 'Carregado', 58 | indicatorErrorTitle: 'Carregar Erro', 59 | indicatorLoadingTitle: 'A carregar ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/pt.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Portuguese Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['pt'] = { 15 | fileSingle: 'ficheiro', 16 | filePlural: 'ficheiros', 17 | browseLabel: 'Procurar …', 18 | removeLabel: 'Remover', 19 | removeTitle: 'Remover ficheiros seleccionados', 20 | cancelLabel: 'Cancelar', 21 | cancelTitle: 'Abortar carregamento ', 22 | uploadLabel: 'Carregar', 23 | uploadTitle: 'Carregar ficheiros seleccionados', 24 | msgNo: 'Não', 25 | msgCancelled: 'Cancelado', 26 | msgZoomModalHeading: 'Pré-visualização detalhada', 27 | msgSizeTooLarge: 'Ficheiro "{name}" ({size} KB) excede o tamanho máximo permido de {maxSize} KB.', 28 | msgFilesTooLess: 'Deve seleccionar pelo menos {n} {files} para fazer upload.', 29 | msgFilesTooMany: 'Número máximo de ficheiros seleccionados ({n}) excede o limite máximo de {m}.', 30 | msgFileNotFound: 'Ficheiro "{name}" não encontrado!', 31 | msgFileSecured: 'Restrições de segurança preventem a leitura do ficheiro "{name}".', 32 | msgFileNotReadable: 'Ficheiro "{name}" não pode ser lido.', 33 | msgFilePreviewAborted: 'Pré-visualização abortado para o ficheiro "{name}".', 34 | msgFilePreviewError: 'Ocorreu um erro ao ler o ficheiro "{name}".', 35 | msgInvalidFileType: 'Tipo inválido para o ficheiro "{name}". Apenas ficheiros "{types}" são suportados.', 36 | msgInvalidFileExtension: 'Extensão inválida para o ficheiro "{name}". Apenas ficheiros "{extensions}" são suportados.', 37 | msgUploadAborted: 'O upload do arquivo foi abortada', 38 | msgValidationError: 'Erro de validação', 39 | msgLoading: 'A carregar ficheiro {index} de {files} …', 40 | msgProgress: 'A carregar ficheiro {index} de {files} - {name} - {percent}% completo.', 41 | msgSelected: '{n} {files} seleccionados', 42 | msgFoldersNotAllowed: 'Arrastar e largar ficheiros apenas! {n} pasta(s) ignoradas.', 43 | msgImageWidthSmall: 'Largura do arquivo de imagem "{name}" deve ser pelo menos {size} px.', 44 | msgImageHeightSmall: 'Altura do arquivo de imagem "{name}" deve ser pelo menos {size} px.', 45 | msgImageWidthLarge: 'Largura do arquivo de imagem "{name}" não pode exceder {size} px.', 46 | msgImageHeightLarge: 'Altura do arquivo de imagem "{name}" não pode exceder {size} px.', 47 | msgImageResizeError: 'Could not get the image dimensions to resize.', 48 | msgImageResizeException: 'Erro ao redimensionar a imagem.
{errors}
', 49 | dropZoneTitle: 'Arrastar e largar ficheiros aqui …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Remover arquivo', 53 | uploadTitle: 'Carregar arquivo', 54 | zoomTitle: 'Ver detalhes', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Ainda não carregou', 57 | indicatorSuccessTitle: 'Carregado', 58 | indicatorErrorTitle: 'Carregar Erro', 59 | indicatorLoadingTitle: 'A carregar ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/ro.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Romanian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author Ciprian Voicu 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['ro'] = { 16 | fileSingle: 'fișier', 17 | filePlural: 'fișiere', 18 | browseLabel: 'Răsfoiește …', 19 | removeLabel: 'Șterge', 20 | removeTitle: 'Curăță fișierele selectate', 21 | cancelLabel: 'Renunță', 22 | cancelTitle: 'Anulează încărcarea curentă', 23 | uploadLabel: 'Încarcă', 24 | uploadTitle: 'Încarcă fișierele selectate', 25 | msgNo: 'Nu', 26 | msgCancelled: 'Anulat', 27 | msgZoomModalHeading: 'Previzualizare detaliată', 28 | msgSizeTooLarge: 'Fișierul "{name}" ({size} KB) depășește limita maximă de încărcare de {maxSize} KB.', 29 | msgFilesTooLess: 'Trebuie să selectezi cel puțin {n} {files} pentru a încărca.', 30 | msgFilesTooMany: 'Numărul fișierelor pentru încărcare ({n}) depășește limita maximă de {m}.', 31 | msgFileNotFound: 'Fișierul "{name}" nu a fost găsit!', 32 | msgFileSecured: 'Restricții de securitate previn citirea fișierului "{name}".', 33 | msgFileNotReadable: 'Fișierul "{name}" nu se poate citi.', 34 | msgFilePreviewAborted: 'Fișierului "{name}" nu poate fi previzualizat.', 35 | msgFilePreviewError: 'A intervenit o eroare în încercarea de citire a fișierului "{name}".', 36 | msgInvalidFileType: 'Tip de fișier incorect pentru "{name}". Sunt suportate doar fișiere de tipurile "{types}".', 37 | msgInvalidFileExtension: 'Extensie incorectă pentru "{name}". Sunt suportate doar extensiile "{extensions}".', 38 | msgUploadAborted: 'Fișierul Încărcarea a fost întrerupt', 39 | msgValidationError: 'Eroare de validare', 40 | msgLoading: 'Se încarcă fișierul {index} din {files} …', 41 | msgProgress: 'Se încarcă fișierul {index} din {files} - {name} - {percent}% încărcat.', 42 | msgSelected: '{n} {files} încărcate', 43 | msgFoldersNotAllowed: 'Se poate doar trăgând fișierele! Se renunță la {n} dosar(e).', 44 | msgImageWidthSmall: 'Lățimea de fișier de imagine "{name}" trebuie să fie de cel puțin {size px.', 45 | msgImageHeightSmall: 'Înălțimea fișier imagine "{name}" trebuie să fie de cel puțin {size} px.', 46 | msgImageWidthLarge: 'Lățimea de fișier de imagine "{name}" nu poate depăși {size} px.', 47 | msgImageHeightLarge: 'Înălțimea fișier imagine "{name}" nu poate depăși {size} px.', 48 | msgImageResizeError: 'Nu a putut obține dimensiunile imaginii pentru a redimensiona.', 49 | msgImageResizeException: 'Eroare la redimensionarea imaginii.
{errors}
', 50 | dropZoneTitle: 'Trage fișierele aici …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'Scoateți fișier', 54 | uploadTitle: 'Incarca fisier', 55 | zoomTitle: 'Vezi detalii', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'Nu a încărcat încă', 58 | indicatorSuccessTitle: 'încărcat', 59 | indicatorErrorTitle: 'Încărcați eroare', 60 | indicatorLoadingTitle: 'Se încarcă ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/ru.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Russian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author CyanoFresh 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['ru'] = { 16 | fileSingle: 'файл', 17 | filePlural: 'файлы', 18 | browseLabel: 'Выбрать …', 19 | removeLabel: 'Удалить', 20 | removeTitle: 'Очистить выбранные файлы', 21 | cancelLabel: 'Отмена', 22 | cancelTitle: 'Отменить текущую загрузку', 23 | uploadLabel: 'Загрузить', 24 | uploadTitle: 'Загрузить выбранные файлы', 25 | msgNo: 'нет', 26 | msgCancelled: 'Отменено', 27 | msgZoomModalHeading: 'Подробное превью', 28 | msgSizeTooLarge: 'Файл "{name}" ({size} KB) превышает максимальный размер {maxSize} KB.', 29 | msgFilesTooLess: 'Вы должны выбрать как минимум {n} {files} для загрузки.', 30 | msgFilesTooMany: 'Количество выбранных файлов ({n}) превышает максимально допустимое количество {m}.', 31 | msgFileNotFound: 'Файл "{name}" не найден!', 32 | msgFileSecured: 'Ограничения безопасности запрещают читать файл "{name}".', 33 | msgFileNotReadable: 'Файл "{name}" невозможно прочитать.', 34 | msgFilePreviewAborted: 'Предпросмотр отменен для файла "{name}".', 35 | msgFilePreviewError: 'Произошла ошибка при чтении файла "{name}".', 36 | msgInvalidFileType: 'Запрещенный тип файла для "{name}". Только "{types}" разрешены.', 37 | msgInvalidFileExtension: 'Запрещенное расширение для файла "{name}". Только "{extensions}" разрешены.', 38 | msgUploadAborted: 'Выгрузка файла прервана', 39 | msgValidationError: 'Ошибка проверки', 40 | msgLoading: 'Загрузка файла {index} из {files} …', 41 | msgProgress: 'Загрузка файла {index} из {files} - {name} - {percent}% завершено.', 42 | msgSelected: 'Выбрано файлов: {n}', 43 | msgFoldersNotAllowed: 'Разрешено перетаскивание только файлов! Пропущено {n} папок.', 44 | msgImageWidthSmall: 'Ширина изображения {name} должна быть не меньше {size} px.', 45 | msgImageHeightSmall: 'Высота изображения {name} должна быть не меньше {size} px.', 46 | msgImageWidthLarge: 'Ширина изображения "{name}" не может превышать {size} px.', 47 | msgImageHeightLarge: 'Высота изображения "{name}" не может превышать {size} px.', 48 | msgImageResizeError: 'Не удалось получить размеры изображения, чтобы изменить размер.', 49 | msgImageResizeException: 'Ошибка при изменении размера изображения.
{errors}
', 50 | dropZoneTitle: 'Перетащите файлы сюда …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'Удалить файл', 54 | uploadTitle: 'Загрузить файл', 55 | zoomTitle: 'посмотреть детали', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'Еще не загружен', 58 | indicatorSuccessTitle: 'Загружен', 59 | indicatorErrorTitle: 'Ошибка загрузки', 60 | indicatorLoadingTitle: 'Загрузка ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/sk.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Slovakian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['sk'] = { 15 | fileSingle: 'súbor', 16 | filePlural: 'súbory', 17 | browseLabel: 'Vybrať …', 18 | removeLabel: 'Odstrániť', 19 | removeTitle: 'Vyčistiť vybraté súbory', 20 | cancelLabel: 'Storno', 21 | cancelTitle: 'Prerušiť nahrávanie', 22 | uploadLabel: 'Nahrať', 23 | uploadTitle: 'Nahrať vybraté súbory', 24 | msgNo: 'Nie', 25 | msgCancelled: 'Zrušené', 26 | msgZoomModalHeading: 'Detailný náhľad', 27 | msgSizeTooLarge: 'Súbor "{name}" ({size} KB): prekročenie - maximálna povolená veľkosť {maxSize} KB.', 28 | msgFilesTooLess: 'Musíte vybrať najmenej {n} {files} pre nahranie.', 29 | msgFilesTooMany: 'Počet vybratých súborov pre nahranie ({n}): prekročenie - maximálny povolený limit {m}.', 30 | msgFileNotFound: 'Súbor "{name}" nebol nájdený!', 31 | msgFileSecured: 'Zabezpečenie súboru znemožnilo čítať súbor "{name}".', 32 | msgFileNotReadable: 'Súbor "{name}" nie je čitateľný.', 33 | msgFilePreviewAborted: 'Náhľad súboru bol prerušený pre "{name}".', 34 | msgFilePreviewError: 'Nastala chyba pri načítaní súboru "{name}".', 35 | msgInvalidFileType: 'Neplatný typ súboru "{name}". Iba "{types}" súborov sú podporované.', 36 | msgInvalidFileExtension: 'Neplatná extenzia súboru "{name}". Iba "{extensions}" súborov sú podporované.', 37 | msgUploadAborted: 'Súbor nahrávania bol prerušený', 38 | msgValidationError: 'Chyba overenia', 39 | msgLoading: 'Nahrávanie súboru {index} z {files} …', 40 | msgProgress: 'Nahrávanie súboru {index} z {files} - {name} - {percent}% dokončené.', 41 | msgSelected: '{n} {files} vybraté', 42 | msgFoldersNotAllowed: 'Tiahni a pusť iba súbory! Vynechané {n} pustené prečinok(y).', 43 | msgImageWidthSmall: 'Šírka image súboru "{name}", musí byť minimálne {size} px.', 44 | msgImageHeightSmall: 'Výška image súboru "{name}", musí byť minimálne {size} px.', 45 | msgImageWidthLarge: 'Šírka image súboru "{name}" nemôže presiahnuť {size} px.', 46 | msgImageHeightLarge: 'Výška súboru obrazu "{name}" nesmie presiahnuť {size} px.', 47 | msgImageResizeError: 'Nemožno získať rozmery obrázku zmeniť veľkosť.', 48 | msgImageResizeException: 'Chyba pri zmene veľkosti obrázka.
{errors}
', 49 | dropZoneTitle: 'Tiahni a pusť súbory tu …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'odstrániť súbor', 53 | uploadTitle: 'nahrať súbor', 54 | zoomTitle: 'Zobraziť podrobnosti', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Ešte nenahral', 57 | indicatorSuccessTitle: 'nahral', 58 | indicatorErrorTitle: 'nahrať Chyba', 59 | indicatorLoadingTitle: 'nahrávanie ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/th.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Thai Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['th'] = { 15 | fileSingle: 'ไฟล์', 16 | filePlural: 'ไฟล์', 17 | browseLabel: 'เลือกดู …', 18 | removeLabel: 'ลบทิ้ง', 19 | removeTitle: 'ลบไฟล์ที่เลือกทิ้ง', 20 | cancelLabel: 'ยกเลิก', 21 | cancelTitle: 'ยกเลิกการอัพโหลด', 22 | uploadLabel: 'อัพโหลด', 23 | uploadTitle: 'อัพโหลดไฟล์ที่เลือก', 24 | msgNo: 'ไม่', 25 | msgCancelled: 'ยกเลิก', 26 | msgZoomModalHeading: 'ตัวอย่างละเอียด', 27 | msgSizeTooLarge: 'ไฟล์ "{name}" ({size} KB) มีขนาดเกินที่ระบบอนุญาตที่ {maxSize} KB, กรุณาลองใหม่อีกครั้ง!', 28 | msgFilesTooLess: 'คุณต้องเลือกไฟล์จำนวนอย่างน้อย {n} {files} เพื่ออัพโหลด, กรุณาลองใหม่อีกครั้ง!', 29 | msgFilesTooMany: 'ไฟล์ที่คุณเลือกมีจำนวน ({n}) ซึ่งเกินกว่าที่ระบบอนุญาตที่ {m}, กรุณาลองใหม่อีกครั้ง!', 30 | msgFileNotFound: 'ไม่พบไฟล์ "{name}" !', 31 | msgFileSecured: 'ระบบความปลอดภัยไม่อนุญาตให้อ่านไฟล์ "{name}".', 32 | msgFileNotReadable: 'ไม่สามารถอ่านไฟล์ "{name}" ได้', 33 | msgFilePreviewAborted: 'ไฟล์ "{name}" ไม่อนุญาตให้ดูตัวอย่าง', 34 | msgFilePreviewError: 'พบปัญหาในการดูตัวอย่างไฟล์ "{name}".', 35 | msgInvalidFileType: 'ไฟล์ "{name}" เป็นประเภทไฟล์ที่ไม่ถูกต้อง, อนุญาตเฉพาะไฟล์ประเภท "{types}"', 36 | msgInvalidFileExtension: 'ไฟล์ "{name}" เป็น extension ที่ไมถูกต้อง, อนุญาตเฉพาะไฟล์ extension "{extensions}"', 37 | msgUploadAborted: 'อัปโหลดไฟล์ถูกยกเลิก', 38 | msgValidationError: 'ข้อผิดพลาดในการตรวจสอบ', 39 | msgLoading: 'กำลังโหลดไฟล์ {index} จาก {files} …', 40 | msgProgress: 'กำลังโหลดไฟล์ {index} จาก {files} - {name} - {percent}%', 41 | msgSelected: '{n} {files} ถูกเลือก', 42 | msgFoldersNotAllowed: 'Drag & drop เฉพาะไฟล์เท่านั้น! ข้าม dropped folder จำนวน {n}', 43 | msgImageWidthSmall: 'ความกว้างของภาพไฟล์ "{name}" ต้องมีอย่างน้อย {size} px.', 44 | msgImageHeightSmall: 'ความสูงของภาพไฟล์ "{name}" ต้องมีอย่างน้อย {size} px.', 45 | msgImageWidthLarge: 'ความกว้างของภาพไฟล์ "{name}" ไม่เกิน {size} พิกเซล.', 46 | msgImageHeightLarge: 'ความสูงของไฟล์ภาพ "{name}" ไม่เกิน {size} พิกเซล.', 47 | msgImageResizeError: 'ไม่สามารถรับขนาดภาพเพื่อปรับขนาด', 48 | msgImageResizeException: 'ข้อผิดพลาดขณะปรับขนาดภาพ
{errors}
', 49 | dropZoneTitle: 'Drag & drop ไฟล์ตรงนี้ …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'ลบไฟล์', 53 | uploadTitle: 'อัปโหลดไฟล์', 54 | zoomTitle: 'ดูรายละเอียด', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'ยังไม่ได้อัปโหลด', 57 | indicatorSuccessTitle: 'อัพโหลด', 58 | indicatorErrorTitle: 'อัปโหลดข้อผิดพลาด', 59 | indicatorLoadingTitle: 'อัพโหลด ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/locales/tr.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Turkish Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * 9 | * NOTE: this file must be saved in UTF-8 encoding. 10 | */ 11 | (function ($) { 12 | "use strict"; 13 | 14 | $.fn.fileinputLocales['tr'] = { 15 | fileSingle: 'dosya', 16 | filePlural: 'dosyalar', 17 | browseLabel: 'Gözat …', 18 | removeLabel: 'Sil', 19 | removeTitle: 'Seçilen dosyaları sil', 20 | cancelLabel: 'İptal', 21 | cancelTitle: 'Devam eden yüklemeyi iptal et', 22 | uploadLabel: 'Yükle', 23 | uploadTitle: 'Seçilen dosyaları yükle', 24 | msgNo: 'Hayır', 25 | msgCancelled: 'Iptal edildi', 26 | msgZoomModalHeading: 'Detaylı Önizleme', 27 | msgSizeTooLarge: '"{name}" dosyasının boyutu ({size} KB) izin verilen azami dosya boyutu olan {maxSize} KB\'tan büyük.', 28 | msgFilesTooLess: 'Yüklemek için en az {n} {files} dosya seçmelisiniz.', 29 | msgFilesTooMany: 'Yüklemek için seçtiğiniz dosya sayısı ({n}) azami limitin ({m}) altında olmalıdır.', 30 | msgFileNotFound: '"{name}" dosyası bulunamadı!', 31 | msgFileSecured: 'Güvenlik kısıtlamaları "{name}" dosyasının okunmasını engelliyor.', 32 | msgFileNotReadable: '"{name}" dosyası okunabilir değil.', 33 | msgFilePreviewAborted: '"{name}" dosyası için önizleme iptal edildi.', 34 | msgFilePreviewError: '"{name}" dosyası okunurken bir hata oluştu.', 35 | msgInvalidFileType: '"{name}" dosyasının türü geçerli değil. Yalnızca "{types}" türünde dosyalara izin veriliyor.', 36 | msgInvalidFileExtension: '"{name}" dosyasının uzantısı geçersiz. Yalnızca "{extensions}" uzantılı dosyalara izin veriliyor.', 37 | msgUploadAborted: 'Dosya yükleme iptal edildi', 38 | msgValidationError: 'Doğrulama Hatası', 39 | msgLoading: 'Dosya yükleniyor {index} / {files} …', 40 | msgProgress: 'Dosya yükleniyor {index} / {files} - {name} - %{percent} tamamlandı.', 41 | msgSelected: '{n} {files} seçildi', 42 | msgFoldersNotAllowed: 'Yalnızca dosyaları sürükleyip bırakabilirsiniz! {n} dizin(ler) göz ardı edildi.', 43 | msgImageWidthSmall: '"{name}" adlı görüntü dosyasının genişliği en az {size} piksel olmalıdır.', 44 | msgImageHeightSmall: '"{name}" adlı görüntü dosyasının yüksekliği en az {size} piksel olmalıdır.', 45 | msgImageWidthLarge: '"{name}" adlı görüntü dosyasının genişliği {size} pikseli geçemez.', 46 | msgImageHeightLarge: '"{name}" adlı görüntü dosyasının yüksekliği {size} pikseli geçemez.', 47 | msgImageResizeError: 'Görüntü boyutlarını yeniden boyutlandırmak için alınamadı.', 48 | msgImageResizeException: 'Görsel boyutlandırma sırasında hata.
{errors}
', 49 | dropZoneTitle: 'Dosyaları buraya sürükleyip bırakın …', 50 | dropZoneClickTitle: '
(or click to select {files})', 51 | fileActionSettings: { 52 | removeTitle: 'Dosyayı kaldır', 53 | uploadTitle: 'Dosyayı yükle', 54 | zoomTitle: 'Ayrıntıları görüntüle', 55 | dragTitle: 'Move / Rearrange', 56 | indicatorNewTitle: 'Henüz yüklenemedi', 57 | indicatorSuccessTitle: 'Yüklendi', 58 | indicatorErrorTitle: 'Yükleme Hatası', 59 | indicatorLoadingTitle: 'Yükleniyor ...' 60 | }, 61 | previewZoomButtonTitles: { 62 | prev: 'View previous file', 63 | next: 'View next file', 64 | toggleheader: 'Toggle header', 65 | fullscreen: 'Toggle full screen', 66 | borderless: 'Toggle borderless mode', 67 | close: 'Close detailed preview' 68 | } 69 | }; 70 | })(window.jQuery); 71 | -------------------------------------------------------------------------------- /public/js/locales/uk.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Ukrainian Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author CyanoFresh 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['uk'] = { 16 | fileSingle: 'файл', 17 | filePlural: 'файли', 18 | browseLabel: 'Вибрати …', 19 | removeLabel: 'Видалити', 20 | removeTitle: 'Видалити вибрані файли', 21 | cancelLabel: 'Скасувати', 22 | cancelTitle: 'Скасувати поточну загрузку', 23 | uploadLabel: 'Загрузити', 24 | uploadTitle: 'Загрузити вибрані файли', 25 | msgNo: 'Немає', 26 | msgCancelled: 'Cкасовано', 27 | msgZoomModalHeading: 'Детальний превью', 28 | msgSizeTooLarge: 'Файл "{name}" ({size} KB) перевищує максимальний розмір {maxSize} KB.', 29 | msgFilesTooLess: 'Ви повинні вибрати як мінімум {n} {files} для загрузки.', 30 | msgFilesTooMany: 'Кількість вибраних файлів ({n}) перевищує максимально допустиму кількість {m}.', 31 | msgFileNotFound: 'Файл "{name}" не знайдено!', 32 | msgFileSecured: 'Обмеження безпеки перешкоджають читанню файла "{name}".', 33 | msgFileNotReadable: 'Файл "{name}" неможливо прочитати.', 34 | msgFilePreviewAborted: 'Перегляд скасований для файла "{name}".', 35 | msgFilePreviewError: 'Сталася помилка під час читання файла "{name}".', 36 | msgInvalidFileType: 'Заборонений тип файла для "{name}". Тільки "{types}" дозволені.', 37 | msgInvalidFileExtension: 'Заборонене розширення для файла "{name}". Тільки "{extensions}" дозволені.', 38 | msgUploadAborted: 'Вивантаження файлу перервана', 39 | msgValidationError: 'Помилка перевірки', 40 | msgLoading: 'Загрузка файла {index} із {files} …', 41 | msgProgress: 'Загрузка файла {index} із {files} - {name} - {percent}% завершено.', 42 | msgSelected: '{n} {files} вибрано', 43 | msgFoldersNotAllowed: 'Дозволено перетягувати тільки файли! Пропущено {n} папок.', 44 | msgImageWidthSmall: 'Ширина зображення "{name}" повинна бути не менше {size} px.', 45 | msgImageHeightSmall: 'Висота зображення "{name}" повинна бути не менше {size} px.', 46 | msgImageWidthLarge: 'Ширина зображення "{name}" не може перевищувати {size} px.', 47 | msgImageHeightLarge: 'Висота зображення "{name}" не може перевищувати {size} px.', 48 | msgImageResizeError: 'Не вдалося розміри зображення, щоб змінити розмір.', 49 | msgImageResizeException: 'Помилка при зміні розміру зображення.
{errors}
', 50 | dropZoneTitle: 'Перетягніть файли сюди …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: 'Видалити файл', 54 | uploadTitle: 'Загрузити файл', 55 | zoomTitle: 'Подивитися деталі', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: 'Ще не загружено', 58 | indicatorSuccessTitle: 'Загружено', 59 | indicatorErrorTitle: 'Помилка при загрузці', 60 | indicatorLoadingTitle: 'Загрузка ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); 72 | -------------------------------------------------------------------------------- /public/js/locales/zh-TW.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Chinese Traditional Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author kangqf 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['zh-TW'] = { 16 | fileSingle: '單一檔案', 17 | filePlural: '複選檔案', 18 | browseLabel: '瀏覽 …', 19 | removeLabel: '移除', 20 | removeTitle: '清除選取檔案', 21 | cancelLabel: '取消', 22 | cancelTitle: '取消上傳中檔案', 23 | uploadLabel: '上傳', 24 | uploadTitle: '上傳選取檔案', 25 | msgNo: '沒有', 26 | msgCancelled: '取消', 27 | zoomTitle: '詳細資料', 28 | msgZoomModalHeading: '內容預覽', 29 | msgSizeTooLarge: '檔案 "{name}" ({size} KB) 大小超過上限 {maxSize} KB.', 30 | msgFilesTooLess: '最少必須選擇 {n} {files} 來上傳. ', 31 | msgFilesTooMany: '上傳的檔案數量 ({n}) 超過最大檔案上傳限制 {m}.', 32 | msgFileNotFound: '檔案 "{name}" 未發現!', 33 | msgFileSecured: '安全限制,禁止讀取檔案 "{name}".', 34 | msgFileNotReadable: '文件 "{name}" 不可讀取.', 35 | msgFilePreviewAborted: '檔案 "{name}" 預覽中止.', 36 | msgFilePreviewError: '讀取 "{name}" 發生錯誤.', 37 | msgInvalidFileType: '檔案類型錯誤 "{name}". 只能使用 "{types}" 類型的檔案.', 38 | msgInvalidFileExtension: '附檔名錯誤 "{name}". 只能使用 "{extensions}" 的檔案.', 39 | msgUploadAborted: '該文件上傳被中止', 40 | msgValidationError: '驗證錯誤', 41 | msgLoading: '載入第 {index} 個檔案,共 {files} …', 42 | msgProgress: '載入第 {index} 個檔案,共 {files} - {name} - {percent}% 成功.', 43 | msgSelected: '{n} {files} 選取', 44 | msgFoldersNotAllowed: '只支援單檔拖曳! 無法使用 {n} 拖拽的資料夹.', 45 | msgImageWidthSmall: '圖檔寬度"{name}"必須至少為{size}像素(px).', 46 | msgImageHeightSmall: '圖檔高度"{name}"必須至少為{size}像素(px).', 47 | msgImageWidthLarge: '圖檔寬度"{name}"不能超過{size}像素(px).', 48 | msgImageHeightLarge: '圖檔高度"{name}"不能超過{size}像素(px).', 49 | msgImageResizeError: '無法獲取的圖像尺寸調整。', 50 | msgImageResizeException: '錯誤而調整圖像大小。
{errors}
', 51 | dropZoneTitle: '拖曳檔案至此 …', 52 | dropZoneClickTitle: '
(or click to select {files})', 53 | fileActionSettings: { 54 | removeTitle: '刪除檔案', 55 | uploadTitle: '上傳檔案', 56 | zoomTitle: '詳細資料', 57 | dragTitle: 'Move / Rearrange', 58 | indicatorNewTitle: '尚未上傳', 59 | indicatorSuccessTitle: '上傳成功', 60 | indicatorErrorTitle: '上傳失敗', 61 | indicatorLoadingTitle: '上傳中 ...' 62 | }, 63 | previewZoomButtonTitles: { 64 | prev: 'View previous file', 65 | next: 'View next file', 66 | toggleheader: 'Toggle header', 67 | fullscreen: 'Toggle full screen', 68 | borderless: 'Toggle borderless mode', 69 | close: 'Close detailed preview' 70 | } 71 | }; 72 | })(window.jQuery); 73 | -------------------------------------------------------------------------------- /public/js/locales/zh.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * FileInput Chinese Translations 3 | * 4 | * This file must be loaded after 'fileinput.js'. Patterns in braces '{}', or 5 | * any HTML markup tags in the messages must not be converted or translated. 6 | * 7 | * @see http://github.com/kartik-v/bootstrap-fileinput 8 | * @author kangqf 9 | * 10 | * NOTE: this file must be saved in UTF-8 encoding. 11 | */ 12 | (function ($) { 13 | "use strict"; 14 | 15 | $.fn.fileinputLocales['zh'] = { 16 | fileSingle: '文件', 17 | filePlural: '多个文件', 18 | browseLabel: '选择 …', 19 | removeLabel: '移除', 20 | removeTitle: '清除选中文件', 21 | cancelLabel: '取消', 22 | cancelTitle: '取消进行中的上传', 23 | uploadLabel: '上传', 24 | uploadTitle: '上传选中文件', 25 | msgNo: '没有', 26 | msgCancelled: '取消', 27 | msgZoomModalHeading: '详细预览', 28 | msgSizeTooLarge: '文件 "{name}" ({size} KB) 超过了允许大小 {maxSize} KB.', 29 | msgFilesTooLess: '你必须选择最少 {n} {files} 来上传. ', 30 | msgFilesTooMany: '选择的上传文件个数 ({n}) 超出最大文件的限制个数 {m}.', 31 | msgFileNotFound: '文件 "{name}" 未找到!', 32 | msgFileSecured: '安全限制,为了防止读取文件 "{name}".', 33 | msgFileNotReadable: '文件 "{name}" 不可读.', 34 | msgFilePreviewAborted: '取消 "{name}" 的预览.', 35 | msgFilePreviewError: '读取 "{name}" 时出现了一个错误.', 36 | msgInvalidFileType: '不正确的类型 "{name}". 只支持 "{types}" 类型的文件.', 37 | msgInvalidFileExtension: '不正确的文件扩展名 "{name}". 只支持 "{extensions}" 的文件扩展名.', 38 | msgUploadAborted: '该文件上传被中止', 39 | msgValidationError: '验证错误', 40 | msgLoading: '加载第 {index} 文件 共 {files} …', 41 | msgProgress: '加载第 {index} 文件 共 {files} - {name} - {percent}% 完成.', 42 | msgSelected: '{n} {files} 选中', 43 | msgFoldersNotAllowed: '只支持拖拽文件! 跳过 {n} 拖拽的文件夹.', 44 | msgImageWidthSmall: '宽度的图像文件的"{name}"的必须是至少{size}像素.', 45 | msgImageHeightSmall: '图像文件的"{name}"的高度必须至少为{size}像素.', 46 | msgImageWidthLarge: '宽度的图像文件"{name}"不能超过{size}像素.', 47 | msgImageHeightLarge: '图像文件"{name}"的高度不能超过{size}像素.', 48 | msgImageResizeError: '无法获取的图像尺寸调整。', 49 | msgImageResizeException: '错误而调整图像大小。
{errors}
', 50 | dropZoneTitle: '拖拽文件到这里 …', 51 | dropZoneClickTitle: '
(or click to select {files})', 52 | fileActionSettings: { 53 | removeTitle: '删除文件', 54 | uploadTitle: '上传文件', 55 | zoomTitle: '查看详情', 56 | dragTitle: 'Move / Rearrange', 57 | indicatorNewTitle: '没有上传', 58 | indicatorSuccessTitle: '上传', 59 | indicatorErrorTitle: '上传错误', 60 | indicatorLoadingTitle: '上传 ...' 61 | }, 62 | previewZoomButtonTitles: { 63 | prev: 'View previous file', 64 | next: 'View next file', 65 | toggleheader: 'Toggle header', 66 | fullscreen: 'Toggle full screen', 67 | borderless: 'Toggle borderless mode', 68 | close: 'Close detailed preview' 69 | } 70 | }; 71 | })(window.jQuery); -------------------------------------------------------------------------------- /public/js/plugins/canvas-to-blob.js: -------------------------------------------------------------------------------- 1 | /* 2 | * JavaScript Canvas to Blob 2.0.5 3 | * https://github.com/blueimp/JavaScript-Canvas-to-Blob 4 | * 5 | * Copyright 2012, Sebastian Tschan 6 | * https://blueimp.net 7 | * 8 | * Licensed under the MIT license: 9 | * http://www.opensource.org/licenses/MIT 10 | * 11 | * Based on stackoverflow user Stoive's code snippet: 12 | * http://stackoverflow.com/q/4998908 13 | */ 14 | 15 | /*jslint nomen: true, regexp: true */ 16 | /*global window, atob, Blob, ArrayBuffer, Uint8Array, define */ 17 | 18 | (function (window) { 19 | 'use strict'; 20 | var CanvasPrototype = window.HTMLCanvasElement && 21 | window.HTMLCanvasElement.prototype, 22 | hasBlobConstructor = window.Blob && (function () { 23 | try { 24 | return Boolean(new Blob()); 25 | } catch (e) { 26 | return false; 27 | } 28 | }()), 29 | hasArrayBufferViewSupport = hasBlobConstructor && window.Uint8Array && 30 | (function () { 31 | try { 32 | return new Blob([new Uint8Array(100)]).size === 100; 33 | } catch (e) { 34 | return false; 35 | } 36 | }()), 37 | BlobBuilder = window.BlobBuilder || window.WebKitBlobBuilder || 38 | window.MozBlobBuilder || window.MSBlobBuilder, 39 | dataURLtoBlob = (hasBlobConstructor || BlobBuilder) && window.atob && 40 | window.ArrayBuffer && window.Uint8Array && function (dataURI) { 41 | var byteString, 42 | arrayBuffer, 43 | intArray, 44 | i, 45 | mimeString, 46 | bb; 47 | if (dataURI.split(',')[0].indexOf('base64') >= 0) { 48 | // Convert base64 to raw binary data held in a string: 49 | byteString = atob(dataURI.split(',')[1]); 50 | } else { 51 | // Convert base64/URLEncoded data component to raw binary data: 52 | byteString = decodeURIComponent(dataURI.split(',')[1]); 53 | } 54 | // Write the bytes of the string to an ArrayBuffer: 55 | arrayBuffer = new ArrayBuffer(byteString.length); 56 | intArray = new Uint8Array(arrayBuffer); 57 | for (i = 0; i < byteString.length; i += 1) { 58 | intArray[i] = byteString.charCodeAt(i); 59 | } 60 | // Separate out the mime component: 61 | mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; 62 | // Write the ArrayBuffer (or ArrayBufferView) to a blob: 63 | if (hasBlobConstructor) { 64 | return new Blob( 65 | [hasArrayBufferViewSupport ? intArray : arrayBuffer], 66 | {type: mimeString} 67 | ); 68 | } 69 | bb = new BlobBuilder(); 70 | bb.append(arrayBuffer); 71 | return bb.getBlob(mimeString); 72 | }; 73 | if (window.HTMLCanvasElement && !CanvasPrototype.toBlob) { 74 | if (CanvasPrototype.mozGetAsFile) { 75 | CanvasPrototype.toBlob = function (callback, type, quality) { 76 | if (quality && CanvasPrototype.toDataURL && dataURLtoBlob) { 77 | callback(dataURLtoBlob(this.toDataURL(type, quality))); 78 | } else { 79 | callback(this.mozGetAsFile('blob', type)); 80 | } 81 | }; 82 | } else if (CanvasPrototype.toDataURL && dataURLtoBlob) { 83 | CanvasPrototype.toBlob = function (callback, type, quality) { 84 | callback(dataURLtoBlob(this.toDataURL(type, quality))); 85 | }; 86 | } 87 | } 88 | if (typeof define === 'function' && define.amd) { 89 | define(function () { 90 | return dataURLtoBlob; 91 | }); 92 | } else { 93 | window.dataURLtoBlob = dataURLtoBlob; 94 | } 95 | }(window)); 96 | -------------------------------------------------------------------------------- /public/js/plugins/canvas-to-blob.min.js: -------------------------------------------------------------------------------- 1 | !function(a){"use strict";var b=a.HTMLCanvasElement&&a.HTMLCanvasElement.prototype,c=a.Blob&&function(){try{return Boolean(new Blob)}catch(a){return!1}}(),d=c&&a.Uint8Array&&function(){try{return 100===new Blob([new Uint8Array(100)]).size}catch(a){return!1}}(),e=a.BlobBuilder||a.WebKitBlobBuilder||a.MozBlobBuilder||a.MSBlobBuilder,f=(c||e)&&a.atob&&a.ArrayBuffer&&a.Uint8Array&&function(a){var b,f,g,h,i,j;for(b=a.split(",")[0].indexOf("base64")>=0?atob(a.split(",")[1]):decodeURIComponent(a.split(",")[1]),f=new ArrayBuffer(b.length),g=new Uint8Array(f),h=0;h', 19 | uploadIcon: '', 20 | zoomIcon: '', 21 | dragIcon: '', 22 | indicatorNew: '', 23 | indicatorSuccess: '', 24 | indicatorError: '', 25 | indicatorLoading: '' 26 | }, 27 | layoutTemplates: { 28 | fileIcon: ' ' 29 | }, 30 | previewZoomButtonIcons: { 31 | prev: '', 32 | next: '', 33 | toggleheader: '', 34 | fullscreen: '', 35 | borderless: '', 36 | close: '' 37 | }, 38 | previewFileIcon: '', 39 | browseIcon: '', 40 | removeIcon: '', 41 | cancelIcon: '', 42 | uploadIcon: '', 43 | msgValidationErrorIcon: ' ' 44 | }; 45 | })(window.jQuery); 46 | -------------------------------------------------------------------------------- /public/themes/gly/gly.js: -------------------------------------------------------------------------------- 1 | /*! 2 | * bootstrap-fileinput v4.3.3 3 | * http://plugins.krajee.com/file-input 4 | * 5 | * Glyphicon (default) theme configuration for bootstrap-fileinput. 6 | * 7 | * Author: Kartik Visweswaran 8 | * Copyright: 2014 - 2016, Kartik Visweswaran, Krajee.com 9 | * 10 | * Licensed under the BSD 3-Clause 11 | * https://github.com/kartik-v/bootstrap-fileinput/blob/master/LICENSE.md 12 | */ 13 | (function ($) { 14 | "use strict"; 15 | 16 | $.fn.fileinputThemes.gly = { 17 | fileActionSettings: { 18 | removeIcon: '', 19 | uploadIcon: '', 20 | zoomIcon: '', 21 | dragIcon: '', 22 | indicatorNew: '', 23 | indicatorSuccess: '', 24 | indicatorError: '', 25 | indicatorLoading: '' 26 | }, 27 | layoutTemplates: { 28 | fileIcon: '' 29 | }, 30 | previewZoomButtonIcons: { 31 | prev: '', 32 | next: '', 33 | toggleheader: '', 34 | fullscreen: '', 35 | borderless: '', 36 | close: '' 37 | }, 38 | previewFileIcon: '', 39 | browseIcon: ' ', 40 | removeIcon: '', 41 | cancelIcon: '', 42 | uploadIcon: '', 43 | msgValidationErrorIcon: ' ' 44 | }; 45 | })(window.jQuery); 46 | -------------------------------------------------------------------------------- /scripts/color_relief.txt: -------------------------------------------------------------------------------- 1 | 0% 255 0 255 2 | 10% 128 0 255 3 | 20% 0 0 255 4 | 30% 0 128 255 5 | 40% 0 255 255 6 | 50% 0 255 128 7 | 60% 0 255 0 8 | 70% 128 255 0 9 | 80% 255 255 0 10 | 90% 255 128 0 11 | 100% 255 0 0 12 | nv 0 0 0 0 -------------------------------------------------------------------------------- /scripts/postprocess.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | 3 | # This file executes the post-processing steps for a task after a dataset 4 | # has been processed by OpenDroneMap. It generates secondary outputs. 5 | # 6 | # As a general rule, post-processing commands should never fail the task 7 | #(for example, if a point cloud could not be generated, the PotreeConverter 8 | # step will fail, but the script should still continue processing the rest and 9 | # return a 0 code). The idea is to post-process as much as possible, knowing 10 | # that some parts might fail and that partial results should be returned in such cases. 11 | 12 | if [ -z "$1" ]; then 13 | echo "Usage: $0 " 14 | exit 0 15 | fi 16 | 17 | # Switch to project path folder (data//) 18 | script_path=$(realpath $(dirname "$0")) 19 | cd "$script_path/../$1" 20 | echo "Postprocessing: $(pwd)" 21 | 22 | # Generate colored shaded relief for DTM/DSM files if available 23 | dem_products=() 24 | if [ -e "odm_dem/dsm.tif" ]; then dem_products=(${dem_products[@]} dsm); fi 25 | if [ -e "odm_dem/dtm.tif" ]; then dem_products=(${dem_products[@]} dtm); fi 26 | 27 | if hash gdaldem 2>/dev/null; then 28 | for dem_product in ${dem_products[@]}; do 29 | dem_path="odm_dem/""$dem_product"".tif" 30 | 31 | gdaldem color-relief $dem_path $script_path/color_relief.txt "odm_dem/""$dem_product""_colored.tif" -alpha -co ALPHA=YES 32 | gdaldem hillshade $dem_path "odm_dem/""$dem_product""_hillshade.tif" -z 1.0 -s 1.0 -az 315.0 -alt 45.0 33 | python "$script_path/hsv_merge.py" "odm_dem/""$dem_product""_colored.tif" "odm_dem/""$dem_product""_hillshade.tif" "odm_dem/""$dem_product""_colored_hillshade.tif" 34 | done 35 | else 36 | echo "gdaldem is not installed, will skip colored hillshade generation" 37 | fi 38 | 39 | # Generate Tiles 40 | g2t_options="--processes $(nproc) -z 12-21 -n -w none" 41 | orthophoto_path="odm_orthophoto/odm_orthophoto.tif" 42 | 43 | if [ -e "$orthophoto_path" ]; then 44 | python "$script_path/gdal2tiles.py" $g2t_options $orthophoto_path orthophoto_tiles 45 | else 46 | echo "No orthophoto found at $orthophoto_path: will skip tiling" 47 | fi 48 | 49 | for dem_product in ${dem_products[@]}; do 50 | colored_dem_path="odm_dem/""$dem_product""_colored_hillshade.tif" 51 | if [ -e "$colored_dem_path" ]; then 52 | python "$script_path/gdal2tiles.py" $g2t_options $colored_dem_path "$dem_product""_tiles" 53 | else 54 | echo "No $dem_product found at $colored_dem_path: will skip tiling" 55 | fi 56 | done 57 | 58 | # Generate MBTiles 59 | if hash gdal_translate 2>/dev/null; then 60 | orthophoto_path="odm_orthophoto/odm_orthophoto.tif" 61 | orthophoto_mbtiles_path="odm_orthophoto/odm_orthophoto.mbtiles" 62 | 63 | if [ -e "$orthophoto_path" ]; then 64 | gdal_translate $orthophoto_path $orthophoto_mbtiles_path -of MBTILES 65 | gdaladdo -r bilinear $orthophoto_mbtiles_path 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 66 | else 67 | echo "No orthophoto found at $orthophoto_path: will skip MBTiles generation" 68 | fi 69 | else 70 | echo "gdal_translate is not installed, will skip MBTiles generation" 71 | fi 72 | 73 | #Generate laz point cloud 74 | pointcloud_input="odm_georeferencing/odm_georeferenced_model.ply" 75 | pointcloud_output="odm_georeferencing/odm_georeferenced_model.laz" 76 | pdal translate -i "$pointcloud_input" "$pointcloud_output" 77 | 78 | # Generate point cloud (if entwine is available) 79 | pointcloud_input_path="" 80 | for path in "odm_georeferencing/odm_georeferenced_model.laz" \ 81 | "odm_georeferencing/odm_georeferenced_model.las" \ 82 | "odm_georeferencing/odm_georeferenced_model.ply" \ 83 | "odm_filterpoints/point_cloud.ply"; do 84 | if [ -e $path ]; then 85 | echo "Found point cloud: $path" 86 | pointcloud_input_path=$path 87 | break 88 | fi 89 | done 90 | 91 | # Never generate point cloud tiles with split-merge workflows 92 | if [ -e "submodels" ] && [ -e "entwine_pointcloud" ]; then 93 | pointcloud_input_path="" 94 | echo "Split-merge dataset with point cloud detected. No need to regenerate point cloud tiles." 95 | fi 96 | 97 | if [ ! -z "$pointcloud_input_path" ]; then 98 | # Copy the failsafe PLY point cloud to odm_georeferencing 99 | # if necessary, otherwise it will not get zipped 100 | if [ "$pointcloud_input_path" == "odm_filterpoints/point_cloud.ply" ] || [ "$pointcloud_input_path" == "opensfm/depthmaps/merged.ply" ] || [ "$pointcloud_input_path" == "pmvs/recon0/models/option-0000.ply" ]; then 101 | echo "Copying $pointcloud_input_path to odm_georeferencing/odm_georeferenced_model.ply, even though it's not georeferenced..." 102 | cp $pointcloud_input_path "odm_georeferencing/odm_georeferenced_model.ply" 103 | fi 104 | 105 | if hash entwine 2>/dev/null; then 106 | # Optionally cleanup previous results (from a restart) 107 | if [ -e "entwine_pointcloud" ]; then 108 | rm -fr "entwine_pointcloud" 109 | fi 110 | 111 | #extract srs and add as option to entwine 112 | 113 | srs=`grep -oPm1 "(?<=)[^<]+" < images/SysUTM.xml` 114 | 115 | entwine build --srs "$srs" --threads $(nproc) --tmp "entwine_pointcloud-tmp" -i "$pointcloud_input_path" -o entwine_pointcloud 116 | 117 | # Cleanup 118 | if [ -e "entwine_pointcloud-tmp" ]; then 119 | rm -fr "entwine_pointcloud-tmp" 120 | fi 121 | else 122 | echo "Entwine is not installed, checking if PotreeConverter is available instead..." 123 | if hash PotreeConverter 2>/dev/null; then 124 | PotreeConverter "$pointcloud_input_path" -o potree_pointcloud --overwrite -a RGB CLASSIFICATION 125 | else 126 | echo "PotreeConverter is also not installed, will skip generation of Potree point cloud" 127 | fi 128 | fi 129 | else 130 | echo "Point cloud tiles will not be generated" 131 | fi 132 | 133 | 134 | echo "Postprocessing: done (•̀ᴗ•́)و!" 135 | exit 0 136 | -------------------------------------------------------------------------------- /services/nodeodm.service: -------------------------------------------------------------------------------- 1 | [Unit] 2 | Description=Start node-ODM Service Container 3 | 4 | [Service] 5 | Type=simple 6 | PIDFile=/run/nodeodm.pid 7 | User=odm 8 | Group=odm 9 | WorkingDirectory=/www 10 | ExecStart=/usr/bin/node index.js 11 | ExecStop=/bin/kill -s QUIT $MAINPID 12 | Restart=on-failure 13 | 14 | [Install] 15 | WantedBy=multi-user.target 16 | 17 | -------------------------------------------------------------------------------- /tests/data/.gitignore: -------------------------------------------------------------------------------- 1 | * -------------------------------------------------------------------------------- /tests/gdal2tiles_output.txt: -------------------------------------------------------------------------------- 1 | Generating Base Tiles: 2 | 0...10...20...30...40...50...60...70...80...90...100 - done. 3 | Generating Overview Tiles: 4 | 0...10...20...30...40...50...60...70...80...90...100 - done. 5 | -------------------------------------------------------------------------------- /tests/potree_output.txt: -------------------------------------------------------------------------------- 1 | == params == 2 | source[0]: /home/user/file.las 3 | outdir: /home/user/output 4 | spacing: 0 5 | diagonal-fraction: 250 6 | levels: -1 7 | format: 8 | scale: 0 9 | pageName: 10 | output-format: BINARY 11 | 12 | AABB: 13 | min: [319,738, 3.0939e+06, -45.3844] 14 | max: [319,831, 3.09405e+06, 11.8638] 15 | size: [92.2953, 145.944, 57.2482] 16 | 17 | cubic AABB: 18 | min: [319,738, 3.0939e+06, -45.3844] 19 | max: [319,884, 3.09405e+06, 100.56] 20 | size: [145.944, 145.944, 145.944] 21 | 22 | spacing calculated from diagonal: 1.01113 23 | READING: /home/user/file.las 24 | closing writer 25 | 26 | conversion finished 27 | 268,568 points were processed and 268,568 points ( 100% ) were written to the output. 28 | duration: 0.267s 29 | -------------------------------------------------------------------------------- /tests/processing_results/all.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/all.zip -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/16/16020/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/16/16020/42443.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/16/16021/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/16/16021/42443.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/17/32041/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/17/32041/84886.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/17/32042/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/17/32042/84886.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/18/64083/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/18/64083/169772.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/18/64083/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/18/64083/169773.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/18/64084/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/18/64084/169772.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/18/64084/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dsm_tiles/18/64084/169773.png -------------------------------------------------------------------------------- /tests/processing_results/dsm_tiles/tilemapresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | odm_orthophoto.tif 4 | 5 | EPSG:900913 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/16/16020/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/16/16020/42443.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/16/16021/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/16/16021/42443.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/17/32041/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/17/32041/84886.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/17/32042/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/17/32042/84886.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/18/64083/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/18/64083/169772.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/18/64083/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/18/64083/169773.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/18/64084/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/18/64084/169772.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/18/64084/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/dtm_tiles/18/64084/169773.png -------------------------------------------------------------------------------- /tests/processing_results/dtm_tiles/tilemapresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | odm_orthophoto.tif 4 | 5 | EPSG:900913 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/processing_results/images.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "altitude": 198.609, 4 | "camera_make": "DJI", 5 | "camera_model": "FC300S", 6 | "ccd_width": 6.16, 7 | "filename": "DJI_0028.JPG", 8 | "focal_length": 3.61, 9 | "focal_length_px": 2344.155844155844, 10 | "height": 2250, 11 | "latitude": 46.842521250000004, 12 | "longitude": -91.99420961111112, 13 | "make_model": "dji fc300s", 14 | "path_file": "/datasets/brighton/images/DJI_0028.JPG", 15 | "width": 4000 16 | } 17 | ] -------------------------------------------------------------------------------- /tests/processing_results/odm_dem/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_dem/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/odm_dem/dsm.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_dem/dsm.tif -------------------------------------------------------------------------------- /tests/processing_results/odm_dem/dtm.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_dem/dtm.tif -------------------------------------------------------------------------------- /tests/processing_results/odm_georeferencing/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_georeferencing/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/odm_georeferencing/odm_georeferenced_model.csv: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_georeferencing/odm_georeferenced_model.csv -------------------------------------------------------------------------------- /tests/processing_results/odm_georeferencing/odm_georeferenced_model.las: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_georeferencing/odm_georeferenced_model.las -------------------------------------------------------------------------------- /tests/processing_results/odm_georeferencing/odm_georeferenced_model.laz: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_georeferencing/odm_georeferenced_model.laz -------------------------------------------------------------------------------- /tests/processing_results/odm_georeferencing/odm_georeferenced_model.ply: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_georeferencing/odm_georeferenced_model.ply -------------------------------------------------------------------------------- /tests/processing_results/odm_meshing/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_meshing/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/odm_orthophoto/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_orthophoto/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/odm_orthophoto/odm_orthophoto.mbtiles: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /tests/processing_results/odm_orthophoto/odm_orthophoto.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_orthophoto/odm_orthophoto.png -------------------------------------------------------------------------------- /tests/processing_results/odm_orthophoto/odm_orthophoto.tif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_orthophoto/odm_orthophoto.tif -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/non_visible_faces_texture.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/non_visible_faces_texture.jpg -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/odm_textured_model.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/odm_textured_model.obj -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/odm_textured_model_geo.mtl: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/odm_textured_model_geo.mtl -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/odm_textured_model_geo.obj: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/odm_textured_model_geo.obj -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/texture_0.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/texture_0.jpg -------------------------------------------------------------------------------- /tests/processing_results/odm_texturing/texture_1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/odm_texturing/texture_1.jpg -------------------------------------------------------------------------------- /tests/processing_results/opensfm/features/test.txt: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/opensfm/features/test.txt -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/.gitignore: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/.gitignore -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/16/16020/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/16/16020/42443.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/16/16021/42443.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/16/16021/42443.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/17/32041/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/17/32041/84886.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/17/32042/84886.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/17/32042/84886.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/18/64083/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/18/64083/169772.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/18/64083/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/18/64083/169773.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/18/64084/169772.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/18/64084/169772.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/18/64084/169773.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/orthophoto_tiles/18/64084/169773.png -------------------------------------------------------------------------------- /tests/processing_results/orthophoto_tiles/tilemapresource.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | odm_orthophoto.tif 4 | 5 | EPSG:900913 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /tests/processing_results/potree_pointcloud/cloud.js: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/OpenDroneMap/NodeMICMAC/001044c3b0c634cca601e08640537bd8d2c0b281/tests/processing_results/potree_pointcloud/cloud.js -------------------------------------------------------------------------------- /tmp/.gitignore: -------------------------------------------------------------------------------- 1 | * --------------------------------------------------------------------------------