Dlaczego zasoby ciągów są zazwyczaj trzymane poza kodem, a nie wewnątrz kodu?


18

Zasadniczo na wielu platformach piszę moje ciągi znaków do pliku .resx lub .xml, a następnie otrzymuję je stosując podejście zależne od platformy.

To znaczy, na iOS, otrzymuję je przez NSBundle.MainBundle i Context.Resourcesna Androidzie.

Jakie są zalety tego podejścia i dlaczego nie ma go bezpośrednio dostępnego w kodzie, więc na przykład:

  1. W projekcie międzyplatformowym każda platforma może uzyskać do niej bezpośredni dostęp, bez integracji.

  2. Podczas budowania nie ma obaw, czy dobrze zbudowane zasoby.

  3. Koder może korzystać z takich funkcji, jak obsługa wielu języków

Krótko mówiąc: jaki jest powód, dla którego zasoby łańcuchowe mają taką strukturę?

[Edytować]

Powiedzmy, że mój plik jest częścią „podstawowego” projektu współdzielonego przez inny projekt. (Pomyśl o PCL, wieloplatformowej strukturze plików projektu).

Załóżmy, że mój plik jest całkowicie podobny do pliku .resx / .xml i wygląda następująco (nie jestem profesjonalistą w xml, przepraszam!): Parametry Paramètres

Jest to więc w zasadzie niestandardowy plik XML, w którym wskazujesz klucz / język, aby uzyskać odpowiedni ciąg.

Plik byłby częścią aplikacji, tak jak dodajesz dowolny dostępny plik w aplikacji, a system uzyskuje dostęp do zasobów ciągu, kodowany przy użyciu PCL. Czy spowodowałoby to dodatkowe obciążenie aplikacji?



6
Nie, moje obawy nie dotyczą internacjonalizacji, a raczej architektury i różnych platform, przepraszam.
Léon Pelletier

1
To pytanie można uogólnić na dowolny rodzaj zasobu, nawet przy niewielkiej łatwości lokalizacji / internacjonalizacji. Jakie są zalety oddzielenia dowolnego zasobu od kodu? Dlaczego obrazy lub pliki audio zwykle nie są kodowane w źródle jako ciągi binarne? (Identyfikatory URI danych istnieją oczywiście, ale generalnie są niepraktyczne w przypadku dużych plików). Inni podali już całkiem dobre odpowiedzi, ale chciałem tylko zauważyć, że ciągi czytelne dla użytkownika nie są jedynym typem zasobu, który zyskuje na eksternalizacji.
JAB

Odpowiedzi:


38

Lokalizacja i internacjonalizacja,

Zachowanie ciągów zewnętrznych pozwala im się zmieniać (czytać: przetłumaczone) bez potrzeby ponownej kompilacji (co najwyżej tylko ponowne połączenie i po prostu wrzucenie nowego folderu w najlepszym wypadku).


Dzięki temu ponowne połączenie kontra ponowna kompilacja to dobry powód.
Léon Pelletier

2
Nadal jedyna osoba, która zrozumiała pytanie.
Léon Pelletier

3
@ratchetfreak to zła forma do zaakceptowania zbyt wcześnie (w ciągu kilku godzin zdecydowanie się liczy). Nie daje czasu na inne odpowiedzi. Jest to proste, do rzeczy i dokładne ... ale ktoś może przynieść lepszą, bardziej szczegółową, szczegółową odpowiedź jutro (lub w tym przypadku w przyszłym miesiącu).
WernerCD,

3
Dodatkowo: edytowanie pliku XML może być w porządku dla tłumacza, ale nigdy nie pozwól im
bawić się w

Teraz pytanie brzmi: „Czy ta odpowiedź nadal dotyczy przetłumaczonych języków?”. Pytam, ponieważ nie byłoby ponownego łączenia ani rekompilacji.
Thomas Eding

10

Jeśli masz plik, który zawiera tylko zasoby ciągów, możesz przekazać go do biura tłumaczeń lub czegoś podobnego i uzyskać tłumaczenie. Wydaje mi się, że możesz sobie wyobrazić, jak ciężko by to było, gdybyś musiał dać wiele plików kodowych laikowi, aby wykonał tłumaczenie (oprócz tego, że nie chciałbyś nikomu rozdawać kodu).


2
Cóż, nie ma różnicy między plikiem zawartym w projekcie a plikiem zasobów. Problem nie istnieje.
Léon Pelletier

Mówię o włączeniu zasobów bezpośrednio do kodu, a następnie o obsłudze wszystkiego w programie, dzięki czemu jest bardziej przyjazny dla PCL / między platformami.
Léon Pelletier

2
jeśli masz plik „kodu” ze wszystkimi zasobami łańcucha (definicja słownika lub coś takiego) i nic więcej w nim… cóż, w zasadzie jest to plik zasobów (ale jeden dla jednej platformy, jak np. Android nie będzie weź dowolny kod celu-c). Jeśli jest w nim inny kod lub jest on podzielony na kilka plików, trudniej jest uzyskać tłumaczenie zewnętrzne. W widoku wieloplatformowym format tekstowy taki jak xml ma tę zaletę, że można go czytać i używać na dowolnym języku / platformie (ale może trzeba będzie trochę popracować)
Flo

7

Oprócz internacjonalizacji / lokalizacji oddzielanie ciągów tekstowych w ten sposób pozwala korektorowi na przesyłanie poprawek do pisowni / gramatyki / interpunkcji, które są izolowane messages.${LOCALE}, bez konieczności dotykania prawdziwego pliku kodu źródłowego. Możesz mieć zaciemnienie przy zmianach kodu, ale zaakceptuj takie poprawki tekstu. Jeśli akceptujesz jednoczesne zmiany zarówno kodu, jak i komunikatów, ich oddzielenie ułatwia scalenie poprawek, pod warunkiem, że zmiany w kodzie nie redefiniują żadnych wiadomości, które istniały podczas sprawdzania korektora messages.en_US.

Ponadto, w zależności od sposobu implementacji, ponowne połączenie aplikacji może nie być konieczne. Kod może po prostu pobrać linię 138 messages.${LOCALE}dla określonego komunikatu, przy czym numer linii jest określany w czasie wykonywania.


0

W ten sposób Twój język / platforma zdecydowała się na wdrożenie lokalizacji ciągów znaków. Wszystkie podejścia do lokalizacji wymagają pewnego rodzaju zewnętrznych plików zasobów, z których można uzyskać tłumaczenia. Głównym problemem jest to, jak utrzymujesz te zasoby.

Wygląda na to, że musisz ręcznie zarządzać tymi plikami zasobów , co może być dużym obciążeniem. Komplikuje to także współdzielenie powtarzających się ciągów. A konieczność zrobienia tego, gdy obecnie wysyłasz tylko jeden język, jest jeszcze większym obciążeniem.

Powszechną alternatywą jest podejście GNU Gettext polegające na oznaczaniu możliwych do przetłumaczenia ciągów w kodzie źródłowym i automatycznym wyodrębnianiu tych ciągów do standardowych plików PO, które działają ładnie na różnych platformach i między językami. Z perspektywy programisty każdego dnia pokonuje ręczną konserwację plików zasobów XML.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.