Web view still in progress

This commit is contained in:
Claude Brisson
2023-11-05 13:51:01 +01:00
parent 5fdf3e8944
commit 5f068476dc
111 changed files with 8905 additions and 215 deletions

View File

@@ -68,6 +68,7 @@
</executions>
<configuration>
<outputFolder>${project.build.directory}/generated-resources/css</outputFolder>
<version>1.69.5</version>
</configuration>
</plugin>
<plugin>
@@ -88,6 +89,8 @@
<pairgoth.store.file.path>${pairgoth.store}</pairgoth.store.file.path>
<pairgoth.logger.level>${pairgoth.logger.level}</pairgoth.logger.level>
<pairgoth.logger.format>${pairgoth.logger.format}</pairgoth.logger.format>
<pairgoth.logger.level.org.jeudego.pairgoth.web.ApiServlet.api>debug</pairgoth.logger.level.org.jeudego.pairgoth.web.ApiServlet.api>
<org.slf4j.simpleLogger.defaultLogLevel>debug</org.slf4j.simpleLogger.defaultLogLevel>
</systemProperties>
<webApp>
<contextPath>${pairgoth.webapp.context}/</contextPath>
@@ -157,6 +160,12 @@
<version>${servlet.api.version}</version>
<scope>provided</scope>
</dependency>
<!-- proxy -->
<dependency>
<groupId>org.eclipse.jetty</groupId>
<artifactId>jetty-proxy</artifactId>
<version>${jetty.version}</version>
</dependency>
<dependency>
<groupId>com.sun.mail</groupId>
<artifactId>jakarta.mail</artifactId>

View File

@@ -10,9 +10,7 @@ import okhttp3.internal.EMPTY_REQUEST
class ApiTool {
companion object {
const val JSON = "application/json"
val apiRoot =
System.getProperty("pairgoth.api.external.url")?.let { "${it.removeSuffix("/")}/" }
?: System.getProperty("pairgoth.webapp.external.url")?.let { "${it.removeSuffix("/")}/api/" }
val apiRoot = System.getProperty("pairgoth.api.external.url")?.let { "${it.removeSuffix("/")}/" }
?: throw Error("no configured API url")
}
private val client = OkHttpClient()

View File

@@ -0,0 +1,239 @@
package org.jeudego.pairgoth.view
import org.apache.velocity.tools.config.ValidScope
import org.jeudego.pairgoth.web.WebappManager
import javax.servlet.http.HttpServletRequest
@ValidScope("request")
class CountriesTool {
public var country: Pair<String, String>? = null
public fun configure(params: Map<*, *>) {
val request = params["request"]!! as HttpServletRequest
country = request.getHeader("Accept-Language")?.let { header ->
langHeaderParser.find(header)
}?.let { match ->
match.groupValues.getOrNull(2)?.lowercase() ?: match.groupValues[1].lowercase()
}?.let { iso ->
countries[iso]?.let { name ->
Pair(iso, name)
}
}
}
public fun getCountries() = countries.entries
companion object {
private val langHeaderParser = Regex("(?:\\b(\\*|[a-z]{2})(?:(?:_|-)([a-z]{2}))?)(?:;q=([0-9.]+))?", RegexOption.IGNORE_CASE)
public val countries = mapOf(
"ad" to "Andorra",
"ae" to "United Arab Emirates",
"af" to "Afghanistan",
"ai" to "Anguilla",
"al" to "Albania",
"am" to "Armenia",
"ao" to "Angola",
"ar" to "Argentina",
"at" to "Austria",
"au" to "Australia",
"aw" to "Aruba",
"az" to "Azerbaijan",
"ba" to "Bosnia and Herzegovina",
"bb" to "Barbados",
"bd" to "Bangladesh",
"be" to "Belgium",
"bf" to "Burkina Faso",
"bg" to "Bulgaria",
"bh" to "Bahrain",
"bi" to "Burundi",
"bj" to "Benin",
"bl" to "Saint Barthélemy",
"bm" to "Bermuda",
"bo" to "Bolivia",
"br" to "Brazil",
"bs" to "Bahamas",
"bt" to "Bhutan",
"bw" to "Botswana",
"by" to "Belarus",
"bz" to "Belize",
"ca" to "Canada",
"cd" to "Dem. Rep. of the Congo",
"cf" to "Central African Republic",
"cg" to "Congo",
"ch" to "Switzerland",
"ci" to "Ivory Coast",
"cl" to "Chile",
"cm" to "Cameroon",
"cn" to "China",
"co" to "Colombia",
"cr" to "Costa Rica",
"cu" to "Cuba",
"cv" to "Cabo Verde",
"cw" to "Curaçao",
"cy" to "Cyprus",
"cz" to "Czechia",
"de" to "Germany",
"dj" to "Djibouti",
"dk" to "Denmark",
"dm" to "Dominica",
"do" to "Dominican Republic",
"dz" to "Algeria",
"ec" to "Ecuador",
"ee" to "Estonia",
"eg" to "Egypt",
"eh" to "Western Sahara*",
"er" to "Eritrea",
"es" to "Spain",
"et" to "Ethiopia",
"fi" to "Finland",
"fj" to "Fiji",
"fr" to "France",
"ga" to "Gabon",
"gb" to "United Kingdom",
"gd" to "Grenada",
"ge" to "Georgia",
"gg" to "Guernsey",
"gh" to "Ghana",
"gi" to "Gibraltar",
"gl" to "Greenland",
"gm" to "Gambia",
"gn" to "Guinea",
"gq" to "Equatorial Guinea",
"gr" to "Greece",
"gt" to "Guatemala",
"gu" to "Guam",
"gw" to "Guinea-Bissau",
"gy" to "Guyana",
"hk" to "Hong Kong",
"hn" to "Honduras",
"hr" to "Croatia",
"ht" to "Haiti",
"hu" to "Hungary",
"id" to "Indonesia",
"ie" to "Ireland",
"il" to "Israel",
"im" to "Isle of Man",
"in" to "India",
"iq" to "Iraq",
"ir" to "Iran",
"is" to "Iceland",
"it" to "Italy",
"je" to "Jersey",
"jm" to "Jamaica",
"jo" to "Jordan",
"jp" to "Japan",
"ke" to "Kenya",
"kg" to "Kyrgyzstan",
"kh" to "Cambodia",
"ki" to "Kiribati",
"km" to "Comoros",
"kp" to "North Korea",
"kr" to "South Korea",
"kw" to "Kuwait",
"kz" to "Kazakhstan",
"la" to "Lao People's Dem. Rep.",
"lb" to "Lebanon",
"li" to "Liechtenstein",
"lk" to "Sri Lanka",
"lr" to "Liberia",
"ls" to "Lesotho",
"lt" to "Lithuania",
"lu" to "Luxembourg",
"lv" to "Latvia",
"ly" to "Libya",
"ma" to "Morocco",
"mc" to "Monaco",
"md" to "Moldova",
"me" to "Montenegro",
"mg" to "Madagascar",
"mk" to "Macedonia",
"ml" to "Mali",
"mm" to "Myanmar",
"mn" to "Mongolia",
"mo" to "Macao",
"mq" to "Martinique",
"mr" to "Mauritania",
"ms" to "Montserrat",
"mt" to "Malta",
"mu" to "Mauritius",
"mv" to "Maldives",
"mw" to "Malawi",
"mx" to "Mexico",
"my" to "Malaysia",
"mz" to "Mozambique",
"na" to "Namibia",
"nc" to "New Caledonia",
"ne" to "Niger",
"ng" to "Nigeria",
"ni" to "Nicaragua",
"nl" to "The Netherlands",
"no" to "Norway",
"np" to "Nepal",
"nr" to "Nauru",
"nu" to "Niue",
"nz" to "New Zealand",
"om" to "Oman",
"pa" to "Panama",
"pe" to "Peru",
"pf" to "French Polynesia",
"pg" to "Papua New Guinea",
"ph" to "The Philippines",
"pk" to "Pakistan",
"pl" to "Poland",
"pn" to "Pitcairn",
"pr" to "Puerto Rico",
"pt" to "Portugal",
"pw" to "Palau",
"py" to "Paraguay",
"qa" to "Qatar",
"re" to "Réunion",
"ro" to "Romania",
"rs" to "Serbia",
"ru" to "Russia",
"rw" to "Rwanda",
"sa" to "Saudi Arabia",
"sc" to "Seychelles",
"sd" to "Sudan",
"se" to "Sweden",
"sg" to "Singapore",
"si" to "Slovenia",
"sk" to "Slovakia",
"sl" to "Sierra Leone",
"sm" to "San Marino",
"sn" to "Senegal",
"so" to "Somalia",
"sr" to "Suriname",
"ss" to "South Sudan",
"sv" to "El Salvador",
"sy" to "Syrian Arab Republic",
"sz" to "Swaziland",
"td" to "Chad",
"tg" to "Togo",
"th" to "Thailand",
"tj" to "Tajikistan",
"tm" to "Turkmenistan",
"tn" to "Tunisia",
"to" to "Tonga",
"tr" to "Turkey",
"tv" to "Tuvalu",
"tw" to "Taiwan",
"tz" to "Tanzania",
"ua" to "Ukraine",
"ug" to "Uganda",
"us" to "United States of America",
"uy" to "Uruguay",
"uz" to "Uzbekistan",
"ve" to "Venezuela",
"vn" to "Viet Nam",
"vu" to "Vanuatu",
"ws" to "Samoa",
"xk" to "Kosovo",
"ye" to "Yemen",
"yt" to "Mayotte",
"za" to "South Africa",
"zm" to "Zambia",
"zw" to "Zimbabwe"
)
}
}

View File

@@ -0,0 +1,25 @@
package org.jeudego.pairgoth.web
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.proxy.AsyncProxyServlet;
import javax.servlet.http.HttpServletRequest
class ApiServlet : AsyncProxyServlet() {
override fun addProxyHeaders(clientRequest: HttpServletRequest, proxyRequest: Request) {
// proxyRequest.header("X-EGC-User", some user id...)
}
override fun rewriteTarget(clientRequest: HttpServletRequest): String {
val uri = clientRequest.requestURI
if (!uri.startsWith("/api/")) throw Error("unhandled API uri: $uri")
val path = uri.substringAfter("/api")
val qr = clientRequest.queryString?.let { "?$it" } ?: ""
return "$apiRoot$path$qr"
}
companion object {
private val apiRoot = System.getProperty("pairgoth.api.external.url")?.let { "${it.removeSuffix("/")}" }
?: throw Error("no configured API url")
}
}

View File

@@ -22,13 +22,18 @@ class LanguageFilter : Filter {
override fun doFilter(req: ServletRequest, resp: ServletResponse, chain: FilterChain) {
val request = req as HttpServletRequest
val response = resp as HttpServletResponse
val uri = request.requestURI
if (uri.startsWith("/api/")) {
chain.doFilter(request, response)
return
}
val reqLang = request.getAttribute("lang") as String?
if (reqLang != null) {
TranslationTool.translator.set(Translator.getTranslator(reqLang))
chain.doFilter(request, response)
} else {
val uri = request.requestURI
val match = langPattern.matchEntire(uri)
val lang = match?.groupValues?.get(1)
val target = match?.groupValues?.get(2) ?: uri
@@ -64,6 +69,6 @@ class LanguageFilter : Filter {
companion object {
private val langPattern = Regex("/([a-z]{2})(/.+)")
private val langHeaderParser = Regex("(?:\\b(\\*|[a-z]{2})(?:_\\w+)?)(?:;q=([0-9.]+))?")
private val langHeaderParser = Regex("(?:\\b(\\*|[a-z]{2})(?:(?:_|-)\\w+)?)(?:;q=([0-9.]+))?")
}
}

View File

@@ -5,6 +5,7 @@ import org.apache.velocity.context.Context
import org.apache.velocity.exception.ResourceNotFoundException
import org.apache.velocity.tools.view.ServletUtils
import org.apache.velocity.tools.view.VelocityViewServlet
import org.slf4j.LoggerFactory
import java.io.File
import java.io.UnsupportedEncodingException
import java.net.URLDecoder
@@ -95,7 +96,14 @@ class ViewServlet : VelocityViewServlet() {
}
override fun doRequest(request: HttpServletRequest, response: HttpServletResponse ) {
// val uri = request.requestURI
logger.logRequest(request) //, !uri.contains(".") && uri.length > 1)
super.doRequest(request, response)
}
companion object {
private var logger = LoggerFactory.getLogger("view")
private const val STANDARD_LAYOUT = "/WEB-INF/layouts/standard.html"
}
}

View File

@@ -53,6 +53,8 @@ class WebappManager : ServletContextListener, ServletContextAttributeListener, H
override fun contextInitialized(sce: ServletContextEvent) {
context = sce.servletContext
logger.info("---------- Starting $WEBAPP_NAME ----------")
logger.debug("debug level is active")
logger.trace("trace level is active")
webappRoot = context.getRealPath("/")
try {
// load default properties

View File

@@ -179,6 +179,7 @@
/* UI fixes */
.ui.form, .ui.segment, .ui.form .field > label { font-size: 1em; }
.ui.form .fields { }
span > input[type="radio"] { vertical-align: text-top; }
span > input[type="text"] { vertical-align: baseline; width: initial; }
span > input.date { vertical-align: baseline; width: 8em; }
@@ -190,10 +191,71 @@
.step:last-child { padding-right: 1em; }
.step .description { display: none; }
.ui.form input[type=text], .ui.form input[type="number"], .ui.form select {
padding: 0.4em 0.2em;
}
.ui.form input[type="number"], input.duration {
text-align: center;
}
input[type="number"] {
padding: 0.2em 0.1em 0.2em 1em;
vertical-align: baseline;
width: 3.5em;
}
.hidden {
display: none;
}
.roundbox {
border: solid 2px darkgray;
border-radius: 10px;
margin: 1em;
padding: 1em;
}
#backdrop {
display: none;
&.active {
display: block;
position: absolute;
top: 0;
left: 0;
width: 100vw;
height: 100vh;
z-index: 999;
background-color: rgba(0,0,0,0.2);
cursor: wait;
}
}
#backdrop.active {
}
#feedback {
position: absolute;
top: 1em;
left: 50%;
font-weight: bold;
}
#success, #error {
position: relative;
left: -50%;
border-radius: 10px;
padding: 0.5em 1em;
}
#success {
background: lightgreen;
border: solid 2px green;
color: green;
}
#error {
background: lightcoral;
border: solid 2px red;
color: red;
}
}

