I am trying to localize my SwiftUI Watch app. I don't have any problems with static strings. I use LocalizedKeyStrings in my Text views and add my translations in Localizable.strings files. For example:
Text("history")
in Localizable.strings:
"history" = "Historique";
Result : "Historique"
But I also want to localize stings using interpolation. For example:
Text("startCustom \(format: "%.1f",customDistance)")
In Localizable.strings, I have tried with different syntax:
"startCustom %@" = "Course de %@ km";
or
"startCustom %f" = "Course de %f km";
or
"startCustom %.1f" = "Course de %.1f km";
Nothing works. I don't find any documentation for that ...
Let us move on to create a string file called 'Localizable' that will hold the text we want to localize. Choose File → New → File ..., select Strings File under Resources, and click Next. Name it Localizable, then click on Create.
The key used to look up an entry in a strings file or strings dictionary file.
String interpolation is a way to construct a new String value from a mix of constants, variables, literals, and expressions by including their values inside a string literal. You can use string interpolation in both single-line and multiline string literals.
A localized string can have different values depending on the language in which the project is being build. There are two categories of localized strings: the strings included in the installation package's UI, common to every MSI file.
Apparently, a LocalizedStringKey will automatically generate the localization key depending on the type of the values interpolated. For example, if you have the following Texts
Text("title key")
Text("name key \("Club")")
Text("count key \(8)")
Text("price key \(6.25)")
Your Localizable.strings file should look like
"title key" = "Sandwiches";
"name key %@" = "Name: %@";
"count key %lld" = "%lld sandwiches";
// You can change the format specifier in the value, but not in the key.
"price key %lf" = "Price: %.2lf";
Be careful if you want to support 32-bit systems (iPhone 5 or earlier). In a 32-bit system, Int is Int32, the key of "int32 key \(Int32(8))" is "int32 key %d". You can always convert an integer to Int64 like in "count key \(Int64(8))" to enforce consistent keys across different systems.
Remark 1: For people who want to know how it works. When you use a string literal or an interpolated string such as "count key \(8)" in Text, the compiler will consider the string as a LocalizedStringKey, because Text has an initializer
init(_ key: LocalizedStringKey, tableName: String? = nil, bundle: Bundle? = nil, comment: StaticString? = nil),
and LocalizedStringKey conforms to ExpressibleByStringLiteral and ExpressibleByStringInterpolation and thus can be implicitly initialized from a string literal or a string interpolation.
Remark 2: If you're not sure what the key is, you can get the answer yourself by po a LocalizedStringKey in the debugger like this:
po LocalizedStringKey("count key \(8)")
My way
Localizable file
"myNameIs %@" = "My name is %@.";
SwiftUI file
struct TestLocalize: View {
var name = "Hien Nguyen"
var body: some View {
Text("myNameIs \(name)")
}
}
Result
My name is Hien Nguyen
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With