W tym samouczku zabierzemy Cię przez proces udostępniania aplikacji i przyjaznych dla użytkownika dla osób na całym świecie. Tylko około 20 procent świata mówi po angielsku, więc dostarczanie innych opcji językowych może poprawić swoje doświadczenie użytkownika i znacznie zwiększyć zasięg aplikacji. Zajmujemy się wbudowaną internacjonalizację Narzędzia Kątowe i pokazujemy, jak ich poprawnie korzystać.
Jeśli budujesz witrynę, a nie aplikację, upewnij się, że masz swój zestaw narzędzi w prawo. Zobacz nasze przewodniki do najlepszych Kreator strony internetowej i top hosting by dowiedzieć się więcej.
Stworzyliśmy bardzo prostą aplikację demonstracyjną, aby zademonstrować proces. Clone go stąd a następnie postępuj zgodnie z instrukcjami instalacji.
Uruchom aplikację, aby zapoznać się z nim. Po prostu wyświetla i aktualizuje liczby losowe i wartości z różnymi kontekstami, np. Waluty, daty itp. Obejmujemy niektóre rury i funkcje używane podczas samouczka.
Istnieją dwa słowa, które są często używane zamiennie, mówiąc o tłumaczeniu aplikacji - internacjonalizację i lokalizację - jednak rzeczywiście oznaczają nieco inne rzeczy. Internacjonalizacja odnosi się do procesu przygotowania aplikacji do wspierania różnych języków. Natomiast lokalizacja odnosi się do procesu rzeczywiście tłumaczenia aplikacji do wymaganych języków. Zasadniczo internacjonalizacja jest czymś, co robisz raz na aplikację, a lokalizacja zdarza się raz na lokalizację - przynajmniej to plan.
Terminy te mogą również znać w skróconych wersjach: I18n (gdzie 18 jest liczba liter między pierwszym "i" i ostatnią "n" międzynarodową) i L10N (gdzie 10 jest liczba liter między "i" i "n" lokalizacji).
Na całym świecie używane jest ponad 6000 języków, z których większość jest używana tylko przez bardzo małe grupy ludzi. Jednak nawet skupimy się tylko na trzema trzech językach - mandaryńskim, hiszpańskim i angielskim - będą istotne różnice w formatowaniu daty, struktury gramatycznej, pluralizacji i formatowania numerów.
Jeśli uwzględnimy piąty najczęściej używany język - arabski - napotykamy kolejną różnicę; Arabski jest skryptem prawej do lewej (RTL), co oznacza, że UI będzie musiała być odzwierciedlona.
Tak w trakcie lokalizacji musimy rozważyć gramatykę, układ i formatowanie różnic, a oczywiście musimy również zmienić sam tekst. Kątowy może pomóc w wielu z tego, ale nadal będziesz musiał ręcznie przetłumaczyć tekst (i zapisać tłumaczenie magazyn w chmurze , więc jest bezpieczny i udostępniony ze swoim zespołem).
Będziemy musieli lokalizować za każdą lokalizację, którą musimy wspierać. Local odnosi się do ogólnego zestawu preferencji w zakresie wspomnianych powyżej rozważań, które mają tendencję do dzielenia się w regionie świata, zazwyczaj kraju. Każde ustawienia regionalne jest reprezentowane przez identyfikator Unicode UnCode, który określa kod językowy i rozszerzenie ustawień regionalnych.
Domyślne ustawienie kątowe jest "en-us", który jest kodem językowym "EN" (angielski), jak mówiono w regionie "USA" (Stany Zjednoczone Ameryki). Aplikacja zlokalizowana dla "En-USA" będzie subtelnie różna od aplikacji zlokalizowanej dla "EN-GB", co jest angielski, który jest używany w Wielkiej Brytanii. Na przykład w datach USA są (bafflowanie) sformatowane mm / dd / rrrr, podczas gdy tutaj w Wielkiej Brytanii stosujemy bardziej rozsądne podejście DD / mm / rrrr. Ta niewielka różnica może spowodować poważnego błędu w zrozumieniu.
Aby rzeczy ciekawe zlokalizujmy naszą aplikację demonstracyjną na język arabski, jak mówiono w Iraku, aka "Ar-IQ" i angielski, jak mówił w Wielkiej Brytanii, aka "EN-GB". Tym razem użyjemy angielskiego jako domyślnego.
Nasz projekt demonstracyjny został stworzony za pomocą kątowego CLI, który zawiera kilka przydatnych narzędzi. Użyjemy kompilatora z wyprzedzeniem (AOT) dla tego projektu, abyśmy musimy dokonać pewnych zmian w pliku konfiguracyjnym CLIS: "Angular.json '. Jeśli chcesz używać tylko w czasie (JIT), musisz skonfigurować rzeczy nieznacznie inaczej.
Przy kompilacie AOT otrzymasz małe, szybsze renderowanie gotowej aplikacji, która ładuje się bez konieczności asynchronicznego żądań, aby pobrać rzeczy, takie jak szablony i arkusze stylów. W rezultacie musisz utworzyć kompilację dla każdej ustawień regionalnych i służyć odpowiedniej kompilacji przy użyciu adresu URL lub jakiejś rodzaju logiki wykrywania języka po stronie serwera. Najprostszym podejściem jest utworzenie katalogu dla każdego regionu, np. www.example.com/en-gb i www.example.com/ar-iq. Handonem jest to, że nie możesz przełączać języka w locie, ale w rzeczywistości, która jest mało prawdopodobna, aby była czymś wymaganym przez prawdziwych użytkowników.
Przede wszystkim musimy dodać konfigurację budowy naszego arabskiego lokalizacji. W pliku JSON poszukuje obiektu "Architect.Build.configurations". Dodaj następujący blok, aby zdefiniować konfigurację dla lokalizacji:
"Ar-IQ": {
"Basehref": "/ AR-IQ /",
"deployurl": "/ AR-IQ /",
"WyjściePath": "DEST / KANICE-I18N-DEMO /
ar-iq ",
"I18NFile": "SRC / Locale / Wiadomości.AR-IQ.
xlf ",
"I18nformat": "XLF",
"I18nLocale": "Ar-IQ"
Ta konfiguracja informuje kątowa, gdzie wyjeżdża kompilację kompilacji i które przesyłają pliki i format. Ustawia również ustawienia regionalne i informuje kanciasty, który katalog zostanie wdrożony.
Musimy również zmodyfikować domyślne opcje w "Architect.Build.Options", aby użyć lokalizacji "EN-GB". Ustaw następujące właściwości, jak pokazano. Uwaga Włączamy AOT tutaj w całym Zarządzie, więc zostaną wykorzystane do budowy produkcji i rozwoju:
"WyjściePath": "DEST / Kąt-I18N-Demo /
EN-GB ",
"I18nLocale": "EN-GB",
"deployurl": "/ en-gb /",
"BaseHref": "/ EN-GB /",
"Aot": Prawda
Kątowa obsługuje wiele miejsc. Upewnij się, że używasz prawidłowej wartości nieruchomości "I18nlocale". Możesz zobaczyć pełną listę tutaj .
Za scenami Powyższe konfiguracje po prostu ładują i odczytywają z jednego z tych plików preferencji ustawień regionalnych.
Oprócz konfigurowania wyjścia budowy musimy również skonfigurować konfigurację dla polecenia "Ng Serve" dla rozwoju. Jest to bardziej proste, ponieważ możemy po prostu odwołać się do konfiguracji kompilacji, którą właśnie dodaliśmy. W "Angular.json" Dodaj następujący blok na "Architect.Serve.configurations":
"Ar-IQ": {
"Browersertarget": "Kąt-I18N-
Demo: Buduj: Ar-IQ ",
"Servepath": "/ AR-IQ /"
}
Tutaj odnosimy opcje konfiguracji kompilacji za pomocą własności "Browsertarget", a także ustawić "servepath". Zanim będziemy mogli służyć lub zbudować aplikację arabską, musimy utworzyć plik tłumaczenia, do których wymienić "I18NFile" właściwość powyżej. Kątowy CLI zawiera narzędzie do wyodrębniania flagowanego tekstu w pliku źródłowym klasy standardowej.
Zajmujemy te pliki bardziej szczegółowo w samouczku, ale na razie musimy wystawać do eksportowania podstawowego, pustego pliku, aby umożliwić nam kompilację.
Użyjemy polecenia "NG XI18N" z następującymi opcjami. To jedyny czas, abyśmy uwzględnili identyfikator lokalizacji w nazwie "--out-file":
$ ng XI18N --Output-Path Locale --out-Plik
Wiadomości.AR-IQ.XLF --I18N-Locale AR-IQ
Powinien to utworzyć plik w katalogu SRC / Locale. Od teraz zawsze wyświetlymy plik o nazwie "wiadomości.xlf" i ręcznie skopiuj go w wersji z identyfikatorem lokalizacji w nazwie. Powodem tego jest, aby zapobiec nadpisywaniu narzędzia do wydobycia jakichkolwiek istniejących tłumaczeń dodaliśmy do pliku.
W tym momencie możemy teraz skompilować projekt i zobaczyć, co się stanie, ale musimy powiedzieć polecenie "Ng Serve", która konfiguracja użycia. Najpierw spójrzmy na wersję angielską. Nie ma tu zmian, ponieważ angielski jest domyślny:
$ ng służy
Jak widać, wygląda podobnie jak oryginalna wersja, która wykorzystuje domyślne ustawienia kątowe "en-us". Godną znaczącą różnicą jest waluta teraz określa US $ zamiast tylko $. Dobra, spróbujmy teraz wypróbować wersję arabską. Zatrzymaj wersję angielską i uruchom:
$ Ng Serve --Configuration = AR-IQ
Jak można oczekiwać, że w tej wersji jest bardziej oczywiste różnice, w szczególności data jest teraz napisana w języku arabskim. Kątowa może to zrobić, ponieważ nazwy niektórych rzeczy, takich jak miesiące i dni, pochodzą z ustalonej listy, a ostatecznie odnoszą się do znanej liczby. Wszystko inne jest jednak nadal w języku angielskim.
Przyjrzyj się bliżej kodu źródłowego "app.component.html", a zobaczysz, że używamy wielu różnych rur. Poniższe rury kątowe są narodowe, co oznacza, że dostosowywają ich produkcję na podstawie bieżących ustawień lokalnych: "DatePipe", "Currencipipe", "dziewialnik" i "perspondencję".
Jeśli używasz tych rur starannie kątowych, obsługuje dla ciebie wiele lokalizacyjnych Legwork dla Ciebie. Ostrożnie mamy na myśli, że korzystaj z dostępnych predefiniowanych opcji, gdziekolwiek możesz. Dobrym przykładem jest formatowanie daty amerykańskiej VS Wielkiej Brytanii, wspomnialiśmy wcześniej. Jeśli jesteś w Wielkiej Brytanii i chcesz wyświetlić datę za pomocą (rozsądnego) formatu dziennego miesiąca, możesz być sfrustrowany, aby znaleźć, że opcja predefiniowanego "" ShortDate "" renderuje jako m / d / yy (np. . 10/9/18) I pokusiłem, aby utwardzony wybrany format taki jak:
{{mydate | Data: "dd / mm / y '}}
Ale teraz wiemy, że otrzymujemy format m / d / yy, ponieważ kanciasty domyślnie używa lokalizacji "EN-US". Więc zamiast hardcoding format, powinniśmy korzystać z opcji "" ShortDate "'i zlokalizować naszą aplikację do użycia" EN-GB ".
{{mydate | Data: "Shortstate '}}
Potrzeba drobnego wysiłku, ale możemy dodać lokalizacje do treści naszego serca i zawsze mieć przyjazny dla użytkownika format daty.
Niestety nie wydaje się, że istnieje łatwy, wbudowany sposób na zastąpienie predefiniowanego formatu. Na przykład nie możesz po prostu zdecydować, że wolisz format "Shortstate" ", aby być DD / MM / YYYY zamiast DD / MM / Y, ponieważ nie ma możliwości modyfikacji formatu w czasie wykonywania. Również nie możesz dodać własnych predefiniowanych opcji.
W przypadku tych przypadków krawędzi można utworzyć rurę daty niestandardowej, która zawija kątową "datepipe" i obsługuje wszelkie niestandardowe formaty per-locale. Wszystko, co nie rozpoznaje, zostanie przekazana do wbudowanego "datepiady".
Off półki "Currencipipe" sformatuje liczbę jako dolary amerykańskie, przycinanie do dwóch miejsc dziesiętnych i dodawać ugrupowania określone w preferencjach lokalizacji.
Zauważysz, że w obu naszych lokalizacjach waluta jest zawsze w dolarach amerykańskich. Nie jest magicznie przełączaj się na Sterling (GBP), gdy używasz lokalizacji "EN-GB". Powodem tego jest to, że 10 GBP nie jest tak samo jak 10 USD, więc musisz wyraźnie określić walutę, do której odnosi się.
Zaktualizujmy "app.component.html", aby korzystać z GBP przez cały czas. Przy określaniu kodu walutowego należy użyć prawidłowej wartości ze standardu ISO 4217 (lista dostępna online).
Zmodyfikuj dwie rury walutowe, dodając ":" GBP "jak więc:
{{wartość $ | async |. Waluta: "GBP '}}
I zaczniesz widzieć symbol £ zamiast US $.
Pamiętaj, że nie robi niczego jak automatycznie konwertować USD do równoważnej wartości w GBP, jeśli zmienisz walutę - po prostu zmienia symbol, którego używa.
W porządku, więc mamy nasze dwa lokale lokalne, a kątowo potrafimy wykonywać niektóre z pracy dla nas z pudełka, ale tekst jest nadal w języku angielskim. Kątowy nie może tłumaczyć tego automatycznie, ale może pomóc nam z częściami przepływu pracy. To jest to, co ma się wydarzyć:
Kątowa pomaga nam z krokami 2 i 4, ale jako deweloperzy, których potrzebujemy robić krok 1 ręcznie. Krok 3 zazwyczaj wypełniłby profesjonalistę tłumaczącą lub agencję, używając specjalnego oprogramowania do odczytu i aktualizacji pliku tłumaczenia.
Aby to osiągnąć, musimy dodać specjalny atrybut do każdego elementu zawierającego stały tekst do przetłumaczenia. Aby być jasnym, jeśli zawartość przybywa z interfejsu API, to nie jest stały tekst i trzeba lokować to w API. Musisz tylko dodać atrybut, gdy tekst jest zapisany bezpośrednio w szablonie HTML w kodzie źródłowym. Kluczowym punktem jest to, że powinieneś próbować przechowywać pliki maszynopisów lokalnych-agnostic - innymi słowy, unikać umieszczania dowolnego tekstu, który należy przetłumaczyć w logikę komponentu i utrzymywać wszystko w szablonach. W przeciwnym razie narzędzie do ekstrakcji nie będzie w stanie go wyodrębnić. I tak jest dobra praktyka, aby oddzielić twoje obawy - w życiu i w kodzie.
Otwórzmy "app.comPonent.html" i zacznij od tytułu "bieżącej wartości". Po prostu dodaj atrybut "I18N" do elementu, który bezpośrednio zawiera tekst.
Ważne jest, aby zrozumieć, że jest to tylko niestandardowy atrybut "Głum". Nie jest to dyrektywa kątowa, która wywołuje coś w czasie wykonywania, w rzeczywistości kompilator usuwa go po tłumaczeniu.
W każdym razie zobaczmy, co się stanie, gdy ponownie uruchomimy narzędzie do wyciągania, aby zregenerować plik tłumaczenia. Pamiętaj "--Out-file" to tylko "wiadomości.xlf" teraz:
$ ng XI18N --Output-Path Locale --out-Plik
Wiadomości.xlf --i18n-Locale AR-IQ
Otwórz plik wyjściowy XLF i powinieneś zobaczyć nowy blok jednostek tłumaczeniowych, który wygląda w ten sposób z dodatkowymi informacjami kontekstowymi:
& LT; Trans-Unit ID = "Face3d45C0F0CD38B726E7798DA15
3e2f8d55551 "DataType =" HTML "& GT;
Źródło & GT;
Bieżąca wartość
Źródło / Źródło & GT;
Świetnie, to oznacza, że narzędzie odebrało atrybut "I18N". Ten długi identyfikator jest generowany przez narzędzie i pozostanie tak samo, chyba że zmiany tekstu. Jeśli masz wiele instancji dokładnie tego samego tekstu, wszyscy otrzymają ten sam identyfikator. Nie edytuj tego identyfikatora!
Jeśli wolisz, możesz określić identyfikator niestandardowy w atrybucie "I18N". Jeśli to zrobisz, identyfikator pozostanie taki sam, nawet jeśli zmienia się tekst, więc musisz mieć pewność, że nie masz żadnych kolizji ID w całej aplikacji. Użyj prefiksu "@@", aby ustawić dowód osobisty. Tutaj identyfikator stanie się "tytuł":
Aby zapewnić, że tłumacz jest w stanie zapewnić dokładne tłumaczenie, często muszą znać kontekst, w którym tekst jest używany. Atrybut "I18N" pozwala nam określić opis i znaczenie, aby pomóc tłumaczowi. Format jest następujący:
Div I18N = "Znaczenie | Opis @@
CustomID "& GT; Tekst / LT; / Div & GT;
Zaktualizujmy nasz tytuł ze znaczeniem i opisem:
To powinno dać tłumaczowi wystarczająco dużo kontekstu, aby zapewnić dokładne tłumaczenie. Regeneruj plik tłumaczenia i powinieneś zobaczyć te wartości zostały wydane. Warto zauważyć, że jeśli nie używasz identyfikatora niestandardowego, wygenerowany identyfikator bierze znaczenie i tekst. Więc ten sam tekst, ale z innym znaczeniem otrzyma inny identyfikator. Opis nie ma jednak wpływu na identyfikator.
Przejdźmy do sekcji Intro. Pierwszy akapit zawiera tekst i zmienną, która będzie interpolowana w czasie wykonywania. Jak sobie z tym poradzimy?
Dobrze z radością jest dość proste. Ponownie musimy dodać znaczący atrybut "I18N" do elementu zawierającego. Dodaj go bezpośrednio do elementu akapitowego:
& LT; P I18N = "Wartość zamykania | Wartość, gdy rynek
zamknięte wczoraj @@ ClosingValue "& GT;
Uruchom ponownie narzędzie do ekstrakcji, a zobaczysz tę nową jednostkę tłumaczenia:
& LT; Trans-Unit ID = "ClosingValue"
DataType = "HTML" & GT;
Źródło & GT; wczoraj i amp; wartość zamknięcia była
& lt; x ID = "Interpolation" Equiv-Text = "{{
ClosingValue |. Waluta: & Amp; APOS; APOS;
}} "/ ^ / Źródło"
Zobacz, jak zmienna interpolacja została szczegółowo opisana w wyjściu. W razie potrzeby nie pozwala na to, aby tłumaczowi zmodyfikować strukturę gramatyczną zdania, bez złamania wiązania. Na przykład, może wystąpić język, w którym zdanie byłoby najlepiej napisane: wartość x była wczorajsza zamknięcie, tj. Z zmienną na początku.
Przejście do następnego ustępu zobaczysz pewną składnię zastraszającej. Nazywa się to formatem komunikatu ICU i pozwala określić różne kawałki tekstu na podstawie wartości zmiennej.
Możesz użyć tego do dodania "s" do słów w języku angielskim, gdy wartość jest zerowa lub nie jedna. Na przykład, jeśli "sekundy" jest zmienną zawierającą liczbę sekund, których możemy użyć tej ekspresji pluralizacji ICU:
{{sekundy}} {Seconds, liczba mnoga, jeden
{Drugi}, inne {sekundy}}
Który odbędą się:
Nie wydaje się być udokumentowany, ale można również użyć "asyncpipe" wewnątrz składni pluralizacyjnej do pracy z obserwowalnymi.
W tym przykładzie "One" i "Inne" są kategorie pluralizacji. Istnieje wiele kategorii do wyboru, ale uważaj! Nie wszystkie lokalizacje obsługują wszystkie kategorie, a kątowe nie mówią Ci, czy próbujesz użyć kategorii, która nie jest obsługiwana przez bieżące ustawienia regionalne. Łatwo jest myśleć, że zrobiłeś coś złego, ponieważ kategoria "Two" nie działa w lokalizacji "EN-GB" i zamiast tego widzisz "inny" tekst. Niewytłumaczalnie "EN" (i wiele innych wspólnych języków) obsługuje tylko "One" i "Inne", mimo "zero" i "dwa" to wyraźne wartości.
Sprawdź ten plik zobaczyć, co faktycznie wspierało.
Możemy pracować wokół tego ograniczenia, używając liczb zamiast kategorii. Po prostu prefiks wartość za pomocą "=":
Tam {obserwatorzy, liczba mnoga, = 0 {to nikt} = 1
{jest jedną osobą} = 2 {są dwie osoby}
Inne {są {{obserwatorzy}} ludzie}}
obserwując teraz.
Jest to już skonfigurowane w aplikacji DEMO, wystarczy dodać atrybut "I18N" do akapitu zawierającego:
& LT; P I18N = "Obserwatorzy | Liczba osób
Oglądanie wartości @@ obserwatorów "& GT;
Uruchom ponownie narzędzie do wyciągania, aby zobaczyć, jak to wygląda. Zobaczysz, że jest to wyjście nieznacznie inaczej. Tworzy dwie jednostki tłumaczeniowe; jeden dla samego wyrażenia ICU i taki, który interpoluje ten wyraz na oryginalny ciąg.
Jeśli chcesz wyświetlić inny tekst w zależności od wartości zmiennej, możesz użyć wyrażenia "Wybierz", który jest bardzo podobny do "mnogiej" składni pokazano powyżej. W naszej aplikacji demonstracyjnej monitorujemy zmianę zastosowaną do wartości i utwórz obserwowalny strumień o nazwie "Trend $", który wysyła "w górę", "w dół" lub "stabilny" w zależności od tego, czy zmiana jest dodatnia, ujemna lub zero.
Następnie podłączamy naszą ekspresję ICU "Wybierz", aby wyjść z innym ciągu w zależności od wartości strumienia. Tutaj możesz zobaczyć "asyncpipe" w użyciu:
Wartość {Trend $ | async, wybierz, w górę
{wzrósł} w dół {spadł} stabilny
{nie zmienił}}
Jest to nieco czyszcząca składnia niż przy użyciu "NGIF" lub "NGSwitch", aby manipulować domem, a także dobrze gra narzędziem ekstrakcji. Dodaj atrybut "I18N" do elementu zawierającego:
Regeneruj plik tłumaczenia, a zobaczysz, że podejście jest podobne do wyjścia mnogiej, z utworzoną dwiema jednostkami tłumaczeniowymi. ICU Wyrażenia są dość przydatne po przyzwyczajeniu do nich, a następnie możesz je zagnieżdżać, aby stworzyć bardziej złożone wyjścia.
Jeden atrybut "I18N" do dodania:
& LT; Div Class = "Card__Info" I18N = "Transakcje
liczba | liczba transakcji dzisiaj @@
transakcje "& gt;
Transakcje: {{transakcje $ | async |.
Numer}}
& lt; / div & gt;
Teraz zaznaczyliśmy cały tekst, który wymaga tłumaczenia, możemy wygenerować plik tłumaczenia po raz ostatni. Po utworzeniu zmiany nazwy na "wiadomości.ar-iq.xlf" i wymień poprzednią inkarnację. Jest to plik, który wysyłamy do profesjonalistów tłumaczenia, ale do celów tego samouczka, Tłumacz Google będzie stojący!
Otwórz plik XLF i duplikuj każdy "Źródło" Źródło " Element, zmiana nazwy "Target i GT". Niestety może być dość nieporządny, więc może pomóc upiększyć zawartość.
Aby sprawdzić, że mamy je wszystkie, zapisz plik i uruchom aplikację z Arabskimi Local:
$ Ng Serve --Configuration = AR-IQ
Jeśli widzisz jakieś wiadomości w terminalu, co oznacza, że przegapiłeś jeden:
Błąd w przypadku błędów analizy XLIFF: Wiadomość * ID *
tęskni za tłumaczeniem ("
Mam nadzieję, że nie będziesz miał żadnych błędów, a będziesz mógł zobaczyć aplikację w przeglądarce. Nie dodaliśmy żadnego rzeczywistego arabskiego, więc nie będzie wyglądał zbyt wiele.
Zacznijmy od czegoś łatwego - tytuł "bieżącej wartości". Tłumacz Google mówi mi, że powinien być (tutaj tekst arabski), więc zaktualizuj wartość w celu "° C) element:
Źródło i wartość bieżąca
Na razie w porządku. Zróbmy teraz jeden z interpolacji. Oto "Wczorajsza wartość zamknięcia była ..." (Mam nadzieję!):
A Target & GT; Tekst arabski Tutaj
ID = "Interpolation" Equiv-Text = "{{ClosingValue
|. Waluta: & Amp; APOS; APOS; }} "/> ;< ;/target> ;
Użyj numeru po przetłumaczeniu, dzięki czemu można zobaczyć, gdzie powinno być interpolacja. Zauważ, że gdy zobaczysz przetłumaczony wynik w Tłumacz Google, pojawi się odwrócony - tj. Numer na początku - ale po skopiowaniu i wklepieniu go do pliku tłumaczeń, powróci do oryginalnego zamówienia. Dzieje się tak, ponieważ arabski jest językiem RTL, więc skrypt jest (prawie) całkowicie odzwierciedlony. Tłumacz Google robi to, dodając atrybut "Dir =" RTL "'do elementu zawierającego. Dowiemy się, jak to zrobić w następnym kroku. Reszta tłumaczeń jest dostępna w demo Repo, "Tutorial" oddział.
Musimy zarządzać kierunkiem skryptu w naszej aplikacji, ponieważ kątowy nie zrobi tego automatycznie dla nas. Nie wydaje się, aby nie ma żadnego sposobu wykrycia, jeśli bieżąca lokalizacja jest językiem LTR lub RTL, więc będziemy musieli go utwardzać. Byłoby wspaniale, gdyby kątowe oferowało wbudowaną dyrektywę.
Otwórz "app.comPonent.ts". Importuj "Wstrzyknąć", "LOCALE_ID" i "HOSTBINDING" z "'@ kątowy / rdzeń". Następnie skonfiguruj "hostbinding" w następujący sposób. Spowoduje to dodanie atrybutu "DIR" do AppComponent i ustaw domyślny kierunek języka na "LTR":
@Hostbinding ('attr.dir') Dir = 'LTR';
Następnie dodaj konstruktor i wstrzyknąć "locale_id". Pamiętaj, że jest ustawiony przez naszą konfigurację, ponieważ używamy AOT.
Konstruktor (@ @ LOCALE_ID) Prywatne ustawienia Locale: String) {}
I wreszcie dodaj następujący fragment do istniejącej metody "ngoninit". Tutaj sprawdzamy, czy "LOCALE_ID", IE "AR-IQ", zaczyna się od "AR", a jeśli zmienia kierunek do "RTL".
IF (this.Locale.startswith ('ar')) {
to.dir = 'rtl';
}
Jeśli planujesz wspierać więcej miejscowych, prawdopodobnie będziesz musiał zrefazować, aby uczynić go bardziej skalowalnym, ponieważ jest jednak tylko dziesięć języków RTL w użyciu dziś, że podejście nie powinno być zbyt nieporęczne. Uruchom aplikację arabską i teraz powinieneś zobaczyć, że UI jest lustrzany - znak £ powinien być po prawej stronie.
Ostatnim krokiem jest generowanie i sprawdzenie naszych budów produkcyjnych. Po pierwsze, musimy zrobić kolejną szybką modyfikację konfiguracji "kątowej.json".
W "Architect.Build.configurations" zduplikuj istniejący obiekt produkcyjny i zmienić nazwę "" produkcji-ar-iq "". Następnie skopiuj i wklej właściwości z konfiguracji "AR-IQ" do obiektu, więc masz zarówno opcje produkcyjne, jak i opcje "I18N".
Musisz także zaktualizować "architekta.Serve.configurations". Tym razem duplikuje istniejący obiekt "Ar-IQ" i zmienić nazwę "" Produkcja-AR-IQ "" i zmień wartość "Browersertarget", aby wskazać na twoją konfigurację "produkcji-AR-IQ".
Teraz możesz zbudować i służyć produkcji Arabskie Locale z tym poleceniem:
$ Ng Serve --Configuration = Produkcja-AR-IQ
Dobra, skończyliśmy! Z powodzeniem zamłączyliśmy naszą aplikację i zlokalizowaliśmy go za publiczność "EN-GB" i "AR-IQ". Kątowa sprawia, że proces jest niezwykle prosty dla dewelopera, w rzeczywistości najtrudniejszy bit dowie się, jakie tłumaczenia powinny być przepraszające dla jakichkolwiek arabskich głośników, jeśli coś jest nie tak!
Ten artykuł został pierwotnie opublikowany w wydaniu 281 kreatywnych projektantów Web Magazine Web Design Magazine. Kup problem 281 tutaj lub Subskrybuj tutaj projektant stron internetowych .
Powiązane artykuły:
(Kredyt obrazu: Matt Crouch) Witamy w naszym przewodniku, w jaki sposób zarządzać stanem formularza reakcji z Form..
(Kredyt obrazu: Serif) Z narzędziami wektorowymi i rastrowymi połączone, Projektant powinowactwa. j..
(Kredyt obrazu: Paul Kwon) Tworzenie projekty znaków. Do życia jest spełnienie marzeń, zwłaszcza ..
Platforma animacji Greensock (GSAP) umożliwia animowanie wszystkiego, do czego można uzyskać dostęp do JavaScript, w tym DOM,..
Zamierzam podzielić się najszybszym Technika malarstwa Używam panelu "Gessoing" i uzyskanie płynnego wykończe..
W coraz bardziej cyfrowym świecie sprytnie sprytnie wykonany materiał promocyjny ma moc poważnego uderzenia. Może jesteś fre..
Niezależnie od tego, czy chcielimy przyznać, czy nie, platformy interakcji Messaging wkładają do naszego codziennego ekranu e..
Uwięziona jest krytyków gra strategiczna trzeciej osoby, zaprojektowana dla VR. Uruchomiony na PlayStation VR w październiku u..