swiftui本地化

Localization in SwiftUI code is as easy as writing a String. To learn how to setup Localisable files, other basics about Localization follow along (UIKit related code can be ignored):

SwiftUI代码中的本地化就像编写String一样容易。 要了解如何设置可本地化的文件,请遵循其他有关本地化的基础知识(可以忽略与UIKit相关的代码):

For SwiftUI Localization, We will be using the following Localisable setup:

对于SwiftUI本地化,我们将使用以下Localisable设置:

"Content" = "Если эта цель будет достигнута в эпоху Возрождения, свободы, ценность личности, которую принесла нам западная цивилизация, исчезнет в одночасье.";
"Quotes" = "Котировки";
"Author_Name %@" = "Имя автора: %@";
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>%llu Like(s)</key>
	<dict>
		<key>NSStringLocalizedFormatKey</key>
		<string>%#@v1_likes@</string>
		<key>v1_likes</key>
		<dict>
			<key>NSStringFormatSpecTypeKey</key>
			<string>NSStringPluralRuleType</string>
			<key>NSStringFormatValueTypeKey</key>
			<string>llu</string>
			<key>zero</key>
			<string>%llu Like</string>
			<key>one</key>
			<string>%llu Like</string>
			<key>other</key>
			<string>%llu Likes</string>
		</dict>
	</dict>
</dict>
</plist>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>%llu Like(s)</key>
	<dict>
		<key>NSStringLocalizedFormatKey</key>
		<string>%#@v1_likes@</string>
		<key>v1_likes</key>
		<dict>
			<key>NSStringFormatSpecTypeKey</key>
			<string>NSStringPluralRuleType</string>
			<key>NSStringFormatValueTypeKey</key>
			<string>llu</string>
			<key>few</key>
			<string>%llu Лайка</string>
			<key>many</key>
			<string>%llu Лайков</string>
			<key>one</key>
			<string>%llu лайк</string>
			<key>other</key>
			<string>%llu Лайков</string>
			<key>zero</key>
			<string>%llu Нравится</string>
		</dict>
	</dict>
</dict>
</plist>

SwiftUI localisable works with String interpolation. SwiftUI Text has a default initialiser:

SwiftUI可本地化可用于String插值 。 SwiftUI Text具有默认的初始化程序:

public init(_ key: LocalizedStringKey, //localisation key
tableName: String? = nil, //table name if nil takes Localisable.strings and Localisable.stringsDict
bundle: Bundle? = nil, //default main bundle
comment: StaticString? = nil)

We can initialise Text directly with Localization key, like following:

我们可以使用Localization键直接初始化Text,如下所示:

Text("Quotes")//renders: 
/*
English: Quotes
Russian: Котировки
*/---------------------------------------------------------------let author = "Jhon Doe"
Text("Author_Name \(self.author)")
//renders:
/*
English: Author Name: Jhon Doe
Russian: Имя автора: Jhon Doe
*/---------------------------------------------------------------let likes: UInt = 10
Text("\(self.likes) Like(s)")
//renders:
/*
English: 10 Likes
Russian: 10 Лайков
*/

Easy and clean!

简单干净!

import SwiftUI


struct ContentView: View {
    private static let formatter: DateFormatter = {
        let formatter = DateFormatter()
        formatter.dateStyle = .short
        formatter.timeStyle = .short
        return formatter
    }()
    let likes: UInt = 10
    let publishedAt = Date()
    let author = "Jhon Doe"
    
    var body: some View {
                VStack(alignment: .leading, spacing: 8) {
                    HStack {
                        Text("\(publishedAt, formatter: Self.formatter)")
                            .foregroundColor(.secondary)
                            .font(.caption)


                        Spacer()


                        Text("Author_Name \(self.author)")
                            .foregroundColor(.secondary)
                            .font(.caption).onTapGesture {


                        }
                    }
                    
                    Text("Quotes")
                        .font(.headline)


                    Text("Content")
                        .font(.body)
                    Text("\(likes) Like(s)")
                        .font(.subheadline)
                    
                }.frame(idealHeight: .greatestFiniteMagnitude)
                    .padding()
            }
    
}




struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Image for post
Image for post
Ru — En
茹恩

Debug for Error:

调试错误:

  • Mangling with verbatim Text initialiser, Text has two initialisers.

    用逐字文本初始化程序处理,文本有两个初始化程序。

init(verbatim content: String)  //this keeps string literal i.e. No localisation//Use For Localization
init(_ key: LocalizedStringKey,
tableName: String? = nil,
bundle: Bundle? = nil,
comment: StaticString? = nil)
  • Mangling with LocalizedStringKey initialiser. LocalizedStringKey has two to three initialisers. All with different purpose:

    使用LocalizedStringKey 初始化程序进行处理。 LocalizedStringKey具有两到三个初始化程序。 都有不同的目的:

init(stringLiteral value: String)
//as parameter name suggest, it does not interpolate and try to
// to localize string as it is

//Text("Quotes") -> Works!
//Text("Author_Name \(self.author)") -> Will not Work.
//Text("\(self.likes) Like(s)") -> Will not Work.
_________________________________________________________
init(_ value: String)
//All type of Localizable key work with this initialiser
_________________________________________________________init(stringInterpolation: LocalizedStringKey.StringInterpolation)
// this requires manual and
  • Wrong/Different Interpolation Value Type. The interpolation happens on compile-time and compiler may interpolate a variable in a different format. Which may result in broken Localization.

    插值值类型错误/不同。 插值发生在编译时,编译器可能会以其他格式插值变量。 这可能会导致本地化失败。

let likes: UInt = 10
print(LocalizedStringKey("\(likes) Like(s)"))LocalizedStringKey(key: "%llu Like(s)", hasFormatting: true, arguments: [SwiftUI.LocalizedStringKey.FormatArgument(value: 10, formatter: nil)])
------------------------------------------------

let like = 10
print(LocalizedStringKey("\(like) Like(s)"))LocalizedStringKey(key: "%lld Like(s)", hasFormatting: true, arguments: [SwiftUI.LocalizedStringKey.FormatArgument(value: 10, formatter: nil)])//this will not localize as %lld is not part of our expected localizable key.

Limitations:

局限性:

SwiftUI canvas cannot render Interpolatable Localisables.

SwiftUI画布无法渲染可插值 Localisable。

//Text("Quotes") -> Works on canvas!
//Text("Author_Name \(self.author)") -> Will not render on canvas.
//Text("\(self.likes) Like(s)") -> Will not render on canvas.

Demo:

演示:

Reference:

参考:

翻译自: https://levelup.gitconnected.com/localization-with-swiftui-5abbeb275d5

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【课程特点】1、231节大容量课程:包含了SwiftUI的大部分知识点,详细讲解SwiftUI的方方面面;2、15个超级精彩的实例:包含美食、理财、健身、教育、电子商务等各行业的App实例;3、创新的教学模式:手把手教您SwiftUI用户界面开发技术,一看就懂,一学就会;4、贴心的操作提示:让您的眼睛始终处于操作的焦点位置,不用再满屏找光标;5、语言简洁精练:瞄准问题的核心所在,减少对思维的干扰,并节省您宝贵的时间;6、视频短小精悍:即方便于您的学习和记忆,也方便日后对功能的检索;7、齐全的学习资料:提供所有课程的源码,在Xcode 11 + iOS 13环境下测试通过; 更好的应用,更少的代码!SwiftUI是苹果主推的下一代用户界面搭建技术,具有声明式语法、实时生成界面预览等特性,可以为苹果手机、苹果平板、苹果电脑、苹果电视、苹果手表五个平台搭建统一的用户界面。SwiftUI是一种创新、简单的iOS开发中的界面布局方案,可以通过Swift语言的强大功能,在所有的Apple平台上快速构建用户界面。 仅使用一组工具和API为任何Apple设备构建用户界面。SwiftUI具有易于阅读和自然编写的声明式Swift语法,可与新的Xcode设计工具无缝协作,使您的代码和设计**同步。自动支持动态类型、暗黑模式、本地化和可访问性,意味着您的**行SwiftUI代码已经是您编写过的非常强大的UI代码了。 

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值