localize.dev

الوثائق / iOS

توطين iOS و macOS باستخدام كتالوجات السلاسل النصية، بشكل آلي

ابحث عن النص المكتوب بشكل ثابت في SwiftUI و UIKit، وترجمه إلى Localizable.xcstrings لكل لغة، وقم بتغليف سلاسل UIKit في String(localized:)، بأمر واحد أو طلب سحب واحد.

كيف يعمل

يبحث SwiftUI عن نص Text("…"), Button, Label, TextField, .navigationTitle وغيرها من العناصر في قاعدة بيانات النصوص (String Catalog) بنفسه، بحيث يبقى الكود كما هو. أما UIKit فيأخذ النصوص البسيطة، فيصبح label.text = "…", setTitle("…", for:) وأسماء رسائل التحذير String(localized: "…").

تصبح عدد مع كلمته، "\(n) \(n == 1 ? "item" : "items")", إلى "\(n) items": تتغير قاعدة البيانات %lld items حسب العدد، مع أشكال الجمع الخاصة بكل لغة.

يذهب كل نص إلى Localizable.xcstrings، مفتاحًا بنصه كما يكتبه Xcode (Welcome back, %@!)، مع ترجمته لكل لغة في نفس الملف ومحللات مرقمة (%1$@, %2$lld) عندما يكون هناك أكثر من نص واحد. يتم ترك Text(verbatim:) وأسماء الصور والملاحظات كما هي.

قبل وبعد

المخرجات الحقيقية للمحرك لهذا الملف. في تشغيل حقيقي، يقوم النموذج المستضاف بتسمية المفاتيح من السياق.

Shop/CartView.swift · قبل
import SwiftUI

struct CartView: View {
    let name: String
    var body: some View {
        VStack {
            Text("Welcome back, \(name)!")
            Button("Checkout") {}
        }
        .navigationTitle("Your cart")
    }
}

final class LoginController: UIViewController {
    let label = UILabel()
    override func viewDidLoad() {
        label.text = "Sign in to continue"
    }
}
Shop/CartView.swift · بعد
import SwiftUI

struct CartView: View {
    let name: String
    var body: some View {
        VStack {
            Text("Welcome back, \(name)!")
            Button("Checkout") {}
        }
        .navigationTitle("Your cart")
    }
}

final class LoginController: UIViewController {
    let label = UILabel()
    override func viewDidLoad() {
        label.text = String(localized: "Sign in to continue")
    }
}
locales/en.json
{
  "sourceLanguage" : "en",
  "strings" : {
    "Checkout" : {

    },
    "Sign in to continue" : {

    },
    "Welcome back, %@!" : {

    },
    "Your cart" : {

    }
  },
  "version" : "1.0"
}

ما يضيفه الإعداد

الإعداد الأول يقوم بإعداد كتالوجات السلاسل النصية (Localizable.xcstrings) إذا لم يكن المشروع يحتوي عليه بعد:

  • Localizable.xcstrings, الذي يمكن العثور عليه في أي مكان في المشروع أو إنشاءه في الجذر: أضفه إلى هدف التطبيق في Xcode مرة واحدة.

قم بتشغيله

يتطلب CLI إصدار Node.js 22 أو أحدث، لا شيء آخر: npx يقوم بتشغيله دون إضافة package.json إلى المشروع. لا يوجد Node على جهازك؟ إجراء GitHub أدناه يقوم بتشغيله لك.

npx localize-dev login

# Preview, then write the changes
npx localize-dev run --dry-run -l es,fr,de
npx localize-dev run -l es,fr,de

# Or open a pull request instead
npx localize-dev pr -l es,fr,de

أو أضف إجراء GitHub واحصل على طلب سحب عند كل دفعة. جربه على الكود الخاص بك أولاً في ملعب.