View File

View File

@@ -1,17 +1,33 @@
<!DOCTYPE html>
<html lang="en">
<html lang="${request.lang}">
<head>
<meta charset="UTF-8">
<title>Pairgoth</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="Pairgoth Go Paring Engine">
<link rel="icon" type="image/x-icon" href="/favicon.ico">
<link rel="stylesheet" href="/lib/fork-awesome-1.2.0/fork-awesome.min.css">
<link rel="stylesheet" href="/css/main.css">
<script type="text/javascript" src="/js/domhelper.js"></script>
<script type="text/javascript">
// #[[
let initFunctions = [];
function onLoad(fct) {
if (typeof(fct) == "function") initFunctions.push(fct);
}
document.addEventListener('DOMContentLoaded', () => {
initFunctions.forEach(fct => {
fct();
});
});
// ]]#
</script>
</head>
<body class="vert flex">
#foreach($attr in $application.getAttributeNames())$attr #end
#* Debugging code to list all web context properties
<blockquote>
#foreach($attr in $application.getAttributeNames())
<div>$attr = $application.getAttribute($attr)</div>
#end
</blockquote>
*#
<div id="header" class="horz flex">
<div id="logo">
<img src="/img/logov2.svg"/>
@@ -38,13 +54,22 @@
<div id="version">pairgoth v0.1</div>
<div id="contact"><a href="mailto:pairgoth@jeudego.org">contact</a></div>
</div>
<div id="feedback">
<div id="success" class="hidden"></div>
<div id="error" class="hidden"></div>
</div>
<div id="backdrop">
<div id="dimmer"></div>
<script type="text/javascript" src="/js/store2-2.14.2.min.js"></script>
<script type="text/javascript" src="/js/tablesort-5.4.0.min.js"></script>
<script type="text/javascript" src="/js/formproxy.js"></script>
<script type="text/javascript" src="/lib/store2-2.14.2.min.js"></script>
<script type="text/javascript" src="/lib/tablesort-5.4.0.min.js"></script>
<script type="text/javascript" src="/lib/imaskjs-7.1.3/imask.min.js"></script>
<script type="text/javascript" src="/js/api.js"></script>
<script type="text/javascript" src="/js/main.js"></script>
<script type="text/javascript" src="/js/domhelper.js"></script>
<link rel="stylesheet" href="/lib/fork-awesome-1.2.0/fork-awesome.min.css"/>
<link rel="stylesheet" href="/css/main.css"/>
<script type="text/javascript">
const lang = '${request.lang}';
// #[[
onLoad(() => {
$('#lang').on('click', e => {
@@ -61,6 +86,18 @@
}
});
});
// syntaxic sugar for IMask
NodeList.prototype.imask = function(options) {
this.forEach(function (elem, i) {
elem.imask(options);
});
return this;
}
HTMLInputElement.prototype.imask = function(options) {
IMask(this, options);
}
// ]]#
</script>
</body>

View File

@@ -0,0 +1 @@
level = info

View File

@@ -19,6 +19,7 @@
<toolbox scope="request">
<tool key="api" class="org.jeudego.pairgoth.view.ApiTool"/>
<tool key="countries" class="org.jeudego.pairgoth.view.CountriesTool"/>
</toolbox>
</tools>

View File

@@ -59,6 +59,12 @@
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<servlet>
<servlet-name>api</servlet-name>
<servlet-class>org.jeudego.pairgoth.web.ApiServlet</servlet-class>
<load-on-startup>1</load-on-startup>
<async-supported>true</async-supported>
</servlet>
<!-- servlet mappings -->
<servlet-mapping>
@@ -69,10 +75,26 @@
<servlet-name>sse</servlet-name>
<url-pattern>/events/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>api</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<!-- context params -->
<context-param>
<param-name>webapp-slf4j-logger.format</param-name>
<param-value>%logger [%level] [%ip] %message @%file:%line:%column</param-value>
</context-param>
<context-param>
<param-name>org.apache.velocity.tools.loadDefaults</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.apache.velocity.tools.cleanConfiguration</param-name>
<param-value>true</param-value>
</context-param>
<context-param>
<param-name>org.apache.velocity.tools.userCanOverwriteTools</param-name>
<param-value>false</param-value>
</context-param>
</web-app>

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 9.6 KiB

View File

@@ -1,15 +1,16 @@
<div class="section">
<button id="new" class="ui blue icon floating button">
<a href="tour" class="ui blue icon floating button">
<i class="fa fa-plus-square-o"></i>
New tournament
</button>
</a>
</div>
#foreach($tour in $api.get('tour').entrySet())
<div class="section">
<button data-tour-id="$tour.key" class="ui open basic secondary white icon floating button">
$tour
<a href="tour?tour_id=${tour.key}" class="ui open basic secondary white icon floating button">
<i class="fa fa-folder-open-o"></i>
Open $tour.value
</button>
Open
</a>
</div>
#end
@@ -53,15 +54,16 @@
</button>
</div></div>
<script type="text/javascript">
const lang = '${request.lang}';
// #[[
onLoad(() => {
$('#new').on('click', e => {
$('#new-tournament').modal(true);
});
/*
new DateRangePicker($('#date-range')[0], {
language: lang
});
*/
$('#new-tournament .tab.segment:first-child').addClass('active');
});
// ]]#

View File

