reconstruindo a torre de babel com requirejs

42
Reconstruindo a torre de Babel com RequireJS e outras bibliotecas legais Criado por / Leo Moura @lfsmoura

Upload: tdc-globalcode

Post on 21-Jan-2017

514 views

Category:

Education


3 download

TRANSCRIPT

Page 1: Reconstruindo a Torre de Babel com RequireJS

Reconstruindo atorre de Babel

com RequireJSe outras bibliotecas legais

Criado por / Leo Moura @lfsmoura

Page 2: Reconstruindo a Torre de Babel com RequireJS

Pedra de Rosetta

Page 3: Reconstruindo a Torre de Babel com RequireJS
Page 4: Reconstruindo a Torre de Babel com RequireJS

Internacionalização - desenvolver software de maneira quedê suporte ou seja facilmente adaptado a usuários de

diferentes línguas ou expectativas culturais.

Page 5: Reconstruindo a Torre de Babel com RequireJS

i18n

"i" + "nternationalizatio".length + "n"// > "i18n"

l10n - localizationg11n - globalizationNLS - native language support

Page 6: Reconstruindo a Torre de Babel com RequireJS

Linguistas estimam que o número de línguas existentesseja em torno de 6000> 70% da Internet não fala inglêsLocalizar para 8 línguas significa atingir 80% da populaçãomundial

Page 7: Reconstruindo a Torre de Babel com RequireJS

Internacionalização - dificuldades

Page 8: Reconstruindo a Torre de Babel com RequireJS

Greece, Iran, Lebanon, Syria, Palestine, Turkey, Macedonia,Bulgaria, Albania, and Sicily

Page 9: Reconstruindo a Torre de Babel com RequireJS

Lost in Translation

Page 10: Reconstruindo a Torre de Babel com RequireJS

Internacionalização é muito maisque traduzir strings

People have exactly one canonical full name.People have exactly N names, for any value of N.People’s names fit within a certain defined amount ofspace.People’s names are written in ASCII.People’s names are written in any single character set.People’s names are all mapped in Unicode code points.People’s names are case sensitive.People’s names are case insensitive.People’s names do not contain numbers.

Page 11: Reconstruindo a Torre de Babel com RequireJS

My system will never have to deal with names from China.I can safely assume that this dictionary of bad wordscontains no people’s names in it.People have names.

Falsehoods programmers believe about names

Falsehoods programmers believe about adressess

Page 12: Reconstruindo a Torre de Babel com RequireJS

Como as linguas podem variardireção (esquerda para direita, direita para a esquerda)formato de data e horaformato dos númerospluraissímbolos e pontuaçãounidades de medidatamanhos de folhas de impressãoatalhos e teclasquestões culturais

Page 13: Reconstruindo a Torre de Babel com RequireJS

Estou ausente fui "almoçar"Estou ausente fui „almoçar“Estou ausente fui ”almoçar”Estou ausente fui «almoçar»Estou ausente fui 「almoçar」

Page 14: Reconstruindo a Torre de Babel com RequireJS

Microsoft ChecklistLook for geo-political sensitivity issues (e.g., borders maybe disputed between neighboring countries)Run with Complex scripts and Right to Left (RTL) supportVerify all controls function correctly with the East Asian(IME)Verify switching the keyboard to a different mappingworks correctlyVerify ANSI, double-byte, and Unicode text are handledcorrectly for display, input, and elsewhere (e.g., double-byte characters will be split if treated as ANSI)Verify any language-dependant features work correctly

Page 15: Reconstruindo a Torre de Babel com RequireJS

Javascript has a Unicode problem

Page 16: Reconstruindo a Torre de Babel com RequireJS

Microsoft ChecklistVerify extended and non-standard characters aredisplayed and handled correctlyVerify controls in dialogs and elsewhere are aligned andsized correctly (e.g., text is not truncated)Verify any functionality affected by the localizationprocess works correctlyVerify data is ordered correctlyVerify tab order is correctVerify no unlocalized strings remainVerify hot keys are [sic] localzied

Page 17: Reconstruindo a Torre de Babel com RequireJS

Show me the code

1. RequireJS + plugin i18n2. RequireJS + plugin Handlebars + FormatJS

Page 18: Reconstruindo a Torre de Babel com RequireJS

Detectando a língua no servidorvar app = require('express')();var appLocales = ['de', 'en', 'fr'];

