सस्ती!
Это он нам?
Пойдемте-ка отсюда,
милочка.
l10n это адаптация продукта для его соответствия языковым, культурным и прочим требованиям конкретного рынка.
i18n это процесс, в результате которого получается продукт, предусматривающий его простую локализацию для целевой аудитории в рамках многообразия её культур, регионов и языков.
Content-Type: text/html; charset=UTF-8
<meta
http-equiv="Content-type"
content="text/html;charset=UTF-8">
<meta charset="UTF-8">
1024
<link charset="Windows-1251"
rel="stylesheet" type="text/css"
href="styles.css"/>
<script charset="UTF-8"
src="script.js"></script>
<a charset="ISO-8859-1"
href="page.html"></a>
<link charset="Windows-1251"
rel="stylesheet" type="text/css"
href="styles.css"/>
<script charset="UTF-8"
src="script.js"></script>
<a charset="ISO-8859-1"
href="page.html"></a>
Content-Type: text/css; charset=UTF-8
@charset "UTF-8";
Content-Language: de, fr, it
<meta
http-equiv="Content-Language"
content="de, fr, it" />
<meta
http-equiv="Content-Language"
content="de, fr, it" />
<meta
name="dc.language"
content="en" />
<meta
name="dc.language"
content="en" />
<html lang="en-UK">
</html>
<article lang="und">
</article>
<article lang="zxx">
</article>
:lang(en-UK){
font-family: "PT Sans", sans-serif;
}
:lang(zh-Hans){
font-family: "SimSum-18030",
SimHei, serif;
}
<a
href="http://goo.gl/GJ2MeM"
hreflang="en">
The Battle for the Body Field
</a>
a[hreflang = 'sv']:after {
content: " [Swedish] ";
}
<meta
name="google"
value="notranslate"/>
<article class="notranslate">
</article>
<article translate="no">
</article>
<p dir="rtl"></p>
<p dir="ltr"></p>
<p dir="auto"></p>
<p>раз اثنان три</p>
<p dir="RTL">раз اثنان три</p>
раз اثنان три
раз اثنان три
раз اثنان три
раз اثنان три
<p>
раз, اثنان, три, أربعة.
</p>
<p dir="RTL">
раз, اثنان, три, أربعة.
</p>
раз, اثنان, три, أربعة.
раз, اثنان, три, أربعة.
раз, اثنان, три, أربعة.
раз, اثنان, три, أربعة.
<p>
раз, اثنان, три, четыре.
</p>
<p dir="RTL">
раз, اثنان, три, четыре.
</p>
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
<p>Оруэл عربي ١٩٨٤, رسائل</p>
<p dir="rtl">Оруэл عربي 1984, رسائل</p>
Оруэл عربي ١٩٨٤, رسائل
Оруэл عربي 1984, رسائل
Оруэл عربي ١٩٨٤, رسائل
Оруэл عربي 1984, رسائل
<p dir="RTL">
раз, اثنان, три, четыре.
</p>
<p dir="RTL">
раз, اثنان, три, четыре.‎
</p>
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
раз, اثنان, три, четыре.
<bdi></bdi>
<bdo dir="rtl">
Интересно, что получится?
</bdo>
Интересно, что получится?
.some{
direction: ltr
rtl
inherit;}
.some{
unicode-bidi: normal
embed
isolate
bidi-override
isolate-override
plaintext
inherit;}
.some{
writing-mode: horizontal-tb
vertical-rl
vertical-lr;
}
台湾来鸿:升温中的台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
台湾来鸿:升温中的台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
Российский МИД выпустил пространное заявление, в котором посоветовал Брюсселю уважать внеблоковый статус Киева и отказаться от заявлений в адрес Украины, которые Москва считает провокационными.
Российский МИД выпустил пространное заявление, в котором посоветовал Брюсселю уважать внеблоковый статус Киева и отказаться от заявлений в адрес Украины, которые Москва считает провокационными.
Российский МИД выпустил пространное заявление, в котором посоветовал Брюсселю уважать внеблоковый статус Киева и отказаться от заявлений в адрес Украины, которые Москва считает провокационными.
Российский МИД выпустил пространное заявление, в котором посоветовал Брюсселю уважать внеблоковый статус Киева и отказаться от заявлений в адрес Украины, которые Москва считает провокационными.
.some{
text-orientation: mixed
upright
sideways-right
sideways-left
sideways
use-glyph-orientation;
}
台湾来鸿:升温中的 20 台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
台湾来鸿:升温中的 20 台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
台湾来鸿:升温中的 20 台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
台湾来鸿:升温中的 20 台北市长选举
随着国民党荣誉主席连战之子连胜文正式宣布参选,台北市长选举选战逐渐升温。
.some{
text-combine-horizontal: none
all
digits [int];
}
<ruby>
<rb>Наш текст<rb>
<rt>Как читать</rt>
</ruby>
<ruby>
<rb>紙芝居<rb>
<rp>(<rp>
<rt>かみしばい</rt>
<rp>)<rp>
</ruby>
<ruby>
<rbc>
<rb>林<rb><rb>和</rb><rb>代</rb>
</rbc>
<rtc>
<rt>はやし</rt><rt rbspan="2">かず</rt>
</rtc>
</ruby>
<ruby>
<rbc><rb>民政局</rb></rbc>
<rtc><rt>みんせいきょく</rt></rtc>
<rtc><rt>ガバメント・セクシヨン</rt></rtc>
</ruby>
.some{
ruby-position: over
under
inter-character
right
left;
}
.some{
ruby-merge: separate
collapse
auto;
}
.some{
ruby-align: start
center
space-between
space-around;
}
http://w3.org/TR/#tr_Internationalization__All_
http://www.w3.org/TR/css3-writing-modes/
http://www.w3.org/TR/css3-ruby/
http://w3.org/blog/International/
http://multilingualweb.eu/
<section id="templates">
<section id="comment-template">
<article>
<img>
<p class="name"></p>
<p class="message"></p>
</article>
</section>
</section>
#templates{
display:none;
}
var template = document.getElementById('comment-template'),
template = template.cloneNode(true),
img = template.querySelector('img'),
nameit = template.querySelector('.name'),
message = template.querySelector('.message');
img.setAttribute('src','http://goo.gl/nZ9uCF');
nameit.textContent = 'Анна Франк';
message.textContent = 'Комментарий';
document.body.appendChild(template);
<template></template>
<template id="comment-template">
<article>
<img>
<p class="name"></p>
<p class="message"></p>
</article>
</template>
var template = document.getElementById('comment-template'),
template = template.content.cloneNode(true),
img = template.querySelector('img'),
nameit = template.querySelector('.name'),
message = template.querySelector('.message');
img.setAttribute('src','http://goo.gl/nZ9uCF');
nameit.textContent = 'Анна Франк';
message.textContent = 'Комментарий';
document.body.appendChild(template);
var template = document.getElementById('comment-template'),
template = template.content.cloneNode(true),
img = template.querySelector('img'),
nameit = template.querySelector('.name'),
message = template.querySelector('.message');
img.setAttribute('src','http://goo.gl/nZ9uCF');
nameit.textContent = 'Анна Франк';
message.textContent = 'Комментарий';
document.body.appendChild(template);
http://goo.gl/EBy9pN
<script src="handlebars.min.js"></script>
<template id="comment-template">
<article>
<img src="{{img.src}}" alt="{{img.alt}}"/>
<p class="name">{{name}}</p>
<p class="message">{{comment}}</p>
</article>
</template>
var template = document.getElementById('comment-template'),
template = Handlebars.compile(template.innerHTML),
data = {
img:{
src:"http://goo.gl/nZ9uCF",
alt:"Аватар"
},
name:"Анна Франк",
comment:"Комментарий"
};
document.body.innerHTML+=template(data);
http://handlebarsjs.com/
<script src="js/jquery.js">
</script>
<script src="js/i18next-1.7.2.min.js">
</script>
./locales/en/translation.json
/ru/translation.json
/ru-RU/translation.json
{"app": {
"name": "i18next эксперимент"
},
"nav": {
"about": "О проекте",
"contacts": "Контакты"
}}
<title data-i18n="app.name">
Значение по умолчанию
</title>
$.i18n.init().done(function(){
var node = document.querySelector(
'[data-i18n="app.name"]');
node.textContent = document.i18n.t(
'app.name');
});
$.i18n.init({
lng: 'ru',
fallbackLng: false
}).done(function(){
$('html').i18n();
});
i18n.detectLanguage();
i18next.setLng(
"en-UK",
function(){}
);
<p data-i18n="apple-count"></p>
{
"apple-count":
"Количество яблок: __apple-count__"
}
$.i18n.init({
lng: 'ru-RU'
}).done(function(){
$('[apple-count]').i18n({
"apple-count":3
});});
<p data-i18n="ihave"></p>
{
"ihave":"У меня __count__ яблок",
"ihave_plural_1": "У меня __count__ яблоко",
"ihave_plural_2": "У меня __count__ яблока",
"ihave_plural_5": "У меня __count__ яблок",
}
$.i18n.init({
lng: 'ru-RU'
}).done(function(){
$('[ihave]').i18n({
"count":302
});});
$.i18n.init({
lng: 'ru-RU'
}).done(function(){
$('[ihave]').i18n({
"count": 0
});});
i18n.pluralExtensions.addRule("ru", {
"name": "Rusian",
"numbers": [1,2,5],
"plurals": function (a){
return Number(1 … ?1:2);
}
});
i18n.pluralExtensions.addRule("ru", {
"name": "Rusian",
"numbers": [1,2,5,0],
"plurals": function (a){
return Number(0==a?3:1 … ?1:2);
}
});
{
"ihave":"У меня __count__ яблок",
"ihave_plural_0": "У меня нет яблок",
"ihave_plural_1": "У меня __count__ яблоко",
"ihave_plural_2": "У меня __count__ яблока",
"ihave_plural_5": "У меня __count__ яблок"
}
<p data-i18n="ipublish"></p>
{
"ipublish":"__name__ опубликовало статью",
"ipublish_male":"__name__ опубликовал статью",
"ipublish_female":"__name__ опубликовала статью"
}
$('.static, title').i18n({
"context": "male",
"name":"Костя"
});
http://storify.com/
http://i18next.com/
http://goo.gl/4aj4pG
http://goo.gl/gmf0Qu
https://github.com/jamuhl/i18next
$ bower install i18next
<h1 data-l10n-id="title"></h1>
<script
src="l20n.min.js">
</script>
<link
rel="localization"
href="browser.json">
{
"locales": ["ru","en"],
"default_locale": "ru",
"resources": [
"locales/{{locale}}/website.l20n"
]
}
<title "Simplest example">
<title "Простой пример">
<input
data-l10n-id="nameinput"
placeholder="default placeholder">
<nameinput
placeholder: "Как тебя зовут?">
<p data-l10n-id="save">
<input type="submit">
<a href="#" class="btn-cancel"></a>
</p>
<save """
<input
value="Сохранить"
type="text"> или
<a title="Вернуться назад">
отменить?</a>.
""">
или отменить?
<p data-l10n-id="message"></p>
<name "Настя">
<message """
Привет, {{ name }}!
""">
<name {
short: "Настя"
long: "Настасья Николаевна"}>
<message """
Привет, {{ name.long }}!
""">
<name {
*short: "Настя"
long: "Настасья Николаевна"}>
<message """
Привет, {{ name }}!
""">
<title["long"] {
short: "Настя",
long: "Настасья Николаевна"
}>
<p data-l10n-id="os"></p>
<os "ОС: {{ @os }}">
<p data-l10n-id="hour"></p>
<hour "Часов: {{ @hour }}">
<p data-l10n-id="screen"></p>
<screen "Ширина экрана:
{{ @screen.width.px }} px">
<script type="application/l10n-data+json">
{
"name": "Настя"
}
</script>
document.l10n.ready(function() {
var message = document.querySelector(
'[data-l10n-id="message"]');
message.textContent = document.l10n.getSync(
"message",
{
"name": "Настя"
});
});
<p data-l10n-id="publishing"></p>
<publishing[$gender] {
masculine: "{{$name}} написал вам сообщение",
feminine: "{{$name}} написала вам сообщение",
*unknown: "{{$name}} написало вам сообщение"
}>
document.l10n.ready(function() {
var node = document.querySelector(
'[data-l10n-id="publishing"]');
node.textContent = document.l10n.getSync(
"publishing",
{
"name": "Настя",
"gender": "feminine"
});
});
<plural($n) {
$n == 0 ? "zero" :
($n%100)>10&&($n%100)<20 ? "five" :
($n%10) == 1 ? "one" :
($n%10)>1&&($n%10)<5 ? "two" : "five"
}>
<messages[plural($newmessages)] {
zero: "У вас нет новых сообщений",
one: "У вас {{$newmessages}} новое сообщение",
two: "У вас {{$newmessages}} новых сообщения",
five: "У вас {{$newmessages}} новых сообщений"
}>
<plural($n) {
$n == 0 ? "zero" :
$n == 1 ? "one": "many"
}>
<messages[plural($newmessages)] {
zero: "There are no new messages",
one: "You have {{$newmessages}} new message",
many: "You have {{$newmessages}} new messages"
}>
document.l10n.ready(function() {
var node = document.querySelector(
'[data-l10n-id="messages"]');
node.textContent = document.l10n.getSync(
"messages",
{
newmessages: 1
});
});
<h1 data-l10n-id="settingsTitle"></h1>
<formFactor($n) {
$n.px > 1200 ? "large" :
$n.px > 980 ? "desktop" :
$n.px > 768 ? "landscapeTablet" :
$n.px > 480 ? "landscapePhone" :
"portraitPhone"
}>
<dataSettings[formFactor(@screen.width)] {
*large: "Настройки оповещений",
portraitPhone: "Настройки"
}>
http://l20n.org/
https://github.com/l20n/builds
$ bower install l20n
http://hg.mozilla.org/l10n/silme/summary
http://slexaxton.github.io/Jed/
http://github.com/SlexAxton/messageformat.js
— Jan Mühlemann @jamuhl
«@SilentImp looks interesting…if the demand for this raises i'm sure it will be added.»Антон Немцев
@silentimp
thesilentimp@gmail.com
skype: ravencry
http://github.com/SilentImp/localizaion