@@ -23,6 +23,30 @@ let headers = function() {
return ret;
};
function clearFeedback() {
$('#error')[0].innerText = '';
$('#error, #success').addClass('hidden');
}
function success() {
$('#error')[0].innerText = '';
$('#error').addClass('hidden');
}
function error(response) {
const contentType = response.headers.get("content-type");
let promise =
(contentType && contentType.indexOf("application/json") !== -1)
? response.json().then(json => json.error || "unknown error")
: Promise.resolve(response.statusText);
promise.then(message => {
message = message.replaceAll(/([a-z])([A-Z])/g,"$1 $2").toLowerCase()
console.error(message);
$('#error')[0].innerText = message;
$('#error').removeClass('hidden');
});
}
let api = {
get: (path) => fetch(base + path, {
credentials: "same-origin",
@@ -49,22 +73,61 @@ let api = {
/* then, some helpers */
getJson: (path) => api.get(path)
.then(resp => {
if (resp.ok) return resp.json();
else throw resp.statusText;
}),
getJson: (path) => {
clearFeedback();
return api.get(path)
.then(resp => {
if (resp.ok) {
return resp.json();
}
else throw resp;
})
.catch(err => {
error(err);
return 'error'
});
},
postJson: (path, body) => api.post(path, body)
.then(resp => {
if (resp.ok) return resp.json();
else throw resp.statusText;
}),
postJson: (path, body) => {
clearFeedback();
spinner(true);
return api.post(path, body)
.then(resp => {
if (resp.ok) {
success();
return resp.json();
}
else {
throw resp;
}
})
.catch(err => {
error(err);
return 'error';
})
.finally(() => {
spinner(false);
});
},
putJson: (path, body) => api.put(path, body)
.then(resp => {
if (resp.ok) return resp.json();
else throw resp.statusText;
})
putJson: (path, body) => {
clearFeedback();
spinner(true);
return api.put(path, body)
.then(resp => {
if (resp.ok) {
success();
return resp.json();
}
else throw resp;
})
.catch(err => {
error(err);
return 'error';
})
.finally(() => {
spinner(false);
});
}
};

View File

@@ -78,27 +78,27 @@ Element.prototype.data = function (key) {
NodeList.prototype.data = function(key) {
this.item(0).data(key);
}
NodeList.prototype.show = function(key) {
this.item(0).show(key);
NodeList.prototype.show = function() {
this.item(0).show();
return this;
}
Element.prototype.show = function (key) {
Element.prototype.show = function() {
this.style.display = 'block';
}
NodeList.prototype.hide = function(key) {
this.item(0).hide(key);
NodeList.prototype.hide = function() {
this.item(0).hide();
return this;
}
Element.prototype.hide = function (key) {
Element.prototype.hide = function() {
this.style.display = 'none';
}
let initFunctions = [];
function onLoad(fct) {
if (typeof(fct) == "function") initFunctions.push(fct);
NodeList.prototype.text = function(txt) {
this.item(0).text(txt);
}
Element.prototype.text = function(txt) {
if (typeof(txt) === 'undefined') {
return this.textContent;
} else {
this.textContent = txt;
}
}
document.on("DOMContentLoaded", () => {
initFunctions.forEach(fct => {
fct();
});
});

View File

@@ -1,163 +0,0 @@
// hack to replace .34 into 0.34 (CB TODO - upstream patch to inputmask)
const fixNumber = (value) => isNaN(value) || !`${value}`.startsWith('.') ? value : `0.${value}`;
class FormProxy {
constructor(formSelector, config) {
this.formSelector = formSelector;
this.config = config;
this.config.properties = () => Object.keys(this.config).filter(k => typeof(this.config[k]) !== 'function');
this.promises = [];
this.dirty = false;
this.config.import = function(obj) {
for (let key in obj) {
if (key in this.config) {
this.proxy[key] = obj[key];
} else {
console.warn(`ignoring property ${key}`)
}
}
this.config.dirty(false);
}.bind(this);
this.config.export = function() {
let ret = {}
this.config.properties().forEach(prop => {
ret[prop] = this.proxy[prop];
});
return ret;
}.bind(this);
this.config.dirty = function(value) {
if (typeof(value) === 'undefined') return thisProxy.dirty;
else thisProxy.dirty = Boolean(value);
}.bind(this);
this.config.valid = function() {
return $(`${thisProxy.formSelector} [required]:invalid`).length === 0
}.bind(this);
this.config.reset = function() {
this.initialize();
}.bind(this);
// CB TODO - needs a function to wait for promises coming from dependencies
this.setState('loading');
$(() => this.configure.bind(this)());
let thisProxy = this;
return this.proxy = new Proxy(config, {
get(target, prop) {
if (typeof(target[prop]) === 'function') {
return target[prop];
}
else {
let elem = config[prop];
if (typeof(elem) === 'undefined') throw `invalid property: ${prop}`
return elem.getter();
}
},
set(target, prop, value) {
let def = config[prop];
if (typeof(def) === 'undefined') throw `invalid property: ${prop}`
let depends = [].concat(def.depends ? def.depends : []);
let proms = depends.flatMap(field => config[field].promise).filter(prom => prom);
let operation = () => {
def.setter(value);
if (typeof(def.change) === 'function') {
let rst = def.change(value, def.elem);
if (typeof(rst?.then) === 'function') {
def.promise = rst;
}
}
};
if (proms.length) Promise.all(proms).then(() => operation());
else operation();
config.dirty(true);
return true;
}
});
}
configure() {
this.form = $(this.formSelector);
if (!this.form.length) throw `Form not found: ${this.formSelector}`;
this.form.on('submit', e => { e.preventDefault(); return false; });
let controls = this.form.find('input[name],select[name],textarea[name]');
controls.on('input change keyup', e => {
this.setState('editing');
this.config.dirty(true);
});
controls.each((i,e) => {
let name = $(e).attr('name');
if (!(name in this.config)) this.config[name] = {};
});
this.config.properties().forEach(key => {
let def = this.config[key];
if (!def) def = this.config[key] = {};
else if (typeof(def) === 'function') return true; // continue foreach
if (!def.getter) {
let elem = def.elem;
if (!elem || !elem.length) elem = $(`${this.formSelector} [name="${key}"]`);
if (!elem || !elem.length) elem = $(`#${key}`);
if (!elem || !elem.length) throw `element not found: ${key}`;
def.elem = elem;
def.getter = elem.is('input,select,textarea')
? elem.attr('type') === 'radio'
? (() => elem.filter(':checked').val())
: (() => elem.data('default')
? elem.val()
? elem.is('.number')
? elem.val().replace(/ /g, '')
: elem.val()
: elem.data('default')
: elem.is('.number')
? elem.val() ? elem.val().replace(/ /g, '') : elem.val()
: elem.val())
: (() => elem.text());
def.setter = elem.is('input,select,textarea')
? elem.attr('type') === 'radio'
? (value => elem.filter(`[value="${value}"]`).prop('checked', true))
: elem.is('input.number') ? (value => elem.val(fixNumber(value))) : (value => elem.val(value))
: (value => elem.text(value));
if (typeof(def.change) === 'function') {
elem.on('change', () => def.change(def.getter(), elem));
}
}
let loading = def?.loading;
switch (typeof(loading)) {
case 'function':
let rst = loading(def.elem);
if (typeof(rst?.then) === 'function') {
this.promises.push(rst);
}
break;
}
});
setTimeout(() => {
Promise.all(this.promises).then(() => { this.promises = []; this.initialize(); });
}, 10);
}
initialize() {
this.config.properties().forEach(key => {
let def = this.config[key];
if (typeof(def.initial) === 'undefined') {
this.proxy[key] = '';
} else {
if (typeof(def.initial) === 'function') {
def.initial(def.elem)
} else if (def.initial != null) {
this.proxy[key] = def.initial;
}
}
});
this.config.dirty(false);
this.setState('initial');
}
setState(state) {
if (this.form && this.form.length) this.form[0].dispatchEvent(new Event(state));
}
}

View File

@@ -102,6 +102,35 @@ Element.prototype.modal = function(show) {
return this;
}
/* DOM helpers */
function formValue(name) {
let ctl = $(`[name="${name}"]`)[0];
let type = ctl.tagName;
if (
(type === 'INPUT' && ['text', 'number'].includes(ctl.attr('type'))) ||
type === 'SELECT'
) {
return ctl.value;
} else if (type === 'INPUT' && ctl.attr('type') === 'radio') {
ctl = $(`input[name="${name}"]:checked`)[0];
if (ctl) return ctl.value;
} else if (type === 'INPUT' && ctl.attr('type') === 'radio') {
return ctl.checked;
}
console.error(`unknown input name: ${name}`);
return null;
}
function msg(id) {
let ctl = $(`#${id}`)[0];
return ctl.textContent;
}
function spinner(show) {
if (show) $('#backdrop').addClass('active');
else $('#backdrop').removeClass('active');
}
onLoad(() => {
/*

View File

@@ -0,0 +1 @@
date picker: https://mymth.github.io/vanillajs-datepicker/#/

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,317 @@
.datepicker {
width: -moz-min-content;
width: min-content;
}
.datepicker:not(.active) {
display: none;
}
.datepicker-dropdown {
position: absolute;
z-index: 20;
padding-top: 4px;
}
.datepicker-dropdown.datepicker-orient-top {
padding-top: 0;
padding-bottom: 4px;
}
.datepicker-picker {
display: flex;
flex-direction: column;
border-radius: 4px;
background-color: hsl(0, 0%, 100%);
}
.datepicker-dropdown .datepicker-picker {
box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1);
}
.datepicker-main {
flex: auto;
padding: 2px;
}
.datepicker-footer {
box-shadow: inset 0 1px 1px rgba(10, 10, 10, 0.1);
background-color: hsl(0, 0%, 96%);
}
.datepicker-title {
box-shadow: inset 0 -1px 1px rgba(10, 10, 10, 0.1);
background-color: hsl(0, 0%, 96%);
padding: 0.375rem 0.75rem;
text-align: center;
font-weight: 700;
}
.datepicker-controls {
display: flex;
}
.datepicker-header .datepicker-controls {
padding: 2px 2px 0;
}
.datepicker-controls .button {
display: inline-flex;
position: relative;
align-items: center;
justify-content: center;
margin: 0;
border: 1px solid gainsboro;
border-radius: 4px;
box-shadow: none;
background-color: hsl(0, 0%, 100%);
cursor: pointer;
padding: calc(0.375em - 1px) 0.75em;
height: 2.25em;
vertical-align: top;
text-align: center;
line-height: 1.5;
white-space: nowrap;
color: hsl(0, 0%, 21%);
font-size: 1rem;
}
.datepicker-controls .button:focus,
.datepicker-controls .button:active {
outline: none;
}
.datepicker-controls .button:hover {
border-color: #b8b8b8;
color: hsl(0, 0%, 21%);
}
.datepicker-controls .button:focus {
border-color: hsl(217, 71%, 53%);
color: hsl(0, 0%, 21%);
}
.datepicker-controls .button:focus:not(:active) {
box-shadow: 0 0 0 0.125em rgba(50, 115, 220, 0.25);
}
.datepicker-controls .button:active {
border-color: #474747;
color: hsl(0, 0%, 21%);
}
.datepicker-controls .button[disabled] {
cursor: not-allowed;
}
.datepicker-header .datepicker-controls .button {
border-color: transparent;
font-weight: bold;
}
.datepicker-header .datepicker-controls .button:hover {
background-color: #f9f9f9;
}
.datepicker-header .datepicker-controls .button:active {
background-color: #f2f2f2;
}
.datepicker-footer .datepicker-controls .button {
flex: auto;
margin: calc(0.375rem - 1px) 0.375rem;
border-radius: 2px;
font-size: 0.75rem;
}
.datepicker-controls .view-switch {
flex: auto;
}
.datepicker-controls .prev-button,
.datepicker-controls .next-button {
padding-right: 0.375rem;
padding-left: 0.375rem;
flex: 0 0 14.2857142857%;
}
.datepicker-controls .prev-button.disabled,
.datepicker-controls .next-button.disabled {
visibility: hidden;
}
.datepicker-view,
.datepicker-grid {
display: flex;
}
.datepicker-view {
align-items: stretch;
width: 15.75rem;
}
.datepicker-grid {
flex-wrap: wrap;
flex: auto;
}
.datepicker .days {
display: flex;
flex-direction: column;
flex: auto;
}
.datepicker .days-of-week {
display: flex;
}
.datepicker .week-numbers {
display: flex;
flex-direction: column;
flex: 0 0 9.6774193548%;
}
.datepicker .weeks {
display: flex;
flex-direction: column;
align-items: stretch;
flex: auto;
}
.datepicker span {
display: flex;
align-items: center;
justify-content: center;
border-radius: 4px;
cursor: default;
-webkit-touch-callout: none;
-webkit-user-select: none;
-moz-user-select: none;
user-select: none;
}
.datepicker .dow {
height: 1.5rem;
font-size: 0.875rem;
font-weight: 700;
}
.datepicker .week {
flex: auto;
color: #b8b8b8;
font-size: 0.75rem;
}
.datepicker-cell,
.datepicker .days .dow {
flex-basis: 14.2857142857%;
}
.datepicker-cell {
height: 2.25rem;
}
.datepicker-cell:not(.day) {
flex-basis: 25%;
height: 4.5rem;
}
.datepicker-cell:not(.disabled):hover {
background-color: #f9f9f9;
cursor: pointer;
}
.datepicker-cell.focused:not(.selected) {
background-color: #e9e9e9;
}
.datepicker-cell.selected,
.datepicker-cell.selected:hover {
background-color: hsl(217, 71%, 53%);
color: #fff;
font-weight: 600;
}
.datepicker-cell.disabled {
color: gainsboro;
}
.datepicker-cell.prev:not(.disabled),
.datepicker-cell.next:not(.disabled) {
color: hsl(0, 0%, 48%);
}
.datepicker-cell.prev.selected,
.datepicker-cell.next.selected {
color: #e6e6e6;
}
.datepicker-cell.highlighted:not(.selected):not(.range):not(.today) {
border-radius: 0;
background-color: hsl(0, 0%, 96%);
}
.datepicker-cell.highlighted:not(.selected):not(.range):not(.today):not(.disabled):hover {
background-color: #efefef;
}
.datepicker-cell.highlighted:not(.selected):not(.range):not(.today).focused {
background-color: #e9e9e9;
}
.datepicker-cell.today:not(.selected) {
background-color: hsl(171, 100%, 41%);
}
.datepicker-cell.today:not(.selected):not(.disabled) {
color: #fff;
}
.datepicker-cell.today.focused:not(.selected) {
background-color: #00ccad;
}
.datepicker-cell.range-end:not(.selected),
.datepicker-cell.range-start:not(.selected) {
background-color: #b8b8b8;
color: #fff;
}
.datepicker-cell.range-end.focused:not(.selected),
.datepicker-cell.range-start.focused:not(.selected) {
background-color: #b3b3b3;
}
.datepicker-cell.range-start:not(.range-end) {
border-radius: 4px 0 0 4px;
}
.datepicker-cell.range-end:not(.range-start) {
border-radius: 0 4px 4px 0;
}
.datepicker-cell.range {
border-radius: 0;
background-color: gainsboro;
}
.datepicker-cell.range:not(.disabled):not(.focused):not(.today):hover {
background-color: #d7d7d7;
}
.datepicker-cell.range.disabled {
color: #c6c6c6;
}
.datepicker-cell.range.focused {
background-color: #d1d1d1;
}
.datepicker-input.in-edit {
border-color: #276bda;
}
.datepicker-input.in-edit:focus,
.datepicker-input.in-edit:active {
box-shadow: 0 0 0.25em 0.25em rgba(39, 107, 218, 0.2);
}

View File

@@ -0,0 +1 @@
.datepicker{width:-moz-min-content;width:min-content}.datepicker:not(.active){display:none}.datepicker-dropdown{padding-top:4px;position:absolute;z-index:20}.datepicker-dropdown.datepicker-orient-top{padding-bottom:4px;padding-top:0}.datepicker-picker{background-color:#fff;border-radius:4px;display:flex;flex-direction:column}.datepicker-dropdown .datepicker-picker{box-shadow:0 2px 3px hsla(0,0%,4%,.1),0 0 0 1px hsla(0,0%,4%,.1)}.datepicker-main{flex:auto;padding:2px}.datepicker-footer{background-color:#f5f5f5;box-shadow:inset 0 1px 1px hsla(0,0%,4%,.1)}.datepicker-title{background-color:#f5f5f5;box-shadow:inset 0 -1px 1px hsla(0,0%,4%,.1);font-weight:700;padding:.375rem .75rem;text-align:center}.datepicker-controls{display:flex}.datepicker-header .datepicker-controls{padding:2px 2px 0}.datepicker-controls .button{align-items:center;background-color:#fff;border:1px solid #dcdcdc;border-radius:4px;box-shadow:none;color:#363636;cursor:pointer;display:inline-flex;font-size:1rem;height:2.25em;justify-content:center;line-height:1.5;margin:0;padding:calc(.375em - 1px) .75em;position:relative;text-align:center;vertical-align:top;white-space:nowrap}.datepicker-controls .button:active,.datepicker-controls .button:focus{outline:none}.datepicker-controls .button:hover{border-color:#b8b8b8;color:#363636}.datepicker-controls .button:focus{border-color:#3273dc;color:#363636}.datepicker-controls .button:focus:not(:active){box-shadow:0 0 0 .125em rgba(50,115,220,.25)}.datepicker-controls .button:active{border-color:#474747;color:#363636}.datepicker-controls .button[disabled]{cursor:not-allowed}.datepicker-header .datepicker-controls .button{border-color:transparent;font-weight:700}.datepicker-header .datepicker-controls .button:hover{background-color:#f9f9f9}.datepicker-header .datepicker-controls .button:active{background-color:#f2f2f2}.datepicker-footer .datepicker-controls .button{border-radius:2px;flex:auto;font-size:.75rem;margin:calc(.375rem - 1px) .375rem}.datepicker-controls .view-switch{flex:auto}.datepicker-controls .next-button,.datepicker-controls .prev-button{flex:0 0 14.2857142857%;padding-left:.375rem;padding-right:.375rem}.datepicker-controls .next-button.disabled,.datepicker-controls .prev-button.disabled{visibility:hidden}.datepicker-grid,.datepicker-view{display:flex}.datepicker-view{align-items:stretch;width:15.75rem}.datepicker-grid{flex:auto;flex-wrap:wrap}.datepicker .days{display:flex;flex:auto;flex-direction:column}.datepicker .days-of-week{display:flex}.datepicker .week-numbers{display:flex;flex:0 0 9.6774193548%;flex-direction:column}.datepicker .weeks{align-items:stretch;display:flex;flex:auto;flex-direction:column}.datepicker span{-webkit-touch-callout:none;align-items:center;border-radius:4px;cursor:default;display:flex;justify-content:center;-webkit-user-select:none;-moz-user-select:none;user-select:none}.datepicker .dow{font-size:.875rem;font-weight:700;height:1.5rem}.datepicker .week{color:#b8b8b8;flex:auto;font-size:.75rem}.datepicker .days .dow,.datepicker-cell{flex-basis:14.2857142857%}.datepicker-cell{height:2.25rem}.datepicker-cell:not(.day){flex-basis:25%;height:4.5rem}.datepicker-cell:not(.disabled):hover{background-color:#f9f9f9;cursor:pointer}.datepicker-cell.focused:not(.selected){background-color:#e9e9e9}.datepicker-cell.selected,.datepicker-cell.selected:hover{background-color:#3273dc;color:#fff;font-weight:600}.datepicker-cell.disabled{color:#dcdcdc}.datepicker-cell.next:not(.disabled),.datepicker-cell.prev:not(.disabled){color:#7a7a7a}.datepicker-cell.next.selected,.datepicker-cell.prev.selected{color:#e6e6e6}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today){background-color:#f5f5f5;border-radius:0}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today):not(.disabled):hover{background-color:#efefef}.datepicker-cell.highlighted:not(.selected):not(.range):not(.today).focused{background-color:#e9e9e9}.datepicker-cell.today:not(.selected){background-color:#00d1b2}.datepicker-cell.today:not(.selected):not(.disabled){color:#fff}.datepicker-cell.today.focused:not(.selected){background-color:#00ccad}.datepicker-cell.range-end:not(.selected),.datepicker-cell.range-start:not(.selected){background-color:#b8b8b8;color:#fff}.datepicker-cell.range-end.focused:not(.selected),.datepicker-cell.range-start.focused:not(.selected){background-color:#b3b3b3}.datepicker-cell.range-start:not(.range-end){border-radius:4px 0 0 4px}.datepicker-cell.range-end:not(.range-start){border-radius:0 4px 4px 0}.datepicker-cell.range{background-color:#dcdcdc;border-radius:0}.datepicker-cell.range:not(.disabled):not(.focused):not(.today):hover{background-color:#d7d7d7}.datepicker-cell.range.disabled{color:#c6c6c6}.datepicker-cell.range.focused{background-color:#d1d1d1}.datepicker-input.in-edit{border-color:#276bda}.datepicker-input.in-edit:active,.datepicker-input.in-edit:focus{box-shadow:0 0 .25em .25em rgba(39,107,218,.2)}

View File

@@ -0,0 +1,19 @@
/**
* Arabic-Algeria translation for bootstrap-datepicker
* Rabah Saadi <infosrabah@gmail.com>
*/
(function () {
Datepicker.locales['ar-DZ'] = {
days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"],
daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
months: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
monthsShort: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
today: "هذا اليوم",
rtl: true,
monthsTitle: "أشهر",
clear: "إزالة",
format: "yyyy/mm/dd",
weekStart: 0
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Arabic-Tunisia translation for bootstrap-datepicker
* Souhaieb Besbes <besbes.souhaieb@gmail.com>
*/
(function () {
Datepicker.locales['ar-tn'] = {
days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"],
daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
months: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
monthsShort: ["جانفي","فيفري","مارس","أفريل","ماي","جوان","جويليه","أوت","سبتمبر","أكتوبر","نوفمبر","ديسمبر"],
today: "هذا اليوم",
rtl: true
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Arabic translation for bootstrap-datepicker
* Mohammed Alshehri <alshehri866@gmail.com>
*/
(function () {
Datepicker.locales.ar = {
days: ["الأحد", "الاثنين", "الثلاثاء", "الأربعاء", "الخميس", "الجمعة", "السبت", "الأحد"],
daysShort: ["أحد", "اثنين", "ثلاثاء", "أربعاء", "خميس", "جمعة", "سبت", "أحد"],
daysMin: ["ح", "ن", "ث", "ع", "خ", "ج", "س", "ح"],
months: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"],
monthsShort: ["يناير", "فبراير", "مارس", "أبريل", "مايو", "يونيو", "يوليو", "أغسطس", "سبتمبر", "أكتوبر", "نوفمبر", "ديسمبر"],
today: "هذا اليوم",
rtl: true
};
}());

View File

@@ -0,0 +1,14 @@
// Azerbaijani
(function () {
Datepicker.locales.az = {
days: ["Bazar", "Bazar ertəsi", "Çərşənbə axşamı", "Çərşənbə", "Cümə axşamı", "Cümə", "Şənbə"],
daysShort: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş."],
daysMin: ["B.", "B.e", "Ç.a", "Ç.", "C.a", "C.", "Ş."],
months: ["Yanvar", "Fevral", "Mart", "Aprel", "May", "İyun", "İyul", "Avqust", "Sentyabr", "Oktyabr", "Noyabr", "Dekabr"],
monthsShort: ["Yan", "Fev", "Mar", "Apr", "May", "İyun", "İyul", "Avq", "Sen", "Okt", "Noy", "Dek"],
today: "Bu gün",
weekStart: 1,
clear: "Təmizlə",
monthsTitle: 'Aylar'
};
}());

View File

@@ -0,0 +1,14 @@
/**
* Bulgarian translation for bootstrap-datepicker
* Apostol Apostolov <apostol.s.apostolov@gmail.com>
*/
(function () {
Datepicker.locales.bg = {
days: ["Неделя", "Понеделник", "Вторник", "Сряда", "Четвъртък", "Петък", "Събота"],
daysShort: ["Нед", "Пон", "Вто", "Сря", "Чет", "Пет", "Съб"],
daysMin: ["Н", "П", "В", "С", "Ч", "П", "С"],
months: ["Януари", "Февруари", "Март", "Април", "Май", "Юни", "Юли", "Август", "Септември", "Октомври", "Ноември", "Декември"],
monthsShort: ["Ян", "Фев", "Мар", "Апр", "Май", "Юни", "Юли", "Авг", "Сеп", "Окт", "Ное", "Дек"],
today: "днес"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Bamanankan (bm) translation for bootstrap-datepicker
* Fatou Fall <fatou@medicmobile.org>
*/
(function () {
Datepicker.locales.bm = {
days: ["Kari","Ntɛnɛn","Tarata","Araba","Alamisa","Juma","Sibiri"],
daysShort: ["Kar","Ntɛ","Tar","Ara","Ala","Jum","Sib"],
daysMin: ["Ka","Nt","Ta","Ar","Al","Ju","Si"],
months: ["Zanwuyekalo","Fewuruyekalo","Marisikalo","Awirilikalo","Mɛkalo","Zuwɛnkalo","Zuluyekalo","Utikalo","Sɛtanburukalo","ɔkutɔburukalo","Nowanburukalo","Desanburukalo"],
monthsShort: ["Zan","Few","Mar","Awi","Mɛ","Zuw","Zul","Uti","Sɛt","ɔku","Now","Des"],
today: "Bi",
monthsTitle: "Kalo",
clear: "Ka jɔsi",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Bengali (Bangla) translation for bootstrap-datepicker
* Karim Khan <kkhancse91@gmail.com>
* Orif N. Jr. <orif.zade@gmail.com>
*/
(function () {
Datepicker.locales.bn = {
days: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
daysShort: ["রবিবার","সোমবার","মঙ্গলবার","বুধবার","বৃহস্পতিবার","শুক্রবার","শনিবার"],
daysMin: ["রবি","সোম","মঙ্গল","বুধ","বৃহস্পতি","শুক্র","শনি"],
months: ["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],
monthsShort: ["জানুয়ারী","ফেব্রুয়ারি","মার্চ","এপ্রিল","মে","জুন","জুলাই","অগাস্ট","সেপ্টেম্বর","অক্টোবর","নভেম্বর","ডিসেম্বর"],
today: "আজ",
monthsTitle: "মাস",
clear: "পরিষ্কার",
weekStart: 0,
format: "mm/dd/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Breton translation for bootstrap-datepicker
* Gwenn Meynier <tornoz@laposte.net>
*/
(function () {
Datepicker.locales.br = {
days: ["Sul", "Lun", "Meurzh", "Merc'her", "Yaou", "Gwener", "Sadorn"],
daysShort: ["Sul", "Lun", "Meu.", "Mer.", "Yao.", "Gwe.", "Sad."],
daysMin: ["Su", "L", "Meu", "Mer", "Y", "G", "Sa"],
months: ["Genver", "C'hwevrer", "Meurzh", "Ebrel", "Mae", "Mezheven", "Gouere", "Eost", "Gwengolo", "Here", "Du", "Kerzu"],
monthsShort: ["Genv.", "C'hw.", "Meur.", "Ebre.", "Mae", "Mezh.", "Goue.", "Eost", "Gwen.", "Here", "Du", "Kerz."],
today: "Hiziv",
monthsTitle: "Miz",
clear: "Dilemel",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Bosnian translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales.bs = {
days: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su"],
months: ["Januar", "Februar", "Mart", "April", "Maj", "Juni", "Juli", "August", "Septembar", "Oktobar", "Novembar", "Decembar"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
today: "Danas",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Catalan translation for bootstrap-datepicker
* J. Garcia <jogaco.en@gmail.com>
*/
(function () {
Datepicker.locales.ca = {
days: ["diumenge", "dilluns", "dimarts", "dimecres", "dijous", "divendres", "dissabte"],
daysShort: ["dg.", "dl.", "dt.", "dc.", "dj.", "dv.", "ds."],
daysMin: ["dg", "dl", "dt", "dc", "dj", "dv", "ds"],
months: ["gener", "febrer", "març", "abril", "maig", "juny", "juliol", "agost", "setembre", "octubre", "novembre", "desembre"],
monthsShort: ["gen.", "febr.", "març", "abr.", "maig", "juny", "jul.", "ag.", "set.", "oct.", "nov.", "des."],
today: "Avui",
monthsTitle: "Mesos",
clear: "Esborra",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Czech translation for bootstrap-datepicker
* Matěj Koubík <matej@koubik.name>
* Fixes by Michal Remiš <michal.remis@gmail.com>
*/
(function () {
Datepicker.locales.cs = {
days: ["Neděle", "Pondělí", "Úterý", "Středa", "Čtvrtek", "Pátek", "Sobota"],
daysShort: ["Ned", "Pon", "Úte", "Stř", "Čtv", "Pát", "Sob"],
daysMin: ["Ne", "Po", "Út", "St", "Čt", "Pá", "So"],
months: ["Leden", "Únor", "Březen", "Duben", "Květen", "Červen", "Červenec", "Srpen", "Září", "Říjen", "Listopad", "Prosinec"],
monthsShort: ["Led", "Úno", "Bře", "Dub", "Kvě", "Čer", "Čnc", "Srp", "Zář", "Říj", "Lis", "Pro"],
today: "Dnes",
clear: "Vymazat",
monthsTitle: "Měsíc",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,14 @@
/**
* Welsh translation for bootstrap-datepicker
* S. Morris <s.morris@bangor.ac.uk>
*/
(function () {
Datepicker.locales.cy = {
days: ["Sul", "Llun", "Mawrth", "Mercher", "Iau", "Gwener", "Sadwrn"],
daysShort: ["Sul", "Llu", "Maw", "Mer", "Iau", "Gwe", "Sad"],
daysMin: ["Su", "Ll", "Ma", "Me", "Ia", "Gwe", "Sa"],
months: ["Ionawr", "Chewfror", "Mawrth", "Ebrill", "Mai", "Mehefin", "Gorfennaf", "Awst", "Medi", "Hydref", "Tachwedd", "Rhagfyr"],
monthsShort: ["Ion", "Chw", "Maw", "Ebr", "Mai", "Meh", "Gor", "Aws", "Med", "Hyd", "Tach", "Rha"],
today: "Heddiw"
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Danish translation for bootstrap-datepicker
* Christian Pedersen <https: //github.com/chripede>
* Ivan Mylyanyk <https: //github.com/imylyanyk>
*/
(function () {
Datepicker.locales.da = {
days: ["Søndag", "Mandag", "Tirsdag", "Onsdag", "Torsdag", "Fredag", "Lørdag"],
daysShort: ["Søn", "Man", "Tir", "Ons", "Tor", "Fre", "Lør"],
daysMin: ["Sø", "Ma", "Ti", "On", "To", "Fr", "Lø"],
months: ["Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dec"],
today: "I Dag",
weekStart: 1,
clear: "Nulstil",
format: "dd/mm/yyyy",
monthsTitle: "Måneder"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* German translation for bootstrap-datepicker
* Sam Zurcher <sam@orelias.ch>
*/
(function () {
Datepicker.locales.de = {
days: ["Sonntag", "Montag", "Dienstag", "Mittwoch", "Donnerstag", "Freitag", "Samstag"],
daysShort: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
daysMin: ["So", "Mo", "Di", "Mi", "Do", "Fr", "Sa"],
months: ["Januar", "Februar", "März", "April", "Mai", "Juni", "Juli", "August", "September", "Oktober", "November", "Dezember"],
monthsShort: ["Jan", "Feb", "Mär", "Apr", "Mai", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Dez"],
today: "Heute",
monthsTitle: "Monate",
clear: "Löschen",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,16 @@
/**
* Greek translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales.el = {
days: ["Κυριακή", "Δευτέρα", "Τρίτη", "Τετάρτη", "Πέμπτη", "Παρασκευή", "Σάββατο"],
daysShort: ["Κυρ", "Δευ", "Τρι", "Τετ", "Πεμ", "Παρ", "Σαβ"],
daysMin: ["Κυ", "Δε", "Τρ", "Τε", "Πε", "Πα", "Σα"],
months: ["Ιανουάριος", "Φεβρουάριος", "Μάρτιος", "Απρίλιος", "Μάιος", "Ιούνιος", "Ιούλιος", "Αύγουστος", "Σεπτέμβριος", "Οκτώβριος", "Νοέμβριος", "Δεκέμβριος"],
monthsShort: ["Ιαν", "Φεβ", "Μαρ", "Απρ", "Μάι", "Ιουν", "Ιουλ", "Αυγ", "Σεπ", "Οκτ", "Νοε", "Δεκ"],
today: "Σήμερα",
clear: "Καθαρισμός",
weekStart: 1,
format: "d/m/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Australian English translation for bootstrap-datepicker
* Steve Chapman <steven.p.chapman@gmail.com>
*/
(function () {
Datepicker.locales['en-AU'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 1,
format: "d/mm/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Canadian English translation for bootstrap-datepicker
* Mike Nacey <mnacey@gmail.com>
*/
(function () {
Datepicker.locales['en-CA'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 0,
format: "yyyy-mm-dd"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* British English translation for bootstrap-datepicker
* Xavier Dutreilh <xavier@dutreilh.com>
*/
(function () {
Datepicker.locales['en-GB'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Irish English translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales['en-IE'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* New Zealand English translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales['en-NZ'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 1,
format: "d/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* South African English translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales['en-ZA'] = {
days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"],
daysShort: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"],
daysMin: ["Su", "Mo", "Tu", "We", "Th", "Fr", "Sa"],
months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Today",
monthsTitle: "Months",
clear: "Clear",
weekStart: 1,
format: "yyyy/mm/d"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Esperanto translation for bootstrap-datepicker
* Emmanuel Debanne <https: //github.com/debanne>
*/
(function () {
Datepicker.locales.eo = {
days: ["dimanĉo", "lundo", "mardo", "merkredo", "ĵaŭdo", "vendredo", "sabato"],
daysShort: ["dim.", "lun.", "mar.", "mer.", "ĵaŭ.", "ven.", "sam."],
daysMin: ["d", "l", "ma", "me", "ĵ", "v", "s"],
months: ["januaro", "februaro", "marto", "aprilo", "majo", "junio", "julio", "aŭgusto", "septembro", "oktobro", "novembro", "decembro"],
monthsShort: ["jan.", "feb.", "mar.", "apr.", "majo", "jun.", "jul.", "aŭg.", "sep.", "okt.", "nov.", "dec."],
today: "Hodiaŭ",
clear: "Nuligi",
weekStart: 1,
format: "yyyy-mm-dd"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Spanish translation for bootstrap-datepicker
* Bruno Bonamin <bruno.bonamin@gmail.com>
*/
(function () {
Datepicker.locales.es = {
days: ["Domingo", "Lunes", "Martes", "Miércoles", "Jueves", "Viernes", "Sábado"],
daysShort: ["Dom", "Lun", "Mar", "Mié", "Jue", "Vie", "Sáb"],
daysMin: ["Do", "Lu", "Ma", "Mi", "Ju", "Vi", "Sa"],
months: ["Enero", "Febrero", "Marzo", "Abril", "Mayo", "Junio", "Julio", "Agosto", "Septiembre", "Octubre", "Noviembre", "Diciembre"],
monthsShort: ["Ene", "Feb", "Mar", "Abr", "May", "Jun", "Jul", "Ago", "Sep", "Oct", "Nov", "Dic"],
today: "Hoy",
monthsTitle: "Meses",
clear: "Borrar",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Estonian translation for bootstrap-datepicker
* Ando Roots <https: //github.com/anroots>
* Fixes by Illimar Tambek <<https: //github.com/ragulka>
*/
(function () {
Datepicker.locales.et = {
days: ["Pühapäev", "Esmaspäev", "Teisipäev", "Kolmapäev", "Neljapäev", "Reede", "Laupäev"],
daysShort: ["Pühap", "Esmasp", "Teisip", "Kolmap", "Neljap", "Reede", "Laup"],
daysMin: ["P", "E", "T", "K", "N", "R", "L"],
months: ["Jaanuar", "Veebruar", "Märts", "Aprill", "Mai", "Juuni", "Juuli", "August", "September", "Oktoober", "November", "Detsember"],
monthsShort: ["Jaan", "Veebr", "Märts", "Apr", "Mai", "Juuni", "Juuli", "Aug", "Sept", "Okt", "Nov", "Dets"],
today: "Täna",
clear: "Tühjenda",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Basque translation for bootstrap-datepicker
* Arkaitz Etxeberria <kondi80@gmail.com>
*/
(function () {
Datepicker.locales.eu = {
days: ['Igandea', 'Astelehena', 'Asteartea', 'Asteazkena', 'Osteguna', 'Ostirala', 'Larunbata'],
daysShort: ['Ig', 'Al', 'Ar', 'Az', 'Og', 'Ol', 'Lr'],
daysMin: ['Ig', 'Al', 'Ar', 'Az', 'Og', 'Ol', 'Lr'],
months: ['Urtarrila', 'Otsaila', 'Martxoa', 'Apirila', 'Maiatza', 'Ekaina', 'Uztaila', 'Abuztua', 'Iraila', 'Urria', 'Azaroa', 'Abendua'],
monthsShort: ['Urt', 'Ots', 'Mar', 'Api', 'Mai', 'Eka', 'Uzt', 'Abu', 'Ira', 'Urr', 'Aza', 'Abe'],
today: "Gaur",
monthsTitle: "Hilabeteak",
clear: "Ezabatu",
weekStart: 1,
format: "yyyy/mm/dd"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Persian translation for bootstrap-datepicker
* Mostafa Rokooie <mostafa.rokooie@gmail.com>
*/
(function () {
Datepicker.locales.fa = {
days: ["یک‌شنبه", "دوشنبه", "سه‌شنبه", "چهارشنبه", "پنج‌شنبه", "جمعه", "شنبه", "یک‌شنبه"],
daysShort: ["یک", "دو", "سه", "چهار", "پنج", "جمعه", "شنبه", "یک"],
daysMin: ["ی", "د", "س", "چ", "پ", "ج", "ش", "ی"],
months: ["ژانویه", "فوریه", "مارس", "آوریل", "مه", "ژوئن", "ژوئیه", "اوت", "سپتامبر", "اکتبر", "نوامبر", "دسامبر"],
monthsShort: ["ژان", "فور", "مار", "آور", "مه", "ژون", "ژوی", "اوت", "سپت", "اکت", "نوا", "دسا"],
today: "امروز",
clear: "پاک کن",
weekStart: 1,
format: "yyyy/mm/dd"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Finnish translation for bootstrap-datepicker
* Jaakko Salonen <https: //github.com/jsalonen>
*/
(function () {
Datepicker.locales.fi = {
days: ["sunnuntai", "maanantai", "tiistai", "keskiviikko", "torstai", "perjantai", "lauantai"],
daysShort: ["sun", "maa", "tii", "kes", "tor", "per", "lau"],
daysMin: ["su", "ma", "ti", "ke", "to", "pe", "la"],
months: ["tammikuu", "helmikuu", "maaliskuu", "huhtikuu", "toukokuu", "kesäkuu", "heinäkuu", "elokuu", "syyskuu", "lokakuu", "marraskuu", "joulukuu"],
monthsShort: ["tammi", "helmi", "maalis", "huhti", "touko", "kesä", "heinä", "elo", "syys", "loka", "marras", "joulu"],
today: "tänään",
clear: "Tyhjennä",
weekStart: 1,
format: "d.m.yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Faroese translation for bootstrap-datepicker
* Theodor Johannesen <https: //github.com/theodorjohannesen>
*/
(function () {
Datepicker.locales.fo = {
days: ["Sunnudagur", "Mánadagur", "Týsdagur", "Mikudagur", "Hósdagur", "Fríggjadagur", "Leygardagur"],
daysShort: ["Sun", "Mán", "Týs", "Mik", "Hós", "Frí", "Ley"],
daysMin: ["Su", "Má", "Tý", "Mi", "Hó", "Fr", "Le"],
months: ["Januar", "Februar", "Marts", "Apríl", "Mei", "Juni", "Juli", "August", "Septembur", "Oktobur", "Novembur", "Desembur"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Aug", "Sep", "Okt", "Nov", "Des"],
today: "Í Dag",
clear: "Reinsa"
};
}());

View File

@@ -0,0 +1,21 @@
/**
* French (Switzerland) translation for bootstrap-datepicker
* Christoph Jossi <c.jossi@ascami.ch>
* Based on
* French translation for bootstrap-datepicker
* Nico Mollet <nico.mollet@gmail.com>
*/
(function () {
Datepicker.locales['fr-CH'] = {
days: ["Dimanche", "Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"],
daysShort: ["Dim", "Lun", "Mar", "Mer", "Jeu", "Ven", "Sam"],
daysMin: ["D", "L", "Ma", "Me", "J", "V", "S"],
months: ["Janvier", "Février", "Mars", "Avril", "Mai", "Juin", "Juillet", "Août", "Septembre", "Octobre", "Novembre", "Décembre"],
monthsShort: ["Jan", "Fév", "Mar", "Avr", "Mai", "Jui", "Jul", "Aou", "Sep", "Oct", "Nov", "Déc"],
today: "Aujourd'hui",
monthsTitle: "Mois",
clear: "Effacer",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* French translation for bootstrap-datepicker
* Nico Mollet <nico.mollet@gmail.com>
*/
(function () {
Datepicker.locales.fr = {
days: ["dimanche", "lundi", "mardi", "mercredi", "jeudi", "vendredi", "samedi"],
daysShort: ["dim.", "lun.", "mar.", "mer.", "jeu.", "ven.", "sam."],
daysMin: ["d", "l", "ma", "me", "j", "v", "s"],
months: ["janvier", "février", "mars", "avril", "mai", "juin", "juillet", "août", "septembre", "octobre", "novembre", "décembre"],
monthsShort: ["janv.", "févr.", "mars", "avril", "mai", "juin", "juil.", "août", "sept.", "oct.", "nov.", "déc."],
today: "Aujourd'hui",
monthsTitle: "Mois",
clear: "Effacer",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,16 @@
/**
* Galician translation
*/
(function () {
Datepicker.locales.gl = {
days: ["Domingo", "Luns", "Martes", "Mércores", "Xoves", "Venres", "Sábado"],
daysShort: ["Dom", "Lun", "Mar", "Mér", "Xov", "Ven", "Sáb"],
daysMin: ["Do", "Lu", "Ma", "Me", "Xo", "Ve", "Sa"],
months: ["Xaneiro", "Febreiro", "Marzo", "Abril", "Maio", "Xuño", "Xullo", "Agosto", "Setembro", "Outubro", "Novembro", "Decembro"],
monthsShort: ["Xan", "Feb", "Mar", "Abr", "Mai", "Xun", "Xul", "Ago", "Sep", "Out", "Nov", "Dec"],
today: "Hoxe",
clear: "Limpar",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Hebrew translation for bootstrap-datepicker
* Sagie Maoz <sagie@maoz.info>
*/
(function () {
Datepicker.locales.he = {
days: ["ראשון", "שני", "שלישי", "רביעי", "חמישי", "שישי", "שבת", "ראשון"],
daysShort: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"],
daysMin: ["א", "ב", "ג", "ד", "ה", "ו", "ש", "א"],
months: ["ינואר", "פברואר", "מרץ", "אפריל", "מאי", "יוני", "יולי", "אוגוסט", "ספטמבר", "אוקטובר", "נובמבר", "דצמבר"],
monthsShort: ["ינו", "פבר", "מרץ", "אפר", "מאי", "יונ", "יול", "אוג", "ספט", "אוק", "נוב", "דצמ"],
today: "היום",
rtl: true
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Hindi translation for bootstrap-datepicker
* Visar Uruqi <visar.uruqi@gmail.com>
*/
(function () {
Datepicker.locales.hi = {
days: ["रविवार", "सोमवार", "मंगलवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार"],
daysShort: ["सूर्य", "सोम", "मंगल", "बुध", "गुरु", "शुक्र", "शनि"],
daysMin: ["र", "सो", "मं", "बु", "गु", "शु", "श"],
months: ["जनवरी", "फ़रवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितम्बर", "अक्टूबर", "नवंबर", "दिसम्बर"],
monthsShort: ["जन", "फ़रवरी", "मार्च", "अप्रैल", "मई", "जून", "जुलाई", "अगस्त", "सितं", "अक्टूबर", "नवं", "दिसम्बर"],
today: "आज",
monthsTitle: "महीने",
clear: "साफ",
weekStart: 1,
format: "dd / mm / yyyy"
};
}());

View File

@@ -0,0 +1,13 @@
/**
* Croatian localisation
*/
(function () {
Datepicker.locales.hr = {
days: ["Nedjelja", "Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"],
months: ["Siječanj", "Veljača", "Ožujak", "Travanj", "Svibanj", "Lipanj", "Srpanj", "Kolovoz", "Rujan", "Listopad", "Studeni", "Prosinac"],
monthsShort: ["Sij", "Velj", "Ožu", "Tra", "Svi", "Lip", "Srp", "Kol", "Ruj", "Lis", "Stu", "Pro"],
today: "Danas"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Hungarian translation for bootstrap-datepicker
* Sotus László <lacisan@gmail.com>
*/
(function () {
Datepicker.locales.hu = {
days: ["vasárnap", "hétfő", "kedd", "szerda", "csütörtök", "péntek", "szombat"],
daysShort: ["vas", "hét", "ked", "sze", "csü", "pén", "szo"],
daysMin: ["V", "H", "K", "Sze", "Cs", "P", "Szo"],
months: ["január", "február", "március", "április", "május", "június", "július", "augusztus", "szeptember", "október", "november", "december"],
monthsShort: ["jan", "feb", "már", "ápr", "máj", "jún", "júl", "aug", "sze", "okt", "nov", "dec"],
today: "ma",
weekStart: 1,
clear: "töröl",
titleFormat: "y. MM",
format: "yyyy.mm.dd"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Armenian translation for bootstrap-datepicker
* Hayk Chamyan <hamshen@gmail.com>
*/
(function () {
Datepicker.locales.hy = {
days: ["Կիրակի", "Երկուշաբթի", "Երեքշաբթի", "Չորեքշաբթի", "Հինգշաբթի", "Ուրբաթ", "Շաբաթ"],
daysShort: ["Կիր", "Երկ", "Երե", "Չոր", "Հին", "Ուրբ", "Շաբ"],
daysMin: ["Կի", "Եկ", "Եք", "Չո", "Հի", "Ու", "Շա"],
months: ["Հունվար", "Փետրվար", "Մարտ", "Ապրիլ", "Մայիս", "Հունիս", "Հուլիս", "Օգոստոս", "Սեպտեմբեր", "Հոկտեմբեր", "Նոյեմբեր", "Դեկտեմբեր"],
monthsShort: ["Հնվ", "Փետ", "Մար", "Ապր", "Մայ", "Հուն", "Հուլ", "Օգս", "Սեպ", "Հոկ", "Նոյ", "Դեկ"],
today: "Այսօր",
clear: "Ջնջել",
format: "dd.mm.yyyy",
weekStart: 1,
monthsTitle: 'Ամիսնէր'
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Bahasa translation for bootstrap-datepicker
* Azwar Akbar <azwar.akbar@gmail.com>
* Ardeman <mail@ardeman.com>
*/
(function () {
Datepicker.locales.id = {
days: ["Minggu", "Senin", "Selasa", "Rabu", "Kamis", "Jumat", "Sabtu"],
daysShort: ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"],
daysMin: ["Mg", "Sn", "Sl", "Rb", "Km", "Jm", "Sb"],
months: ["Januari", "Februari", "Maret", "April", "Mei", "Juni", "Juli", "Agustus", "September", "Oktober", "November", "Desember"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Agt", "Sep", "Okt", "Nov", "Des"],
today: "Hari Ini",
monthsTitle: "Bulan",
clear: "Kosongkan",
weekStart: 0,
format: "dd-mm-yyyy"
};
}());

View File

@@ -0,0 +1,14 @@
/**
* Icelandic translation for bootstrap-datepicker
* Hinrik Örn Sigurðsson <hinrik.sig@gmail.com>
*/
(function () {
Datepicker.locales.is = {
days: ["Sunnudagur", "Mánudagur", "Þriðjudagur", "Miðvikudagur", "Fimmtudagur", "Föstudagur", "Laugardagur"],
daysShort: ["Sun", "Mán", "Þri", "Mið", "Fim", "Fös", "Lau"],
daysMin: ["Su", "Má", "Þr", "Mi", "Fi", "Fö", "La"],
months: ["Janúar", "Febrúar", "Mars", "Apríl", "Maí", "Júní", "Júlí", "Ágúst", "September", "Október", "Nóvember", "Desember"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maí", "Jún", "Júl", "Ágú", "Sep", "Okt", "Nóv", "Des"],
today: "Í Dag"
};
}());

View File

@@ -0,0 +1,20 @@
/**
* Italian (Switzerland) translation for bootstrap-datepicker
* Christoph Jossi <c.jossi@ascami.ch>
* Based on
* Italian translation for bootstrap-datepicker
* Enrico Rubboli <rubboli@gmail.com>
*/
(function () {
Datepicker.locales['it-CH'] = {
days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
today: "Oggi",
clear: "Cancella",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Italian translation for bootstrap-datepicker
* Enrico Rubboli <rubboli@gmail.com>
*/
(function () {
Datepicker.locales.it = {
days: ["Domenica", "Lunedì", "Martedì", "Mercoledì", "Giovedì", "Venerdì", "Sabato"],
daysShort: ["Dom", "Lun", "Mar", "Mer", "Gio", "Ven", "Sab"],
daysMin: ["Do", "Lu", "Ma", "Me", "Gi", "Ve", "Sa"],
months: ["Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"],
monthsShort: ["Gen", "Feb", "Mar", "Apr", "Mag", "Giu", "Lug", "Ago", "Set", "Ott", "Nov", "Dic"],
today: "Oggi",
monthsTitle: "Mesi",
clear: "Cancella",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Japanese translation for bootstrap-datepicker
* Norio Suzuki <https: //github.com/suzuki/>
*/
(function () {
Datepicker.locales.ja = {
days: ["日曜", "月曜", "火曜", "水曜", "木曜", "金曜", "土曜"],
daysShort: ["日", "月", "火", "水", "木", "金", "土"],
daysMin: ["日", "月", "火", "水", "木", "金", "土"],
months: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
monthsShort: ["1月", "2月", "3月", "4月", "5月", "6月", "7月", "8月", "9月", "10月", "11月", "12月"],
today: "今日",
format: "yyyy/mm/dd",
titleFormat: "y年mm月",
clear: "クリア"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Georgian translation for bootstrap-datepicker
* Levan Melikishvili <levani0101@yahoo.com>
*/
(function () {
Datepicker.locales.ka = {
days: ["კვირა", "ორშაბათი", "სამშაბათი", "ოთხშაბათი", "ხუთშაბათი", "პარასკევი", "შაბათი"],
daysShort: ["კვი", "ორშ", "სამ", "ოთხ", "ხუთ", "პარ", "შაბ"],
daysMin: ["კვ", "ორ", "სა", "ოთ", "ხუ", "პა", "შა"],
months: ["იანვარი", "თებერვალი", "მარტი", "აპრილი", "მაისი", "ივნისი", "ივლისი", "აგვისტო", "სექტემბერი", "ოქტომბერი", "ნოემბერი", "დეკემბერი"],
monthsShort: ["იან", "თებ", "მარ", "აპრ", "მაი", "ივნ", "ივლ", "აგვ", "სექ", "ოქტ", "ნოე", "დეკ"],
today: "დღეს",
clear: "გასუფთავება",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Kazakh translation for bootstrap-datepicker
* Yerzhan Tolekov <era.tolekov@gmail.com>
*/
(function () {
Datepicker.locales.kk = {
days: ["Жексенбі", "Дүйсенбі", "Сейсенбі", "Сәрсенбі", "Бейсенбі", "Жұма", "Сенбі"],
daysShort: ["Жек", "Дүй", "Сей", "Сәр", "Бей", "Жұм", "Сен"],
daysMin: ["Жк", "Дс", "Сс", "Ср", "Бс", "Жм", "Сн"],
months: ["Қаңтар", "Ақпан", "Наурыз", "Сәуір", "Мамыр", "Маусым", "Шілде", "Тамыз", "Қыркүйек", "Қазан", "Қараша", "Желтоқсан"],
monthsShort: ["Қаң", "Ақп", "Нау", "Сәу", "Мам", "Мау", "Шіл", "Там", "Қыр", "Қаз", "Қар", "Жел"],
today: "Бүгін",
weekStart: 1
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Khmer translation for bootstrap-datepicker
* This is the Updated Version of: https: //github.com/uxsolutions/bootstrap-datepicker/blob/71308d42cce9524284c50c6fac50422d1790ac0f/js/locales/bootstrap-datepicker.kh.js
*/
(function () {
Datepicker.locales.km = {
days: ["អាទិត្យ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រហស្បតិ៍", "សុក្រ", "សៅរ៍"],
daysShort: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
daysMin: ["អា.ទិ", "ចន្ទ", "អង្គារ", "ពុធ", "ព្រ.ហ", "សុក្រ", "សៅរ៍"],
months: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
monthsShort: ["មករា", "កុម្ភះ", "មិនា", "មេសា", "ឧសភា", "មិថុនា", "កក្កដា", "សីហា", "កញ្ញា", "តុលា", "វិច្ឆិកា", "ធ្នូ"],
today: "ថ្ងៃនេះ",
clear: "សំអាត"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Korean translation for bootstrap-datepicker
* This is a port from https: //github.com/moment/moment/blob/develop/src/locale/ko.js
*/
(function () {
Datepicker.locales.ko = {
days: ["일요일", "월요일", "화요일", "수요일", "목요일", "금요일", "토요일"],
daysShort: ["일", "월", "화", "수", "목", "금", "토"],
daysMin: ["일", "월", "화", "수", "목", "금", "토"],
months: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
monthsShort: ["1월", "2월", "3월", "4월", "5월", "6월", "7월", "8월", "9월", "10월", "11월", "12월"],
today: "오늘",
clear: "삭제",
format: "yyyy-mm-dd",
titleFormat: "y년mm월",
weekStart: 0
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Lithuanian translation for bootstrap-datepicker
* Šarūnas Gliebus <ssharunas@yahoo.co.uk>
*/
(function () {
Datepicker.locales.lt = {
days: ["Sekmadienis", "Pirmadienis", "Antradienis", "Trečiadienis", "Ketvirtadienis", "Penktadienis", "Šeštadienis"],
daysShort: ["S", "Pr", "A", "T", "K", "Pn", "Š"],
daysMin: ["Sk", "Pr", "An", "Tr", "Ke", "Pn", "Št"],
months: ["Sausis", "Vasaris", "Kovas", "Balandis", "Gegužė", "Birželis", "Liepa", "Rugpjūtis", "Rugsėjis", "Spalis", "Lapkritis", "Gruodis"],
monthsShort: ["Sau", "Vas", "Kov", "Bal", "Geg", "Bir", "Lie", "Rugp", "Rugs", "Spa", "Lap", "Gru"],
today: "Šiandien",
monthsTitle: "Mėnesiai",
clear: "Išvalyti",
weekStart: 1,
format: "yyyy-mm-dd"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Latvian translation for bootstrap-datepicker
* Artis Avotins <artis@apit.lv>
*/
(function () {
Datepicker.locales.lv = {
days: ["Svētdiena", "Pirmdiena", "Otrdiena", "Trešdiena", "Ceturtdiena", "Piektdiena", "Sestdiena"],
daysShort: ["Sv", "P", "O", "T", "C", "Pk", "S"],
daysMin: ["Sv", "Pr", "Ot", "Tr", "Ce", "Pk", "Se"],
months: ["Janvāris", "Februāris", "Marts", "Aprīlis", "Maijs", "Jūnijs", "Jūlijs", "Augusts", "Septembris", "Oktobris", "Novembris", "Decembris"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mai", "Jūn", "Jūl", "Aug", "Sep", "Okt", "Nov", "Dec"],
monthsTitle: "Mēneši",
today: "Šodien",
clear: "Nodzēst",
weekStart: 1
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Montenegrin translation for bootstrap-datepicker
* Miodrag Nikač <miodrag@restartit.me>
*/
(function () {
Datepicker.locales.me = {
days: ["Nedjelja","Ponedjeljak", "Utorak", "Srijeda", "Četvrtak", "Petak", "Subota"],
daysShort: ["Ned", "Pon", "Uto", "Sri", "Čet", "Pet", "Sub"],
daysMin: ["Ne", "Po", "Ut", "Sr", "Če", "Pe", "Su"],
months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
today: "Danas",
weekStart: 1,
clear: "Izbriši",
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Macedonian translation for bootstrap-datepicker
* Marko Aleksic <psybaron@gmail.com>
*/
(function () {
Datepicker.locales.mk = {
days: ["Недела", "Понеделник", "Вторник", "Среда", "Четврток", "Петок", "Сабота"],
daysShort: ["Нед", "Пон", "Вто", "Сре", "Чет", "Пет", "Саб"],
daysMin: ["Не", "По", "Вт", "Ср", "Че", "Пе", "Са"],
months: ["Јануари", "Февруари", "Март", "Април", "Мај", "Јуни", "Јули", "Август", "Септември", "Октомври", "Ноември", "Декември"],
monthsShort: ["Јан", "Фев", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Ное", "Дек"],
today: "Денес",
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Mongolian translation for bootstrap-datepicker
* Andrey Torsunov <andrey.torsunov@gmail.com>
*/
(function () {
Datepicker.locales.mn = {
days: ["Ням", "Даваа", "Мягмар", "Лхагва", "Пүрэв", "Баасан", "Бямба"],
daysShort: ["Ням", "Дав", "Мяг", "Лха", "Пүр", "Баа", "Бям"],
daysMin: ["Ня", "Да", "Мя", "Лх", "Пү", "Ба", "Бя"],
months: ["Хулгана", "Үхэр", "Бар", "Туулай", "Луу", "Могой", "Морь", "Хонь", "Бич", "Тахиа", "Нохой", "Гахай"],
monthsShort: ["Хул", "Үхэ", "Бар", "Туу", "Луу", "Мог", "Мор", "Хон", "Бич", "Тах", "Нох", "Гах"],
today: "Өнөөдөр",
clear: "Тодорхой",
format: "yyyy.mm.dd",
weekStart: 1
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Marathi translation for bootstrap-datepicker
* Sushant Pimple <pimplesushant@gmail.com>
*/
(function () {
Datepicker.locales.mr = {
days: ["रविवार", "सोमवार", "मंगळवार", "बुधवार", "गुरुवार", "शुक्रवार", "शनिवार"],
daysShort: ["रवि", "सोम", "मंगळ", "बुध", "गुरु", "शुक्र", "शनि"],
daysMin: ["र", "सो", "मं", "बु", "गु", "शु", "श"],
months: ["जानेवारी", "फेब्रुवारी", "मार्च", "एप्रिल", "मे", "जून", "जुलै", "ऑगस्ट", "सप्टेंबर", "ऑक्टोबर", "नोव्हेंबर", "डिसेंबर"],
monthsShort: ["जाने.", "फेब्रु.", "मार्च", "एप्रिल", "मे", "जून", "जुलै", "ऑगस्ट", "सप्टें.", "ऑक्टो.", "नोव्हें.", "डिसें."],
today: "आज",
monthsTitle: "महीने",
clear: "हटवा",
weekStart: 1,
format: "dd / mm / yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Malay translation for bootstrap-datepicker
* Ateman Faiz <noorulfaiz@gmail.com>
*/
(function () {
Datepicker.locales.ms = {
days: ["Ahad", "Isnin", "Selasa", "Rabu", "Khamis", "Jumaat", "Sabtu"],
daysShort: ["Aha", "Isn", "Sel", "Rab", "Kha", "Jum", "Sab"],
daysMin: ["Ah", "Is", "Se", "Ra", "Kh", "Ju", "Sa"],
months: ["Januari", "Februari", "Mac", "April", "Mei", "Jun", "Julai", "Ogos", "September", "Oktober", "November", "Disember"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Mei", "Jun", "Jul", "Ogo", "Sep", "Okt", "Nov", "Dis"],
today: "Hari Ini",
clear: "Bersihkan"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Belgium-Dutch translation for bootstrap-datepicker
* Julien Poulin <poulin_julien@hotmail.com>
*/
(function () {
Datepicker.locales['nl-BE'] = {
days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
today: "Vandaag",
monthsTitle: "Maanden",
clear: "Leegmaken",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Dutch translation for bootstrap-datepicker
* Reinier Goltstein <mrgoltstein@gmail.com>
*/
(function () {
Datepicker.locales.nl = {
days: ["zondag", "maandag", "dinsdag", "woensdag", "donderdag", "vrijdag", "zaterdag"],
daysShort: ["zo", "ma", "di", "wo", "do", "vr", "za"],
daysMin: ["zo", "ma", "di", "wo", "do", "vr", "za"],
months: ["januari", "februari", "maart", "april", "mei", "juni", "juli", "augustus", "september", "oktober", "november", "december"],
monthsShort: ["jan", "feb", "mrt", "apr", "mei", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
today: "Vandaag",
monthsTitle: "Maanden",
clear: "Wissen",
weekStart: 1,
format: "dd-mm-yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Norwegian translation for bootstrap-datepicker
* George Gooding <george@nettsentrisk.no>
*/
(function () {
Datepicker.locales.no = {
days: ['søndag', 'mandag', 'tirsdag', 'onsdag', 'torsdag', 'fredag', 'lørdag'],
daysShort: ['søn', 'man', 'tir', 'ons', 'tor', 'fre', 'lør'],
daysMin: ['sø', 'ma', 'ti', 'on', 'to', 'fr', 'lø'],
months: ['januar', 'februar', 'mars', 'april', 'mai', 'juni', 'juli', 'august', 'september', 'oktober', 'november', 'desember'],
monthsShort: ['jan', 'feb', 'mar', 'apr', 'mai', 'jun', 'jul', 'aug', 'sep', 'okt', 'nov', 'des'],
today: 'i dag',
monthsTitle: 'Måneder',
clear: 'Nullstill',
weekStart: 1,
format: 'dd.mm.yyyy'
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Occitan translation for bootstrap-datepicker
*/
(function () {
Datepicker.locales.oc = {
days: ["Dimenge", "Diluns", "Dimars", "Dimècres", "Dijòus", "Divendres", "Dissabte"],
daysShort: ["Dim", "Dil", "Dmr", "Dmc", "Dij", "Div", "Dis"],
daysMin: ["dg", "dl", "dr", "dc", "dj", "dv", "ds"],
months: ["Genièr", "Febrièr", "Març", "Abrial", "Mai", "Junh", "Julhet", "Agost", "Setembre", "Octobre", "Novembre", "Decembre"],
monthsShort: ["Gen", "Feb", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Oct", "Nov", "Dec"],
today: "Uèi",
monthsTitle: "Meses",
clear: "Escafar",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Polish translation for bootstrap-datepicker
* Robert <rtpm@gazeta.pl>
*/
(function () {
Datepicker.locales.pl = {
days: ["Niedziela", "Poniedziałek", "Wtorek", "Środa", "Czwartek", "Piątek", "Sobota"],
daysShort: ["Niedz.", "Pon.", "Wt.", "Śr.", "Czw.", "Piąt.", "Sob."],
daysMin: ["Ndz.", "Pn.", "Wt.", "Śr.", "Czw.", "Pt.", "Sob."],
months: ["Styczeń", "Luty", "Marzec", "Kwiecień", "Maj", "Czerwiec", "Lipiec", "Sierpień", "Wrzesień", "Październik", "Listopad", "Grudzień"],
monthsShort: ["Sty.", "Lut.", "Mar.", "Kwi.", "Maj", "Cze.", "Lip.", "Sie.", "Wrz.", "Paź.", "Lis.", "Gru."],
today: "Dzisiaj",
weekStart: 1,
clear: "Wyczyść",
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Brazilian translation for bootstrap-datepicker
* Cauan Cabral <cauan@radig.com.br>
*/
(function () {
Datepicker.locales['pt-BR'] = {
days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
today: "Hoje",
monthsTitle: "Meses",
clear: "Limpar",
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Portuguese translation for bootstrap-datepicker
* Original code: Cauan Cabral <cauan@radig.com.br>
* Tiago Melo <tiago.blackcode@gmail.com>
*/
(function () {
Datepicker.locales.pt = {
days: ["Domingo", "Segunda", "Terça", "Quarta", "Quinta", "Sexta", "Sábado"],
daysShort: ["Dom", "Seg", "Ter", "Qua", "Qui", "Sex", "Sáb"],
daysMin: ["Do", "Se", "Te", "Qu", "Qu", "Se", "Sa"],
months: ["Janeiro", "Fevereiro", "Março", "Abril", "Maio", "Junho", "Julho", "Agosto", "Setembro", "Outubro", "Novembro", "Dezembro"],
monthsShort: ["Jan", "Fev", "Mar", "Abr", "Mai", "Jun", "Jul", "Ago", "Set", "Out", "Nov", "Dez"],
today: "Hoje",
monthsTitle: "Meses",
clear: "Limpar",
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Romanian translation for bootstrap-datepicker
* Cristian Vasile <cristi.mie@gmail.com>
*/
(function () {
Datepicker.locales.ro = {
days: ["Duminică", "Luni", "Marţi", "Miercuri", "Joi", "Vineri", "Sâmbătă"],
daysShort: ["Dum", "Lun", "Mar", "Mie", "Joi", "Vin", "Sâm"],
daysMin: ["Du", "Lu", "Ma", "Mi", "Jo", "Vi", "Sâ"],
months: ["Ianuarie", "Februarie", "Martie", "Aprilie", "Mai", "Iunie", "Iulie", "August", "Septembrie", "Octombrie", "Noiembrie", "Decembrie"],
monthsShort: ["Ian", "Feb", "Mar", "Apr", "Mai", "Iun", "Iul", "Aug", "Sep", "Oct", "Nov", "Dec"],
today: "Astăzi",
clear: "Șterge",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Russian translation for bootstrap-datepicker
* Victor Taranenko <darwin@snowdale.com>
*/
(function () {
Datepicker.locales.ru = {
days: ["Воскресенье", "Понедельник", "Вторник", "Среда", "Четверг", "Пятница", "Суббота"],
daysShort: ["Вск", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
daysMin: ["Вс", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
months: ["Январь", "Февраль", "Март", "Апрель", "Май", "Июнь", "Июль", "Август", "Сентябрь", "Октябрь", "Ноябрь", "Декабрь"],
monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
today: "Сегодня",
clear: "Очистить",
format: "dd.mm.yyyy",
weekStart: 1,
monthsTitle: 'Месяцы'
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Sinhala translation for bootstrap-datepicker
* Chanaka Fernando <chanaka.fernando@hotmail.com>
*/
(function () {
Datepicker.locales.si = {
days: ["ඉරිදා", "සඳුදා", "අඟහරුවාදා", "බදාදා", "බ්‍රහස්පතින්දා", "සිකුරාදා", "සෙනසුරාදා"],
daysShort: ["ඉරි", "සඳු", "අඟ", "බදා", "බ්‍රහ", "සිකු", "සෙන"],
daysMin: ["ඉ", "ස", "අ", "බ", "බ්‍ර", "සි", "සෙ"],
months: ["ජනවාරි", "පෙබරවාරි", "මාර්තු", "අප්‍රේල්", "මැයි", "ජුනි", "ජූලි", "අගෝස්තු", "සැප්තැම්බර්", "ඔක්තෝබර්", "නොවැම්බර්", "දෙසැම්බර්"],
monthsShort: ["ජන", "පෙබ", "මාර්", "අප්‍රේ", "මැයි", "ජුනි", "ජූලි", "අගෝ", "සැප්", "ඔක්", "නොවැ", "දෙසැ"],
today: "අද",
monthsTitle: "මාස",
clear: "මකන්න",
weekStart: 0,
format: "yyyy-mm-dd"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Slovak translation for bootstrap-datepicker
* Marek Lichtner <marek@licht.sk>
* Fixes by Michal Remiš <michal.remis@gmail.com>
*/
(function () {
Datepicker.locales.sk = {
days: ["Nedeľa", "Pondelok", "Utorok", "Streda", "Štvrtok", "Piatok", "Sobota"],
daysShort: ["Ned", "Pon", "Uto", "Str", "Štv", "Pia", "Sob"],
daysMin: ["Ne", "Po", "Ut", "St", "Št", "Pia", "So"],
months: ["Január", "Február", "Marec", "Apríl", "Máj", "Jún", "Júl", "August", "September", "Október", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Máj", "Jún", "Júl", "Aug", "Sep", "Okt", "Nov", "Dec"],
today: "Dnes",
clear: "Vymazať",
weekStart: 1,
format: "d.m.yyyy"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Slovene translation for bootstrap-datepicker
* Gregor Rudolf <gregor.rudolf@gmail.com>
*/
(function () {
Datepicker.locales.sl = {
days: ["Nedelja", "Ponedeljek", "Torek", "Sreda", "Četrtek", "Petek", "Sobota"],
daysShort: ["Ned", "Pon", "Tor", "Sre", "Čet", "Pet", "Sob"],
daysMin: ["Ne", "Po", "To", "Sr", "Če", "Pe", "So"],
months: ["Januar", "Februar", "Marec", "April", "Maj", "Junij", "Julij", "Avgust", "September", "Oktober", "November", "December"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
today: "Danes",
weekStart: 1
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Albanian translation for bootstrap-datepicker
* Tomor Pupovci <https: //www.github.com/ttomor>
*/
(function () {
Datepicker.locales.sq = {
days: ["E Diel", "E Hënë", "E Martē", "E Mërkurë", "E Enjte", "E Premte", "E Shtunë"],
daysShort: ["Die", "Hën", "Mar", "Mër", "Enj", "Pre", "Shtu"],
daysMin: ["Di", "Hë", "Ma", "Më", "En", "Pr", "Sht"],
months: ["Janar", "Shkurt", "Mars", "Prill", "Maj", "Qershor", "Korrik", "Gusht", "Shtator", "Tetor", "Nëntor", "Dhjetor"],
monthsShort: ["Jan", "Shk", "Mar", "Pri", "Maj", "Qer", "Korr", "Gu", "Sht", "Tet", "Nën", "Dhjet"],
monthsTitle: "Muaj",
today: "Sot",
weekStart: 1,
format: "dd/mm/yyyy",
clear: "Pastro"
};
}());

View File

@@ -0,0 +1,16 @@
/**
* Serbian latin translation for bootstrap-datepicker
* Bojan Milosavlević <milboj@gmail.com>
*/
(function () {
Datepicker.locales['sr-latn'] = {
days: ["Nedelja","Ponedeljak", "Utorak", "Sreda", "Četvrtak", "Petak", "Subota"],
daysShort: ["Ned", "Pon", "Uto", "Sre", "Čet", "Pet", "Sub"],
daysMin: ["N", "Po", "U", "Sr", "Č", "Pe", "Su"],
months: ["Januar", "Februar", "Mart", "April", "Maj", "Jun", "Jul", "Avgust", "Septembar", "Oktobar", "Novembar", "Decembar"],
monthsShort: ["Jan", "Feb", "Mar", "Apr", "Maj", "Jun", "Jul", "Avg", "Sep", "Okt", "Nov", "Dec"],
today: "Danas",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,16 @@
/**
* Serbian cyrillic translation for bootstrap-datepicker
* Bojan Milosavlević <milboj@gmail.com>
*/
(function () {
Datepicker.locales.sr = {
days: ["Недеља","Понедељак", "Уторак", "Среда", "Четвртак", "Петак", "Субота"],
daysShort: ["Нед", "Пон", "Уто", "Сре", "Чет", "Пет", "Суб"],
daysMin: ["Н", "По", "У", "Ср", "Ч", "Пе", "Су"],
months: ["Јануар", "Фебруар", "Март", "Април", "Мај", "Јун", "Јул", "Август", "Септембар", "Октобар", "Новембар", "Децембар"],
monthsShort: ["Јан", "Феб", "Мар", "Апр", "Мај", "Јун", "Јул", "Авг", "Сеп", "Окт", "Нов", "Дец"],
today: "Данас",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Swedish translation for bootstrap-datepicker
* Patrik Ragnarsson <patrik@starkast.net>
*/
(function () {
Datepicker.locales.sv = {
days: ["söndag", "måndag", "tisdag", "onsdag", "torsdag", "fredag", "lördag"],
daysShort: ["sön", "mån", "tis", "ons", "tor", "fre", "lör"],
daysMin: ["sö", "må", "ti", "on", "to", "fr", "lö"],
months: ["januari", "februari", "mars", "april", "maj", "juni", "juli", "augusti", "september", "oktober", "november", "december"],
monthsShort: ["jan", "feb", "mar", "apr", "maj", "jun", "jul", "aug", "sep", "okt", "nov", "dec"],
today: "Idag",
format: "yyyy-mm-dd",
weekStart: 1,
clear: "Rensa"
};
}());

View File

@@ -0,0 +1,15 @@
/**
* Swahili translation for bootstrap-datepicker
* Edwin Mugendi <https: //github.com/edwinmugendi>
* Source: http: //scriptsource.org/cms/scripts/page.php?item_id=entry_detail&uid=xnfaqyzcku
*/
(function () {
Datepicker.locales.sw = {
days: ["Jumapili", "Jumatatu", "Jumanne", "Jumatano", "Alhamisi", "Ijumaa", "Jumamosi"],
daysShort: ["J2", "J3", "J4", "J5", "Alh", "Ij", "J1"],
daysMin: ["2", "3", "4", "5", "A", "I", "1"],
months: ["Januari", "Februari", "Machi", "Aprili", "Mei", "Juni", "Julai", "Agosti", "Septemba", "Oktoba", "Novemba", "Desemba"],
monthsShort: ["Jan", "Feb", "Mac", "Apr", "Mei", "Jun", "Jul", "Ago", "Sep", "Okt", "Nov", "Des"],
today: "Leo"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Tamil translation for bootstrap-datepicker
* Abubacker Siddik A <abuabdul86@hotmail.com>
*/
(function () {
Datepicker.locales.ta = {
days: ["ஞாயிறு", "திங்கள்", "செவ்வாய்", "புதன்", "வியாழன்", "வெள்ளி", "சனி"],
daysShort: ["ஞாயி", "திங்", "செவ்", "புத", "வியா", "வெள்", "சனி"],
daysMin: ["ஞா", "தி", "செ", "பு", "வி", "வெ", "ச"],
months: ["ஜனவரி", "பிப்ரவரி", "மார்ச்", "ஏப்ரல்", "மே", "ஜூன்", "ஜூலை", "ஆகஸ்டு", "செப்டம்பர்", "அக்டோபர்", "நவம்பர்", "டிசம்பர்"],
monthsShort: ["ஜன", "பிப்", "மார்", "ஏப்", "மே", "ஜூன்", "ஜூலை", "ஆக", "செப்", "அக்", "நவ", "டிச"],
today: "இன்று",
monthsTitle: "மாதங்கள்",
clear: "நீக்கு",
weekStart: 1,
format: "dd/mm/yyyy"
};
}());

View File

@@ -0,0 +1,19 @@
/**
* Tajik (cyrillic) translation for bootstrap-datepicker
* Bakhtiyor Bahritidinov <i@bakhtiyor.tj>
* Orif N. Jr. <orif.zade@gmail.com>
*/
(function () {
Datepicker.locales.tg = {
days: ["Якшанбе", "Душанбе", "Сешанбе", "Чоршанбе", "Панҷшанбе", "Ҷумъа", "Шанбе"],
daysShort: ["Яшб", "Дшб", "Сшб", "Чшб", "Пшб", "Ҷум", "Шнб"],
daysMin: ["Яш", "Дш", "Сш", "Чш", "Пш", "Ҷм", "Шб"],
months: ["Январ", "Феврал", "Март", "Апрел", "Май", "Июн", "Июл", "Август", "Сентябр", "Октябр", "Ноябр", "Декабр"],
monthsShort: ["Янв", "Фев", "Мар", "Апр", "Май", "Июн", "Июл", "Авг", "Сен", "Окт", "Ноя", "Дек"],
today: "Имрӯз",
monthsTitle: "Моҳҳо",
clear: "Тоза намудан",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,14 @@
/**
* Thai translation for bootstrap-datepicker
* Suchau Jiraprapot <seroz24@gmail.com>
*/
(function () {
Datepicker.locales.th = {
days: ["อาทิตย์", "จันทร์", "อังคาร", "พุธ", "พฤหัส", "ศุกร์", "เสาร์", "อาทิตย์"],
daysShort: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
daysMin: ["อา", "จ", "อ", "พ", "พฤ", "ศ", "ส", "อา"],
months: ["มกราคม", "กุมภาพันธ์", "มีนาคม", "เมษายน", "พฤษภาคม", "มิถุนายน", "กรกฎาคม", "สิงหาคม", "กันยายน", "ตุลาคม", "พฤศจิกายน", "ธันวาคม"],
monthsShort: ["ม.ค.", "ก.พ.", "มี.ค.", "เม.ย.", "พ.ค.", "มิ.ย.", "ก.ค.", "ส.ค.", "ก.ย.", "ต.ค.", "พ.ย.", "ธ.ค."],
today: "วันนี้"
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Turkmen translation for bootstrap-datepicker
* N'Bayramberdiyev <nbayramberdiyev@outlook.com>
*/
(function () {
Datepicker.locales.tk = {
days: ["Ýekşenbe", "Duşenbe", "Sişenbe", "Çarşenbe", "Penşenbe", "Anna", "Şenbe"],
daysShort: ["Ýek", "Duş", "Siş", "Çar", "Pen", "Ann", "Şen"],
daysMin: ["Ýe", "Du", "Si", "Ça", "Pe", "An", "Şe"],
months: ["Ýanwar", "Fewral", "Mart", "Aprel", "Maý", "Iýun", "Iýul", "Awgust", "Sentýabr", "Oktýabr", "Noýabr", "Dekabr"],
monthsShort: ["Ýan", "Few", "Mar", "Apr", "Maý", "Iýn", "Iýl", "Awg", "Sen", "Okt", "Noý", "Dek"],
today: "Bu gün",
monthsTitle: "Aýlar",
clear: "Aýyr",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Turkish translation for bootstrap-datepicker
* Serkan Algur <kaisercrazy_2@hotmail.com>
*/
(function () {
Datepicker.locales.tr = {
days: ["Pazar", "Pazartesi", "Salı", "Çarşamba", "Perşembe", "Cuma", "Cumartesi"],
daysShort: ["Pz", "Pzt", "Sal", "Çrş", "Prş", "Cu", "Cts"],
daysMin: ["Pz", "Pzt", "Sa", "Çr", "Pr", "Cu", "Ct"],
months: ["Ocak", "Şubat", "Mart", "Nisan", "Mayıs", "Haziran", "Temmuz", "Ağustos", "Eylül", "Ekim", "Kasım", "Aralık"],
monthsShort: ["Oca", "Şub", "Mar", "Nis", "May", "Haz", "Tem", "Ağu", "Eyl", "Eki", "Kas", "Ara"],
today: "Bugün",
clear: "Temizle",
weekStart: 1,
format: "dd.mm.yyyy"
};
}());

View File

@@ -0,0 +1,17 @@
/**
* Ukrainian translation for bootstrap-datepicker
* Igor Polynets
*/
(function () {
Datepicker.locales.uk = {
days: ["Неділя", "Понеділок", "Вівторок", "Середа", "Четвер", "П'ятниця", "Субота"],
daysShort: ["Нед", "Пнд", "Втр", "Срд", "Чтв", "Птн", "Суб"],
daysMin: ["Нд", "Пн", "Вт", "Ср", "Чт", "Пт", "Сб"],
months: ["Січень", "Лютий", "Березень", "Квітень", "Травень", "Червень", "Липень", "Серпень", "Вересень", "Жовтень", "Листопад", "Грудень"],
monthsShort: ["Січ", "Лют", "Бер", "Кві", "Тра", "Чер", "Лип", "Сер", "Вер", "Жов", "Лис", "Гру"],
today: "Сьогодні",
clear: "Очистити",
format: "dd.mm.yyyy",
weekStart: 1
};
}());

View File

@@ -0,0 +1,18 @@
/**
* Uzbek cyrillic translation for bootstrap-datepicker
* Kakhramonov Javlonbek <kakjavlon@gmail.com>
*/
(function () {
Datepicker.locales['uz-cyrl'] = {
days: ["Якшанба", "Душанба", "Сешанба", "Чоршанба", "Пайшанба", "Жума", "Шанба"],
daysShort: ["Якш", "Ду", "Се", "Чор", "Пай", "Жу", "Ша"],
daysMin: ["Як", "Ду", "Се", "Чо", "Па", "Жу", "Ша"],
months: ["Январь","Февраль","Март","Апрель","Май","Июнь","Июль","Август","Сентябрь","Октябрь","Ноябрь","Декабрь"],
monthsShort: ["Янв","Фев","Мар","Апр","Май","Июн","Июл","Авг","Сен","Окт","Ноя","Дек"],
today: "Бугун",
clear: "Ўчириш",
format: "dd.mm.yyyy",
weekStart: 1,
monthsTitle: 'Ойлар'
};
}());

Some files were not shown because too many files have changed in this diff Show More