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 Text
s
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