Migracja Localizable.strings do String Catalogu (.xcstrings)

Zaktualizowano · LocalePilot

Od Xcode 15 Apple kieruje wszystkich na String Catalogi: jeden plik JSON dla wszystkich języków, z liczbą mnogą i wariantami urządzeń. Migracja to dwa kliknięcia. Uwagi wymaga diff, który po niej powstaje.

Spieszysz się? Przekonwertuj pojedyncze pliki .strings do katalogu od razu w przeglądarce: za darmo, bez rejestracji, nic nie jest wysyłane.

Przed migracją

Dwa środki ostrożności, które zapobiegają większości przykrych niespodzianek:

  • Czyste drzewo Gita, na osobnej gałęzi. Wszystko, co warto potem sprawdzić, jest w diffie, więc warto mieć go osobno.
  • Build, który przechodzi przed migracją. Xcode wypełnia katalog, skanując kod podczas builda. Jeśli projekt się nie kompiluje, katalog pozostaje niekompletny i nie będziesz wiedzieć dlaczego.

Sama migracja

W nawigatorze projektu kliknij prawym przyciskiem Localizable.strings, a potem Migrate to String Catalog. Xcode wypisuje pliki i targety, których to dotyczy; dokładne nazwy mogą się zmieniać między wersjami Xcode, zasada pozostaje ta sama.

Pliki fr.lproj/Localizable.strings, de.lproj/Localizable.strings… zostają zastąpione jednym Localizable.xcstrings zawierającym wszystkie języki. Komentarze z plików .strings stają się komentarzami kluczy.

Jak wygląda plik

String Catalog to JSON. Prosty klucz:

{
  "sourceLanguage" : "en",
  "strings" : {
    "welcome_user" : {
      "comment" : "Home screen greeting",
      "localizations" : {
        "fr" : {
          "stringUnit" : {
            "state" : "translated",
            "value" : "Bon retour, %@ !"
          }
        }
      }
    }
  },
  "version" : "1.0"
}

I liczba mnoga, zapisana w variations:

"items_left" : {
  "localizations" : {
    "fr" : {
      "variations" : {
        "plural" : {
          "one" : { "stringUnit" : { "state" : "translated", "value" : "%lld article restant" } },
          "other" : { "stringUnit" : { "state" : "translated", "value" : "%lld articles restants" } }
        }
      }
    }
  }
}

Po polsku ten sam klucz potrzebuje czterech wariantów: one, few, many i other. Zwróć uwagę na formatowanie: spacja przed każdym dwukropkiem, tak jak zapisuje Xcode. Narzędzie, które przepisuje plik jako „standardowy” JSON, wygeneruje ogromny diff bez zmiany ani jednego tłumaczenia.

Co sprawdzić w diffie

Klucze oznaczone jako Stale. Po buildzie Xcode oznacza klucze, których nie może już znaleźć w kodzie. Nie muszą być martwe: klucz budowany w trakcie działania (NSLocalizedString(variable, comment: ""), klucz odczytywany z pliku konfiguracyjnego) jest niewidoczny dla skanowania. Sprawdź przed usunięciem.

Nowe klucze wyciągnięte z kodu. Build może dodać teksty, których nigdy nie umieściłeś w Localizable.strings, zwykle literały SwiftUI Text("…"), które są domyślnie lokalizowalne. Przychodzą nieprzetłumaczone, więc procent pokazywany przez Xcode dla każdego języka spada. To normalne.

Stany. Każda wartość ma stan: translated, needs_review albo new dla tekstu, którego nikt jeszcze nie przetłumaczył. Za trzy miesiące właśnie po tym poznasz, co faktycznie zostało przejrzane.

Specyfikatory formatu. Tekst SwiftUI taki jak Text("\(count) items left") tworzy klucz %lld items left. Jeśli stary .strings używał %d dla tego samego zdania, masz teraz dwa prawie identyczne klucze; zostaw ten, którego faktycznie używa kod.

A starsze wersje iOS?

iOS 17 nie jest potrzebny. Katalog to format źródłowy: podczas builda Xcode kompiluje go do zwykłych plików .strings w paczce aplikacji. Deployment target się nie zmienia.

Edycja katalogu poza Xcode

Edytor w Xcode wystarczy dla kilku tekstów. Żeby przejrzeć cały język, tłumaczyć hurtowo albo sprawdzać placeholdery, przydaje się osobne narzędzie. LocalePilot otwiera pliki .xcstrings i zapisuje je w stylu Xcode: niezmieniony katalog wychodzi identyczny co do bajtu, edycja zmienia tylko te wiersze, których dotyczy, a edytowana wartość przechodzi w stan translated. Liczbę mnogą i warianty urządzeń można edytować; klucze z podstawieniami (%#@count@) i klucze oznaczone shouldTranslate: false pozostają bez zmian, do edycji w Xcode.

Najczęściej zadawane pytania

Czy String Catalogi wymagają iOS 17?

Nie. Xcode kompiluje katalog do zwykłych plików lokalizacji podczas builda; deployment target aplikacji się nie zmienia.

Co oznacza Stale w String Catalogu?

Xcode nie znalazł klucza w kodzie przy ostatnim buildzie. Zanim go usuniesz, upewnij się, że nie jest budowany w trakcie działania aplikacji.

Jak cofnąć migrację?

Migruj na osobnej gałęzi, z commitem tuż przed: revert w Gicie przywraca pliki .strings.