xgqfrms™, xgqfrms® : xgqfrms's offical website of cnblogs! xgqfrms™, xgqfrms® : xgqfrms's offical website of GitHub!

SwiftUI App 支持多语种 All In One

SwiftUI App 支持多语种 All In One

zh-Hans & zh-Hant

Localizable Strings

Localizable.strings

Localizable Strings Dictionary

Localizable.stringsdict

steps

  1. 在 Info 的 Localizables 里添加上 英语、美式英语、简体中文繁体中文

其实这个步骤可以省略,直接下一个步骤开始也可以,第三步的之后会自动添加的

  1. 新建 4 个Group/文件夹,en.lproj、en-US.lproj、zh-Hans.lprojzh-Hant.lproj分别表示英语、美式英语、简体中文繁体中文本地化文件夹

  2. 在 4 个Group/文件夹下面都新建一个名为 Localizable.strings 的同名到字符串文件, 并且添加 要翻译的字符串

/* 
  Localizable.strings
  TodoList

  Created by xgqfrms on 2022/5/22.
  
*/

"TodoList" = "🇺🇸Todo List 📝";

/* 
  Localizable.strings
  TodoList

  Created by xgqfrms on 2022/5/22.
  
*/

"TodoList" = "🇨🇳待办清单 📝";

/* 
  Localizable.strings
  TodoList

  Created by xgqfrms on 2022/5/22.
  
*/

// validation failed: Couldn't parse property list because the input data was in an invalid format
// missing semi-colons bug ❌
// "TodoList" = "Todo List 📝"

"TodoList" = "Todo List 📝";


  1. View 中使用字符串,并在入口文件中指定环境(仅用于测试,实际上 app 会根据系统语言自动显示对应语言)
//
//  CustomEditView.swift
//  TodoList
//
//  Created by xgqfrms on 2022/5/22.
//

import SwiftUI

struct CustomEditView: View {
  @EnvironmentObject var listViewModel: ListViewModel;
  @State private var editMode: EditMode = EditMode.inactive;
  // @Environment(\.editMode) private var editMode;
  var body: some View {
    // 导航视图
    NavigationView {
      ZStack {
        if (listViewModel.items.isEmpty) {
          // EmptyView()
          NoItemsView()
        } else {
          List {
            ForEach(listViewModel.items) {item in
              RowView(item)
            }
            .onDelete(perform: listViewModel.deleteItem)
            .onMove(perform: listViewModel.moveItem)
          }
        }
      }
      .environment(\.editMode, $editMode)
      .listStyle(PlainListStyle())
      .navigationTitle(String(localized: "TodoList"))
      // .navigationTitle(NSLocalizedString("TodoList", comment: "todo list comment!"))
      // .navigationTitle("待办清单 📝")
      // .navigationTitle("Todo List 📝")
      // SwiftUI 国际化 ? language
      // NSLocalizedString(<#T##key: String##String#>, comment: <#T##String#>)
      // String(localized: <#T##String.LocalizationValue#>)
      .navigationBarItems(
        leading: Button(editMode.isEditing ? "完成": "编辑") {
          switch editMode {
            case .active:
              self.editMode = .inactive
            case .inactive:
              self.editMode = .active
            default:
              break
          }
        },
        trailing: NavigationLink("添加", destination: AddItemView())
        // trailing: NavigationLink("Add", destination: AddItemView())
      )
    }
  }
}

struct CustomEditView_Previews: PreviewProvider {
  static var previews: some View {
    CustomEditView()
  }
}

import SwiftUI

@main
struct TodoListApp: App {
  // 实例化 ViewModel
  @StateObject var listViewModel: ListViewModel = ListViewModel();
  var body: some Scene {
    WindowGroup {
      CustomEditView()
        .environmentObject(listViewModel)
        // .environment(\.locale, .init(identifier: "en"));
        .environment(\.locale, .init(identifier: "en-US"));
        // .environment(\.locale, .init(identifier: "zh-Hans"));
    }
  }
}
  1. 修改模拟器的语言,测试

default

OK, zh-Hans

OK, en-US

SwiftUI 国际化 & 本地化 All In One

https://www.cnblogs.com/xgqfrms/p/16297206.html

refs



©xgqfrms 2012-2020

www.cnblogs.com/xgqfrms 发布文章使用:只允许注册用户才可以访问!

原创文章,版权所有©️xgqfrms, 禁止转载 🈲️,侵权必究⚠️!


posted @ 2022-05-22 22:22  xgqfrms  阅读(539)  评论(2编辑  收藏  举报