Commit 255badbb authored by Zéfling's avatar Zéfling 🎨
Browse files

Adding the language support

- Not use 'document' for 'baku' object
- Add support for french, english and japanese
- Partial translation of comments
- Code review
parent e417700c
......@@ -35,10 +35,10 @@ Quelques petites méthodes en plus, par ajout sur le prototype des objets de bas
## DOM
### Raccourcis
- <code>baku._id = document.elementById</code>
- <code>baku._first = document.querySelector</code>
- <code>baku._list = document.querySelectorAll</code>
- <code>baku._new = document.createElement</code>
- <code>baku.dom.id = document.elementById</code>
- <code>baku.dom.first = document.querySelector</code>
- <code>baku.dom.list = document.querySelectorAll</code>
- <code>baku.dom.new = document.createElement</code>
### Aides
- <code>HTMLElement._css()</code> : ajout s'implifié de CSS sur un élement du DOM
......@@ -50,7 +50,7 @@ Quelques petites méthodes en plus, par ajout sur le prototype des objets de bas
### Exemples
```js
baku._list('h2 + div')
baku.dom.list('h2 + div')
._css({'color' : 'red', 'text-decoration' : 'underline'})
._rmClass('ko');
```
......
baku.lg.add({en : {
monthNames : [ 'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
dayNames : [ 'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday' ],
math : {dot : '.', space : ","}
}});
baku.lg.add({fr : {
monthNames : ['janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre'],
dayNames : ['dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi'],
math : {dot : ',', space : "\u00A0"}
}});
baku.lg.add({ja : {
monthNames : [ '1月', '2月', '3月', '4月', '5月', '6月', '7月', '8月', '9月', '10月', '11月', '12月' ],
dayNames : [ '日曜日', '月曜日', '火曜日', '水曜日', '木曜日', '金曜日', '土曜日' ],
math : {dot : '.', space : ","}
}});
Date.prototype._monthNames = {
'fr' : [ 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre' ]
};
Date.prototype._dayNames = {
'fr' : [ 'dimanche', 'lundi', 'mardi', 'mercredi', 'jeudi', 'vendredi', 'samedi' ]
};
/**
* le nom du mois (suivant la langue donnée ou du navigateur)
* @param lg lg la langue, ex : 'fr' (factuatif)
* @return le nom du mois
* the name of mount (depending on given or browser language)
* @param lg the language, ex.: 'fr' (optional: default = navigator.language)
* @return the name of month
*/
Date.prototype._getMonthName = function(lg) {
return this._monthNames[lg||navigator.language][this.getMonth()];
return baku.lg(lg||navigator.language, 'monthNames.' + this.getMonth());
};
/**
* le nom du jour de la semaine (suivant la langue donnée ou du navigateur)
* @param lg la langue, ex : 'fr' (factuatif)
* the name of weekday (depending on given or browser language)
* @param lg the language, ex.: 'fr' (optional: default = navigator.language)
* @return le nom du jour de la semaine
*/
Date.prototype._getDayName = function(lg) {
return this._dayNames[lg||navigator.language][this.getDay()];
return baku.lg(lg||navigator.language, 'dayNames.' +this.getDay());
};
/**
* donne le jour de l'année en prenant en compte le changement d'heure (hiver/été)
* @return jour de l'année (0 à 365~366)
* the day of the year, taking into consideration the daylight saving time (winter/summer)
* @return the day of the year (0 to 365~366)
*/
Date.prototype._getDayOfYear = function () {
var date = (new Date(this.getFullYear(), 0, 0));
return Math.floor((this - date - (this.getUTCHours() - date.getUTCHours()) * 3.6e+6) / 8.64e+7);
};
/**
* donne le numéro de semaine
* @param premier premier jour de la semaine (0 = dimanche | 1 = lundi (ISO) / défaut = 1)
* @return numéro de semaine (1 à 52~53)
* the week number
* @param first first day of the week (0 = Sunday | 1 = Monday (ISO)) (optional: default = 1)
* @return week number (1 to 52~53)
*/
Date.prototype._getWeek = function (premier) {
var premier = typeof(premier) == 'number' ? premier : 1,
base = 4, // jeudi
Date.prototype._getWeek = function (first) {
var first = typeof(first) === 'number' ? first : 1,
base = 4, // Thursday
correction = 0,
premierAnPre = new Date(this.getFullYear(),0,0),
dernierJourAn= new Date(this.getFullYear() +1,0,0),
jourSemaine = (premierAnPre.getDay() + 7 + premier ) % 7;
firstDayYear = new Date(this.getFullYear(),0,0),
lastDayYear = new Date(this.getFullYear() +1,0,0),
weekDay = (firstDayYear.getDay() + 7 + first ) % 7;
if (premier == 1) {
if (first === 1) {
correction = -2;
}
num = Math.ceil( (this._getDayOfYear() + jourSemaine + correction) / 7) + (jourSemaine <= base ? 0 : -1);
num = Math.ceil( (this._getDayOfYear() + weekDay + correction) / 7) + (weekDay <= base ? 0 : -1);
if (num == 0) {
num = premierAnPre._getWeek(premier);
if (num === 0) {
num = firstDayYear._getWeek(first);
}
else {
var pos = (dernierJourAn._getDayOfYear() + 1 - (this._getDayOfYear() - this.getDay())) % 7;
var pos = (lastDayYear._getDayOfYear() + 1 - (this._getDayOfYear() - this.getDay())) % 7;
if (num > 52 && pos > 0 && pos < base) {
num = 1;
}
......@@ -62,64 +54,63 @@ Date.prototype._getWeek = function (premier) {
return num;
};
/** rules of date formatters */
var _dateFormatters = {
// date
yyyy : [/(^|[^\\])yyyy/ , function (d) {return d.getFullYear()}],
yy : [/(^|[^\\])yy/ , function (d) {return new String(d.getFullYear()).substr(2, 2)}],
MMMM : [/(^|[^\\])MMMM/ , function (d, lg) {return d._getMonthName(lg).replace(/(.)/g, '\\$1')}],
MMM : [/(^|[^\\])MMM/ , function (d, lg) {return d._getMonthName(lg).substr(0, 3).replace(/(.)/g, '\\$1')}],
MM : [/(^|[^\\])MM/ , function (d) {return new String(d.getMonth() + 1)._padLeft(2, '0')}],
M : [/(^|[^\\])M/ , function (d) {return (d.getMonth() + 1)}],
ww : [/(^|[^\\])ww/ , function (d) {return new String(d._getWeek())._padLeft(2, '0')}],
w : [/(^|[^\\])w/ , function (d) {return d._getWeek()}],
DDD : [/(^|[^\\])DDD/ , function (d) {return new String(d._getDayOfYear())._padLeft(2, '0')}],
D : [/(^|[^\\])D{1,2}/, function (d) {return d._getDayOfYear()}],
dd : [/(^|[^\\])dd/ , function (d) {return new String(d.getDate())._padLeft(2, '0')}],
d : [/(^|[^\\])d/ , function (d) {return d.getDate()}],
F : [/(^|[^\\])F/ , function (d) {return d.getDay()}],
EEEE : [/(^|[^\\])EEEE/ , function (d, lg) {return d._getDayName(lg).replace(/(.)/g, '\\$1')}],
EEE : [/(^|[^\\])EEE/ , function (d, lg) {return d._getDayName(lg).substr(0, 3).replace(/(.)/g, '\\$1')}],
E : [/(^|[^\\])E/ , function (d, lg) {return d._getDayName(lg).substr(0, 1).replace(/(.)/g, '\\$1')}],
yyyy : [/(^|[^\\])yyyy/ , function (d) {return d.getFullYear();}],
yy : [/(^|[^\\])yy/ , function (d) {return new String(d.getFullYear()).substr(2, 2);}],
MMMM : [/(^|[^\\])MMMM/ , function (d, lg) {return d._getMonthName(lg).replace(/(.)/g, '\\$1');}],
MMM : [/(^|[^\\])MMM/ , function (d, lg) {return d._getMonthName(lg).substr(0, 3).replace(/(.)/g, '\\$1');}],
MM : [/(^|[^\\])MM/ , function (d) {return new String(d.getMonth() + 1)._padLeft(2, '0');}],
M : [/(^|[^\\])M/ , function (d) {return (d.getMonth() + 1);}],
ww : [/(^|[^\\])ww/ , function (d) {return new String(d._getWeek())._padLeft(2, '0');}],
w : [/(^|[^\\])w/ , function (d) {return d._getWeek();}],
DDD : [/(^|[^\\])DDD/ , function (d) {return new String(d._getDayOfYear())._padLeft(2, '0');}],
D : [/(^|[^\\])D{1,2}/, function (d) {return d._getDayOfYear();}],
dd : [/(^|[^\\])dd/ , function (d) {return new String(d.getDate())._padLeft(2, '0');}],
d : [/(^|[^\\])d/ , function (d) {return d.getDate();}],
F : [/(^|[^\\])F/ , function (d) {return d.getDay();}],
EEEE : [/(^|[^\\])EEEE/ , function (d, lg) {return d._getDayName(lg).replace(/(.)/g, '\\$1');}],
EEE : [/(^|[^\\])EEE/ , function (d, lg) {return d._getDayName(lg).substr(0, 3).replace(/(.)/g, '\\$1');}],
E : [/(^|[^\\])E/ , function (d, lg) {return d._getDayName(lg).substr(0, 1).replace(/(.)/g, '\\$1');}],
// heure
a : [/(^|[^\\])a/ , function (d) {return (d.getHours() > 12 || d.getHours() === 0) ? 'PM' : 'AM'}],
HH : [/(^|[^\\])HH/ , function (d) {return new String(d.getHours())._padLeft(2, '0')}],
H : [/(^|[^\\])H/ , function (d) {return d.getHours()}],
kk : [/(^|[^\\])kk/ , function (d) {return new String(_dateFormatters.k[1](d))._padLeft(2, '0')}],
k : [/(^|[^\\])k/ , function (d) {return d.getHours() === 0 ? 24 : d.getHours()}],
KK : [/(^|[^\\])KK/ , function (d) {return new String(d.getHours() % 12)._padLeft(2, '0')}],
K : [/(^|[^\\])K/ , function (d) {return d.getHours() % 12}],
hh : [/(^|[^\\])hh/ , function (d) {return new String(_dateFormatters.h[1](d))._padLeft(2, '0')}],
h : [/(^|[^\\])h/ , function (d) {return d.getHours() > 12 ? d.getHours() % 12 : (d.getHours() === 0 ? 12 : d.getHours())}],
mm : [/(^|[^\\])mm/ , function (d) {return new String(d.getMinutes())._padLeft(2, '0')}],
m : [/(^|[^\\])m/ , function (d) {return d.getMinutes()}],
ss : [/(^|[^\\])ss/ , function (d) {return new Sring(d.getSeconds())._padLeft(2, '0')}],
s : [/(^|[^\\])s/ , function (d) {return d.getSeconds()}],
SSS : [/(^|[^\\])S{3,}/ , function (d) {return new String(d.getMilliseconds())._padLeft(3, '0')}],
S : [/(^|[^\\])S+/ , function (d) {return new String(d.getMilliseconds())}]
// hour
a : [/(^|[^\\])a/ , function (d) {return (d.getHours() > 12 || d.getHours() === 0) ? 'PM' : 'AM';}],
HH : [/(^|[^\\])HH/ , function (d) {return new String(d.getHours())._padLeft(2, '0');}],
H : [/(^|[^\\])H/ , function (d) {return d.getHours();}],
kk : [/(^|[^\\])kk/ , function (d) {return new String(_dateFormatters.k[1](d))._padLeft(2, '0');}],
k : [/(^|[^\\])k/ , function (d) {return d.getHours() === 0 ? 24 : d.getHours();}],
KK : [/(^|[^\\])KK/ , function (d) {return new String(d.getHours() % 12)._padLeft(2, '0');}],
K : [/(^|[^\\])K/ , function (d) {return d.getHours() % 12;}],
hh : [/(^|[^\\])hh/ , function (d) {return new String(_dateFormatters.h[1](d))._padLeft(2, '0');}],
h : [/(^|[^\\])h/ , function (d) {return d.getHours() > 12 ? d.getHours() % 12 : (d.getHours() === 0 ? 12 : d.getHours());}],
mm : [/(^|[^\\])mm/ , function (d) {return new String(d.getMinutes())._padLeft(2, '0');}],
m : [/(^|[^\\])m/ , function (d) {return d.getMinutes();}],
ss : [/(^|[^\\])ss/ , function (d) {return new Sring(d.getSeconds())._padLeft(2, '0');}],
s : [/(^|[^\\])s/ , function (d) {return d.getSeconds();}],
SSS : [/(^|[^\\])S{3,}/ , function (d) {return new String(d.getMilliseconds())._padLeft(3, '0');}],
S : [/(^|[^\\])S+/ , function (d) {return new String(d.getMilliseconds());}]
};
/**
* formater la date suivant un pattern
* @param pattern pour formater
* @param lg langue
* @return la date formatée
* format the date according to a pattern
* @param pattern pattern to format
* @param lg language (optional: default = navigator.language)
* @return formatted date
*/
Date.prototype._toStringFormat = function (pattern, lg) {
var reg, regex, str;
// protège les doubles \
str = pattern.replace(/\\\\/g, "[[\\\\]]");
var reg, regex,
str = pattern.replace(/\\\\/g, "[[\\\\]]"); // protects double \
// parcours toutes les règles
// loop all the rules
for (reg in _dateFormatters) {
regex = _dateFormatters[reg];
if (regex[0].test(str)) {
str = str.replace(regex[0], "$1" + regex[1](this, lg));
}
}
// dèprotection
// unprotect
return str
.replace(/\\(.)/g, "$1")
.replace(/\[\[\\\]\]/g, "\\");
......
var baku = document;
baku._id = document.elementById;
baku._first = document.querySelector;
baku._list = document.querySelectorAll;
baku._new = document.createElement;
baku._frag = document.createDocumentFragment;
baku.dom = {
id : function (id) { return document.elementById(id) },
first : function (selector) { return document.querySelector(selector) },
list : function (selector) { return document.querySelectorAll(selector) },
new : function (name) { return document.createElement(name) },
frag : function (name) { return document.createDocumentFragment(name) }
};
var DomArray = function() {};
for(key in Array.prototype) {
for(var key in Array.prototype) {
DomArray.prototype[key] = Array.prototype[key];
}
/**
* test if it's a string
* @param s object test
* @return true is s is a string object
*/
function isString(s) {
return typeof(s) === 'string' || s instanceof String;
}
/**
* ajout d'un style sur un élement.
* @get si value === undefined
......@@ -54,7 +46,7 @@ HTMLElement.prototype._css = function (name, value) {
* @return l'élement
*/
HTMLElement.prototype._addClass = function (classes) {
if (isString(classes)) {
if (baku.isString(classes)) {
classes = classes.split(/\s+/);
}
for (var i in classes) {
......@@ -69,7 +61,7 @@ HTMLElement.prototype._addClass = function (classes) {
* @return l'élement
*/
HTMLElement.prototype._rmClass = function (classes) {
if (isString(classes)) {
if (baku.isString(classes)) {
classes = classes.split(/\s+/);
}
for (var i in classes) {
......@@ -147,12 +139,12 @@ DomArray.prototype._first = function (selector) {
*/
NodeList.prototype._list =
DomArray.prototype._list = function (selector) {
var e, k = 0, list = new DomArray();
for (var i in this) {
var e, i, j, list = new DomArray();
for (i in this) {
if (this[i] instanceof HTMLElement) {
e = this[i].querySelectorAll(selector);
if (e.length > 0) {
for(var j in e) {
for(j in e) {
if (e[j] instanceof HTMLElement) {
list[list.length] = e[j];
}
......
var baku = {};
/**
* get message by language
* @param lg language id
* @param path path of message
* @return message or 'undefined' if not found
*/
baku.lg = function(lg, path) {
var text;
if (this.lg.lg[lg]) {
text = baku.get(this.lg.lg[lg], path.split('.'));
}
return text;
};
/**
* add a language object
* @param lg object
*/
baku.lg.add = function (lg) {
this.lg = baku.extend(this.lg, lg);
};
/**
* test if it's a string
* @param s object test
* @return true is s is a string object
*/
baku.isString= function(s) {
return typeof(s) === 'string' || s instanceof String;
};
/**
* merged object 2 objects
* @param base source object
* @param add adding object in source object
* @return merged object
*/
baku.extend = function (base, add) {
if (typeof(base) === 'object' && !(base instanceof Array)) {
for(var i in add) {
base[i] = baku.extend(base[i], add[i]);
}
} else {
base = add;
}
return base;
};
/**
* get value in object
* @param o object
* @param path path in object
* @return value of path or 'undefined' if not found
*/
baku.get = function (o, path) {
var val, base = o[path.shift()];
if (typeof (base) === 'object' && path.length > 0) {
val = baku.get(base, path);
}
else if (base) {
val = base;
}
return val;
};
\ No newline at end of file
/* For IE */
if (!Math.trunc) {
Math.trunc = function(x) {
return x < 0 ? Math.ceil(x) : Math.floor(x);
......@@ -12,4 +13,4 @@ if (!Math.trunc) {
*/
Math._roundDecimal = function(number, decimalSize) {
return Math.round( +(number +'e'+ (decimalSize))) / +('1e'+decimalSize);
}
\ No newline at end of file
};
\ No newline at end of file
......@@ -44,19 +44,13 @@ Number.prototype._formatByPattern = function(pattern, params) {
throw 'patten error : '+pattern;
}
if (format.dot === undefined) {
switch (lg) {
case 'en' : format.dot = '.'; break;
case 'fr' : format.dot = ','; break;
}
format.dot = baku.lg(lg ,'math.dot');
}
if (format.space === undefined) {
switch (lg) {
case 'en' : format.space = ','; break;
case 'fr' : format.space = "\u00A0"; break;
}
format.space = baku.lg(lg, 'math.space');
}
return this._format(format);
}
};
/**
* formatage suivant paramètre
......@@ -77,7 +71,7 @@ Number.prototype._format = function(format) {
unit = format.unit||'',
decimalSize = format.decimalSize > 0 ? format.decimalSize : 0;
if (unit.trim() == '%') {
if (unit.trim() === '%') {
val = val * 100;
}
......@@ -94,7 +88,7 @@ Number.prototype._format = function(format) {
var decimal = '';
if(format.decimalSize > 0) {
decimal = (valueAsStr[3]||'0').substring(0, format.decimalSize);
if (decimal == '0') {
if (decimal === '0') {
decimal = '';
}
if (format.decimalZeroSize > 0) {
......@@ -105,4 +99,4 @@ Number.prototype._format = function(format) {
}
}
return valueAsStr[1] + entier + decimal + unit;
}
};
......@@ -6,7 +6,10 @@ Formatter.choice = function (val, vals, arg) {
val = typeof(val) === 'string' ? val.trim() : val,
choicesRegex = /\s*([-\da-zA-Z]+)\s*(#|[><]=?)\s*((?:\\.|[^|])+)/g;
while((c = choicesRegex.exec(arg)) !== null) {
var test = c[1], etat = c[2], result = c[3].replace('\\|', '|').trim();
var test = c[1],
etat = c[2],
result = c[3].replace('\\|', '|').trim();
if((etat === "#" && val == test) ||
(etat === "<=" && val <= test) ||
(etat === "<" && val < test) ||
......
......@@ -101,7 +101,7 @@ String.prototype._padLeft = function(n, str, mode) {
var adding = n - this.length,
size = Math.trunc(adding / str.length + 1),
cut = str.length - (adding % str.length);
return str.substring(cut, str.length) + Array(size).join(str || ' ') + this
return str.substring(cut, str.length) + Array(size).join(str || ' ') + this;
}
};
......@@ -130,7 +130,6 @@ String.prototype._padRight = function(n, str, mode) {
var adding = n - this.length,
size = Math.trunc(adding / str.length + 1),
cut = adding % str.length;
return this + Array(size).join(str) + str.substring(0, cut)
break;
return this + Array(size).join(str) + str.substring(0, cut);
}
};
This diff is collapsed.
......@@ -20,6 +20,5 @@ td {
}
.em {
font-style: italic;
font-size: 80%;
font-size: 80%;
}
\ No newline at end of file
......@@ -3,6 +3,9 @@
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8" />
<title>BakuJS - test</title>
<script type="text/javascript" src="baku.js"></script>
<script type="text/javascript" src="baku-lg/en.js"></script>
<script type="text/javascript" src="baku-lg/fr.js"></script>
<script type="text/javascript" src="baku.date.js"></script>
<script type="text/javascript" src="baku.dom.js"></script>
<script type="text/javascript" src="baku.math.js"></script>
......
var Test = {};
Test.title = function (title) {
var b = baku._new("h2");
var b = baku.dom.new("h2");
b.textContent = title;
document.body.appendChild(b);
};
Test.equals = function (test, equals, message) {
var result, ok, time1, time2, b = baku._new("div");
var result, ok, time1, time2, b = baku.dom.new("div");
try {
time1 = performance.now ? performance.now() : Date.now();
result = eval(test);
......@@ -22,7 +22,7 @@ Test.equals = function (test, equals, message) {
};
Test.error = function (test) {
var ok = false, time1, time2, message = 'valide ?', b = baku._new("div");
var ok = false, time1, time2, message = 'valide ?', b = baku.dom.new("div");
try {
time1 = performance.now ? performance.now() : Date.now();
result = eval(test);
......@@ -263,5 +263,4 @@ window.onload = function(){
Test.equals("'{0, date, \\\\w\\\\e\\\\e\\\\kw\\\\\\\\yyyy}'._format('2015-10-20')", 'week43\\2015', '2015-10-20 + {0, date, \\w\\e\\e\\kw\\\\yyyy} → week43\\2015');
Test.equals("'{0, date, {1}}'._format(['2015-10-20', 'dd/MM/yyyy'])", '20/10/2015', '[2015-10-20, dd/MM/yyyy] + {0, date, {1}} → 20/10/2015');
}
};
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment