सस्ती!
Это он нам?
Пойдемте-ка отсюда,
милочка.
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 l20nhttp://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