Локализација динамичке апликације као што је Спроут Социал на више језика је сложен подухват. Превођење текста који се појављује у апликацији само је половина приче. То такође укључује развој наше апликације на начин који олакшава издвајање и замену тог текста за преводе. У Спроуту се за преводе ослањамо на добављаче трећих страна. Али и даље су нам потребни алати за издвајање, груписање и подношење захтева за превод тим добављачима, а затим послуживање и приказивање превода крајњим корисницима.



Годинама се инжењерски тим Спроут сналазио са прилагођеним решењем за локализацију, пошто су решења отвореног кода тек сазревала. То нам је омогућило да наше највеће клијенте угостимо на подржаним језицима, али су нам недостајале неке корисне функције. У овом чланку ћу описати наш нови систем локализације, како се бави најкомпликованијим сценаријима локализације и како смо постепено уводили те промене у организацију веб инжењеринга.



Наш стари систем

Да бисте разумели наш нови систем локализације, прво морате да разумете како је функционисао наш стари систем и области у којима бисмо могли да га побољшамо.

Синтакса поруке

Локализација апликације функционише тако што се текст који је видљив крајњем кориснику апстрахује у стринг јединице, које се називају поруке. Ове поруке се издвајају и шаљу преводиоцима. Апстрактом ових стрингова можемо их лако заменити у зависности од жељеног језика крајњег корисника.

Ове поруке могу бити једноставни статички стрингови као што је „Здраво, свет“ или имати чуваре места као што је „Здраво, {наме}“ или форматирање богатог текста као што је „Здраво, свет“. Пошто ове функције морају бити серијализоване у стрингове, потребна вам је синтакса коју разумеју и преводиоци и код апликације да би правилно превели и приказали текст.

Део онога што је наш стари систем локализације чинило тешким за коришћење је то што смо направили сопствену синтаксу и одржавали домаћи „парсер“ за поменуту синтаксу. Одржавање овог кода је одузимало много времена, а синтакса је била прилично минимална. Желели смо додатне функције које ће помоћи у приказивању сложенијих порука.

Пример: У апликацији Спроут, потребан нам је начин приказивања „Имате Кс постове“ где је Кс динамичка нумеричка вредност.



Размотрите падеж множине: „Имате 5 постова ”. Размотрите једнини случај: „Имате 1 пошта ”. Размотрите случај „0“. Размислите о језицима који могу имати граматику за случај „1“ као што су кинески и јапански. Размотрите језике који имају граматику за случај када је Кс „велики број“, попут арапског, пољског и руског.

Управљање порукама

Имамо поруке које можемо послати преводиоцима и заменити их у нашој апликацији. Нашој апликацији је потребан начин за чување ових порука и њихово сервирање нашим крајњим корисницима.

Наш стари систем је чувао све наше поруке у ЈСОН датотекама (звали смо „ланг датотеке“), којима се управљало ручно. Реферирали смо на поруке у овим датотекама користећи ИД-ове у нашем изворном јавасцрипт коду. Када би корисник желео апликацију на шпанском, ми бисмо сервирали наше датотеке на шпанском језику, а затим би јавасцрипт приказао одговарајућу шпанску поруку користећи ИД.



Из разлога перформанси, покушали смо да испоручимо само корисничке поруке које су се налазиле на тој страници, тако да смо имали засебне ланг датотеке за различите странице апликације. Ово је био валидан систем, али како су се наш тим и апликација скалирали, то је значило више времена за ручно креирање и управљање овим ИД-овима и ланг датотекама.

  Снимак екрана ЈаваСцрипт-а који се раније користио за ручно управљање порукама и преводом у Спроуту's codebase.

Да би додали нову поруку у апликацију, програмери су морали ручно да их додају у исправну ланг датотеку са јединственим ИД-ом за референцу на ту поруку. Понекад бисмо наишли на проблеме са колизијама ИД-а и грешкама у куцању ИД-а које су довеле до недостатка језика у апликацији. Додавање текста у веб апликацију било је заморно са бројним корацима који нису били интуитивни.

Наше ново решење

Знајући ове недостатке, веб инжењери из целе организације производа су створили радну групу за локализацију да би развили решење. Редовно смо се састајали да размишљамо. Након процеса дубоког истраживања, одлучили смо да пребацимо Спроут апликацију из нашег домаћег система за локализацију да користимо ФорматЈС реаговати-интл библиотеку и око ње изградити инфраструктуру за управљање нашим порукама. Реацт-интл је била најбогатија и најпопуларнија библиотека за локализацију отвореног кода у јавасцрипт екосистему и добро интегрисана у нашу базу кода.

Синтакса поруке

Желели смо робусније решење и нисмо желели да креирамо нешто од нуле. Ми смо усвојили Синтакса ИЦУ поруке , стандардизована синтакса која се користи у Јава, ПХП и Ц апликацијама и обухвата сложеност порука динамичких апликација. Тхе реаговати-интл библиотека такође подржава рашчлањивање и приказивање порука синтаксе ИЦУ порука.


288 анђеоски број

  Упоредни пример како синтакса поруке ИЦУ-а обухвата множину случајева. Са леве стране је порука на енглеском, пре него што је преведена на руски. Десно је порука преведена на руски. Обратите пажњу на то како, када преводиоци конвертују ову поруку на друге језике, могу да додају и уклањају мала слова по потреби да би правилно подржали језик. Руски превод ове поруке додаје „мало“ и „много“ случајева.

Ово је пример како синтакса поруке ИЦУ-а обухвата множину случајева. Ово је порука на енглеском и руском језику. Обратите пажњу на то како, када преводиоци конвертују ову поруку на друге језике, могу да додају и уклањају мала слова по потреби да би правилно подржали језик. Руски превод ове поруке додаје „мало“ и „много“ случајева.