app.get('/', function (req, res) { var locale = req.acceptsLanguages(appLocales) || 'en'; // ...customize the response to locale});

Page 19: Reconstruindo a Torre de Babel com RequireJS

BCP47

en - inglêsmas - Maasaipt-BR - Português do Brasiles-419 - Espanhol da América Latinazn-Hans - Chinês com caracteres simplificados

Page 20: Reconstruindo a Torre de Babel com RequireJS

Usando o plugin i18n

Page 21: Reconstruindo a Torre de Babel com RequireJS

Usando o plugin i18n

Page 22: Reconstruindo a Torre de Babel com RequireJS

Usando o plugin i18n

// js/nls/main.jsdefine({ root: true, "pt-br": true});// js/nls/root/main.jsdefine({ greetings: "hello world", home: "Home", about: "About"});// js/nls/pt-br/main.jsdefine({ greetings: "Olá mundo", home: "Home", about: "Sobre"});

Page 23: Reconstruindo a Torre de Babel com RequireJS

Usando o plugin i18n

requirejs(['i18n!nls/main'], function(lang) { console.log(lang);});

Page 24: Reconstruindo a Torre de Babel com RequireJS
Page 25: Reconstruindo a Torre de Babel com RequireJS
Page 26: Reconstruindo a Torre de Babel com RequireJS

Configurando manualmente a língua

require.config({ config: { i18n: { locale: 'pt-br' } }});

Page 27: Reconstruindo a Torre de Babel com RequireJS

Para formatar datas

Page 28: Reconstruindo a Torre de Babel com RequireJS

Usando handlebars e FormatJS

Page 29: Reconstruindo a Torre de Babel com RequireJS

Handlebars<div class="entry"> <h1>{{title}}</h1> <div class="body"> {{body}} </div> <ul> {{#each items}} <li>{{agree_button}}</li> {{/each}} </ul></div>

var context = {

items: [

{name: "Handlebars", emotion: "love"},

{name: "Mustache", emotion: "enjoy"},

{name: "Ember", emotion: "want to learn"}

]

};

Handlebars.registerHelper('agree_button', function() {

var emotion = Handlebars.escapeExpression(this.emotion),

name = Handlebars.escapeExpression(this.name);

return new Handlebars.SafeString(

"<button>I agree. I " + emotion + " " + name + "</button>"

);

});

Page 30: Reconstruindo a Torre de Babel com RequireJS

var source = $("#entry-template").html();var template = Handlebars.compile(source);

Page 31: Reconstruindo a Torre de Babel com RequireJS

require.config({ paths: { hbs: 'lib/require-handlebars-plugin/hbs' }, hbs: { helpers: false }});

require(['hbs!templates/main'], function(tplMain) { var text = tplMain();}

Page 32: Reconstruindo a Torre de Babel com RequireJS

<!-- js/templates/main.hbs --> <div class="content"> <div> {{formatMessage (intlGet "messages.welcome")}} {{name}} </div> <footer> <p>{{formatDate date day="numeric" month="long" year="numeric"}}</p> </footer> </div>

Page 33: Reconstruindo a Torre de Babel com RequireJS

// js/nls/pt-br.jsdefine({ locales: 'pt-BR', messages: { welcome: "Bem-vindo!" }});

Page 34: Reconstruindo a Torre de Babel com RequireJS

requirejs(['hbs/handlebars', 'handlebars-intl', 'hbs!templates/main', 'nls/pt-BR'], function(Handlebars, HandlebarsIntl, mainTpl, intlData) { HandlebarsIntl.registerWith(Handlebars); var context = { name: 'Leo', price: 1000, date: new Date() }; var text = mainTpl(context, { data: {intl: intlData} }); document.body.innerHTML = text;});

Page 35: Reconstruindo a Torre de Babel com RequireJS

Bem-vindo! Leo

24 de setembro de 2015

Page 36: Reconstruindo a Torre de Babel com RequireJS

fr

pt-BR

<ul> <li>{{formatNumber num}}</li> <li>{{formatNumber completed style="percent"}}</li> <li>{{formatNumber price style="currency" currency="USD"}}</li></ul>

42 000 90 % 100,95 $US

42.000 90% US$100,95

Page 37: Reconstruindo a Torre de Babel com RequireJS

en-US

pt-BR

<p>{{formatDate date day="numeric" month="long" year="numeric"}}</p>

September 24, 2015

24 de setembro de 2015

Page 38: Reconstruindo a Torre de Babel com RequireJS

<p> <b>{{formatRelative postDate}}</b> <b>{{formatRelative postDate units="minute"}}</b></p>

yesterday1,320 minutes ago

Page 39: Reconstruindo a Torre de Babel com RequireJS

<div> {{formatMessage (intlGet "messages.coffee_drinking") name=name numCups=numCups}}</div>

<div>{ coffee_drinking: "Usuário {name} {numCups, plural, \ =0 {não} \ other {} } tomou {numCups, plural,\ =0 {nenhuma xícara}\ =1 {uma xícara}\ other {# xícaras}} de café"}</div>

Usuário Leo não tomou nenhuma xícara de café

Page 40: Reconstruindo a Torre de Babel com RequireJS

ConcluindoInternacionalização é mais do que traduzir stringsProduzir software internacionalizado compensa no longoprazoNão reinventar a rodaContratar um nativo ou profissionalIncorporar internacionalização nos testes

Page 42: Reconstruindo a Torre de Babel com RequireJS

Muchas Gracias!@lfsmoura