11

I'm creating a Mac app and I want to localize my Labels. I thought a .strings file would be a better choice. But I have trouble reading .strings file in Objective-C. I'm looking for a simpler method.

This is my .string file content:

"LABEL_001" = "Start MyApp";
"LABEL_002" = "Stop MyApp";
"LABEL_003" = "My AppFolder";
...

I have already looked at http://developer.apple.com/library/mac/#documentation/cocoa/conceptual/LoadingResources/Strings/Strings.html.

This is my code:

NSBundle *bundle = [NSBundle mainBundle];
NSString *strFilePath = [[NSBundle mainBundle] pathForResource:@"Labels" ofType:@"strings"];
NSString *tt =NSLocalizedStringFromTableInBundle(@"LABEL_001",strFilePath,bundle, nil);
NSLog(@"STRING ::: %@",tt);

But the string tt gives "LABEL_001", I want "Start MyApp"

What am I doing wrong?

1
  • Have you looked at NSLocalizedString ? Commented Aug 17, 2012 at 10:44

4 Answers 4

30

One. You have to name your file Localizable.strings in the <LANGUAGENAME>.lproj directory in the app bundle.

Two. Use the NSLocalizedString macro:

NSString *loc = NSLocalizedString(@"LABEL_001", nil);

Three. If nothing works, you can initialize an NSDictionary using a strings file, as a strings file is a special type of plist:

NSString *fname = [[NSBundle mainBundle] pathForResource:@"whatever" ofType:@"strings"];
NSDictionary *d = [NSDictionary dictionaryWithContentsOfFile:fname];
NSString *loc = [d objectForKey:@"LABEL_001"];
Sign up to request clarification or add additional context in comments.

1 Comment

Swift4, the same idea, still helpful. Thanks
2
    NSString *path = [[NSBundle mainBundle] pathForResource:@"Labels" ofType:@"strings"];
    NSData *plistData = [NSData dataWithContentsOfFile:path];
    NSString *error; NSPropertyListFormat format;

    NSDictionary *dictionary = [NSPropertyListSerialization propertyListFromData:plistData
                                                          mutabilityOption:NSPropertyListImmutable
                                                                    format:&format
                                                          errorDescription:&error];
    NSString *stringname = [dictionary objectForKey:@"LABEL_001"];

I think it will be helpful to you.

Comments

1

Here the your code

NSBundle *bundle = [NSBundle mainBundle];
NSString *strFilePath = [[NSBundle mainBundle] pathForResource:@"Labels" ofType:@"strings"];
NSString *tt =NSLocalizedStringFromTableInBundle(@"LABEL_001",strFilePath,bundle, nil);
NSLog(@"STRING ::: %@",tt);

The problem here is the 2nd Param "strFilePath", change it to @"Labels" so the above code would become,

NSString *tt =NSLocalizedStringFromTableInBundle(@"LABEL_001",@"Labels",bundle, nil);

For reference, the following line copied from Apple Docs regarding table name, "When specifying a value for this parameter, include the filename without the .strings extension."

hope this helps.

Comments

0

Simple Code

Just create a method as follows

- (void)localisationStrings
{
    NSString* path = [[NSBundle mainBundle] pathForResource:@"localisation" ofType:@"strings"];
    NSDictionary *localisationDict = [NSDictionary dictionaryWithContentsOfFile:path];
    NSLog(@"\n %@",[localisationDict objectForKey:@"hello"]);
}

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.