Синтаксу поруке ИЦУ-а су тестирале многе апликације на безброј језика. Могли бисмо да верујемо да може да подржи наше софистициране потребе купаца и да постоји много решења и/или образовних ресурса за сва локална питања на која смо наишли.

Управљање порукама

Развили смо систем користећи алате које обезбеђује ФорматЈС који би аутоматизовао процес додавања, уклањања и чувања порука. Ово је укључивало неке филозофске промене у начину на који смо приступили складиштењу и референцирању порука.

Велика промена у односу на наш стари систем коју ФорматЈС подстиче је коришћење нашег УИ кода као извора истине за поруке. У нашем претходном систему, извор порука и употреба порука били су на два различита места, што је значило да смо морали да их синхронизујемо. Наш нови систем чува изворе порука са остатком УИ кода. Једноставно треба да покренемо скрипту која ће издвојити све поруке из УИ датотека да бисмо генерисали наше ланг датотеке, а садржај поруке постаје јединствени ИД-ови уз помоћ хеш функције.

  Снимак екрана ЈаваСцрипт-а који се раније користио за аутоматско управљање порукама и преводом у Спроуту's codebase.

Ова промена колоцира поруке са УИ кодом и има неколико предности:

  • Читљивије: Нема више ИД-ова који су дизајнирани за роботе у нашем УИ коду. Сада можемо да читамо енглеске поруке у УИ коду и разумемо који ће текст корисник видети.
  • ИД-ови који нису ручни: Ове ИД-ове које су користиле само машине сада генеришу машине и по дефиницији су јединствене по поруци.
  • Нема ручно управљаних ланг датотека: Програмери не би требало да додирују ове ланг датотеке. Наше скрипте управљају додавањем и брисањем порука.

Како смо мигрирали?

Али како смо мигрирали цео наш тим за веб инжењеринг и базу кода на овај нови систем? Поделили смо ово на четири прекретнице: пилотирање новог система, едукација нашег тима, укидање старог система и прелазак на наше ново решење.

Пилотирање новог система

Радна група је пилотирала нови систем у одређеним деловима апликације како би стекла увид у његове најбоље праксе и пун обим миграције. Ово је поставило нови систем на страни клијента (полифиле, итд.) и на страни израде апликације. Ово нам је омогућило да поновимо искуство програмера и ублажимо ризик.

образовање

Узели смо оно што смо научили од пилота и искористили то за едукацију целог тима веб инжењеринга. Развили смо често постављана питања и другу образовну документацију и презентације како бисмо помогли програмерима који користе нову библиотеку. Лако је потценити овај корак, али овај део миграције је изузетно важан. Није важно колико је ваш нови систем добар – људи морају да знају како и зашто треба да га користе.

Такође смо развили програм амбасадора где је сваки тим за веб функције у Спроуту имао именованог амбасадора локализације, који је био одговоран за помоћ у едукацији њиховог тима о новом систему и извештавање о проблемима или болним тачкама радној групи.

Ово нам је омогућило да делегирамо образовне одговорности и идентификујемо проблеме који су специфични за појединачне тимове.

Одбацивање старог система

Након што смо се осећали сигурни у искуство програмера, дељено знање и потенцијал новог система, одбацили смо стари систем. Направили смо нека прилагођена еслинт правила и користили алатку за линтинг, есплинт , да блокирате коришћење старог система док дозвољавате постојеће употребе. Од овог тренутка, очекивало се да ће веб инжењери користити нови систем приликом писања новог кода.

Прелазак на наш нови систем

Са поверењем у наш нови систем и фиксним бројем старих употреба, почели смо да мигрирамо.


22:22

Многе употребе имале су еквиваленте један на један у новом систему. Тамо где постоје ови еквиваленти, успели смо да аутоматизујемо миграцију писањем кода-мода користећи јсцодесхифт . Били смо у могућности да итеративно покрећемо кодни мод преко делова базе кода, учећи и решавајући проблеме како смо ишли. Било је довољно преосталих ивичних случајева који се нису могли лако кодирати да бисмо се осећали пријатно да их поправимо ручно.

Изваљати

Зашто смо се одлучили за такав итеративни приступ уместо да покушамо да мигрирамо све одједном? Коришћење итеративног приступа део је Спроут-ове инжењерске културе и верујемо у стално учење и побољшање.

Приступајући миграцији на овај начин, могли смо да учимо како идемо, прилагођавајући и решавајући проблеме у реалном времену. Такође бисмо могли да вратимо промене ако је миграција почела да блокира развој апликација. Наш итеративни приступ нам је омогућио да напредујемо док радимо на другим иницијативама и омогућио нам је да обележимо велике промене са мањом групом пре него што их објавимо свима. Исти принципи развоја карактеристика за апликацију важе за развој интерних алата за програмере.

Учења и понети

Поновно замишљање нашег система локализације био је огроман подухват у целој организацији веб инжењеринга. Мој савет другима који се суочавају са сличним пројектима или изазовима би био да:

  • Користите широко прихваћене стандарде: Зашто креирати прилагођену синтаксу поруке када су инжењери који су провели године размишљајући о овом проблемском простору већ развили синтаксу порука за ИЦУ?
  • Размислите о заједничком лоцирању сродних ставки: То ће знатно олакшати њихово додавање, промену и брисање.
  • Прихватите итеративно увођење: Дизајнирајте увођење своје промене на начин који вам омогућава да учите док идете. Не можете све да предвидите, па уградите простор за коришћење у свој план.
  • Поделите своја сазнања: Образовање је пола увођења. Није важно колико је добар ваш нови систем ако људи не знају како да га користе или зашто је бољи.

За више информација о Спроутовој инжењерској култури, погледајте нашу страница каријере данас.

Подели Са Пријатељима: