Possible to use variables and/or parameters with NSLocalizedString?

36,069

Solution 1

It turns out that a missing target entry is to blame. Just checking that my current build target includes the Localizable.string file solved the problem!

Solution 2

If what you want is to return the localized version of "This is an Apple/Orange/whatever", you'd want:

NSString *localizedVersion = NSLocalizedString(([NSString stringWithFormat:@"This is an %@", @"Apple"]), nil);

(I.e., the nesting of NSLocalizedString() and [NSString stringWithFormat:] are reversed.)

If what you want is the format to be localized, but not the substituted-in value, do this:

NSString *finalString = [NSString stringWithFormat:NSLocalizedString(@"SomeFormat", nil), @"Apple"];

And in your Localizable.strings:

SomeFormat = "This is an %@";

Solution 3

I just want to add one very helpful definition which I use in many of my projects.

Inspired by androids possibility, I've added this function to my header prefix file:

#define NSLocalizedFormatString(fmt, ...) [NSString stringWithFormat:NSLocalizedString(fmt, nil), __VA_ARGS__]

This allows you to define a localized string like the following:

 "ExampleScreenAuthorizationDescriptionLbl"= "I authorize the payment of %@ to %@.";

and it can be used via:

self.labelAuthorizationText.text = NSLocalizedFormatString(@"ExampleScreenAuthorizationDescriptionLbl", self.formattedAmount, self.companyQualifier);

Solution 4

For swift :

let myString = String(format: NSLocalizedString("I authorize the payment of %d ", comment: ""), amount)

Solution 5

extension String {
    public var localizedString: String {
        return NSLocalizedString(self, comment: "")
    }

    public func localizedString(with arguments: [CVarArg]) -> String {
        return String(format: localizedString, arguments: arguments)
    }
}

Localizable.string:

"Alarm:Popup:DismissOperation:DeviceMessage" = "\"%@\" will send position updates on a regular basis again.";
"Global:Text:Ok" = "OK";

Usage:

let message = "Alarm:Popup:DismissOperation:DeviceMessage".localizedString(with: [name])

and

let title = "Global:Text:Ok".localizedString
Share:
36,069
futureelite7
Author by

futureelite7

I develop in a variety of different languages, mainly in the following areas: Objective-C and iOS development, HTML and CSS, Javascript and jQuery, Java (JSP), C#

Updated on November 19, 2020

Comments

  • futureelite7
    futureelite7 over 3 years

    I have tried using a variable as an input parameter to NSLocalizedString, but all I am getting back is the input parameter. What am I doing wrong? Is it possible to use a variable string value as an index for NSLocalized string?

    For example, I have some strings that I want localized versions to be displayed. However, I would like to use a variable as a parameter to NSLocalizedString, instead of a constant string. Likewise, I would like to include formatting elements in the parameter for NSLocalizedString, so I would be able to retrieved a localized version of the string with the same formatting parameters. Can I do the following:

    Case 1: Variable NSLocalizedstring:

    NSString *varStr = @"Index1";
    NSString *string1 = NSLocalizedString(varStr,@"");
    

    Case 2: Formatted NSLocalizedString:

    NSString *string1 = [NSString stringWithFormat:NSLocalizedString(@"This is an %@",@""),@"Apple"];
    

    (Please note that the variable can contain anything, not just a fixed set of strings.)

    Thanks!