Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Localization with String interpolation in SwiftUI

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 ...

like image 838
Raphaël Barthomeuf Avatar asked May 27 '20 11:05

Raphaël Barthomeuf


People also ask

How do I localize strings in Swiftui?

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.

What is localized string key Swiftui?

The key used to look up an entry in a strings file or strings dictionary file.

What is string interpolation in Swift?

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.

What is string Localisation?

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.


2 Answers

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)")
like image 190
Cosyn Avatar answered Oct 22 '22 15:10

Cosyn


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

like image 27
Hien.Nguyen Avatar answered Oct 22 '22 17:10

Hien.Nguyen