NSLocalizedString only retrieves the key, not the value in Localizable.strings (IOS)

孤街浪徒 提交于 2019-12-17 15:53:24

问题


I've made a strings file named "Localizable.strings" and added two languages to it, like so:

"CONNECTIONERROR" = "Check that you have a working internet connection.";
"CONNECTIONERRORTITLE" = "Network error";

I have also converted the files to Unicode UTF-8 However, when I create a UIAlertView like this:

 UIAlertView *myAlert = [[UIAlertView alloc]
 initWithTitle:NSLocalizedString(@"CONNECTIONERRORITLE",nil)
 message:NSLocalizedString(@"CONNECTIONERROR",nil)                    
 delegate:self
 cancelButtonTitle:@"Ok"
 otherButtonTitles:nil];

the alert view only shows the key text, not the value. It works if I, for example, set a UITextviews text to NSLocalizedString(@"CONNECTIONERROR",nil), but the alert view only displays the key. Anyone know what's wrong?


回答1:


In my case it was because I had mistakenly named the file "Localization.strings" and hadn't noticed (it has to be named Localizable.strings). As explained previously the symptom is because the compiler cannot find the string. Otherwise the cause could be any number of things but usually it's a missing semi colon or quotation mark. These are hard to find when you're doing a lot of localizations at once. The lesson learned is to start building your localization file early on in your development process and build it as you go, so that they are easier to spot.




回答2:


Same problem, solved using the filename: Localizable.strings




回答3:


Change your .strings file name to Localizable.strings, it worked for me.




回答4:


Double check that the Localizable.strings file is being added to

Targets -> BuildPhases -> Copy Bundle Resources

It hadn't been added automatically for me.




回答5:


Tested the app on an actual device and it worked




回答6:


I have been searching the solution for 5 hours, I tried everything I could to make my app localization working.

The problem was that one of the Pods of my project had a Localizable.strings file (actually it was Parse pod that had not renamed it). Therefore my Localizable.strings file was not recognized by my app.

I fixed the issue by changing the name of the file to "MyappnameLocalizable.strings" and using NSLocalizedString this way:

        NSLocalizedString("key", tableName: "MyappnameLocalizable", comment: "comment")



回答7:


I was having problems with this on the iOS Simulator. I ended up deleting the Localization.strings file in the simulator directory

( /Users/(me)/Library/Application Support/iPhone Simulator/5.0/Applications/(etc)/(project)/(application.app)

cd to there and delete all copies of Localization.strings found there.

For some reason the usual rubber chicken voodoo of build clean, quit iOS Simulator, quit XCode, etc wasn't working, but this did. At least for me, today.




回答8:


This is happening when the runtime can't find the specified key, for whatever reason. In your case, it's most likely due to a typo: CONNECTIONERRORITLE is missing a T for TITLE. Also pay attention to any warnings/error when compiling regarding the Localizable.strings file: if there are unbalanced " or missing ; the file cannot be compiled/read correctly.




回答9:


Change the name of the file to Localizable.strings, make sure the target in the file inspector is set. To avoid syntax errors right click on Localizable.strings file->open as->ASCII property list Also, cleaning the project and building again helped in my case.




回答10:


NSLocalizedString usage means you need the EXACT case and spelling of your key in order to get the content from it. You'll notice that this one says

NSLocalizedString(@"CONNECTIONERRORITLE",nil)

when it should be

NSLocalizedString(@"CONNECTIONERRORTITLE",nil)

If you look at the last part of the first one, it says 'ITLE', not 'TITLE'




回答11:


Rename the InfoPlist.strings file to Localizable.strings (double clic) and then you will get the correct string for that key.




回答12:


To find out if the Localizable.strings file is being found, check the content of your .app build and you can also do this in code:

//en is for English for example so specify yours here NSString *path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];

If path is NULL, it means file not found.




回答13:


If you wrote double semicolons at the end of a line, NSLocalization does not working. You should check Localizable.strings file if there is ';;'




回答14:


If you have any extra semicolon in your strings file, it doesnt localise.




回答15:


I faced a similar problem, suddenly my localizable strings didn't work at all. Then I used file-compare with the old .strings copy, and at-last I found I have accidentally deleted a key in it.

So Definitely if the format is wrong Xcode will not read the strings for you.

This is the format it expects "Key" = "Value";




回答16:


Put an ; at end of the lines in the Localizable.strings files.




回答17:


In my case, I tried clean project and delete derived data still not work. I remove several line breaks in the strings file and then Xcode find the strings again.




回答18:


None of the suggested solutions worked for me, but I did solve the issue by deleting the .app file in Products




回答19:


When you are developing an SDK. You need some extra operation.

1) create Localizable.strings as usual in YourLocalizeDemoSDK.

2) create the same Localizable.strings in YourLocalizeDemo.

3) find your Bundle Path of YourLocalizeDemoSDK.

Swift4:

// if you use NSLocalizeString in NSObject, you can use it like this
let value = NSLocalizedString("key", tableName: nil, bundle: Bundle(for: type(of: self)), value: "", comment: "")

Bundle(for: type(of: self)) helps you to find the bundle in YourLocalizeDemoSDK. If you use Bundle.main instead, you will get a wrong value(in fact it will be the same string with the key).

But if you want to use the String extension mentioned by dr OX. You need to do some more. The origin extension looks like this.

extension String {
    var localized: String {
        return NSLocalizedString(self, tableName: nil, bundle: Bundle.main, value: "", comment: "")
    }
}

As we know, we are developing an SDK, Bundle.main will get the bundle of YourLocalizeDemo's bundle. That's not what we want. We need the bundle in YourLocalizeDemoSDK. This is a trick to find it quickly.

Run the code below in a NSObject instance in YourLocalizeDemoSDK. And you will get the URL of YourLocalizeDemoSDK.

let bundleURLOfSDK = Bundle(for: type(of: self)).bundleURL
let mainBundleURL = Bundle.main.bundleURL

Print both of the two url, you will find that we can build bundleURLofSDK base on mainBundleURL. In this case, it will be:

let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main

And the String extension will be:

extension String {
    var localized: String {
        let bundle = Bundle(url: Bundle.main.bundleURL.appendingPathComponent("Frameworks").appendingPathComponent("YourLocalizeDemoSDK.framework")) ?? Bundle.main
        return NSLocalizedString(self, tableName: nil, bundle: bundle, value: "", comment: "")
    }
}

Hope it helps.




回答20:


Because I stumbled upon this when looking for the answer to a similar problem, I'm leaving my solution here:

If your key has "\u2028" in it instead of "\n", it will always return just the key and not the value. Seems to be a bug with localization.




回答21:


The first line of the localization file must contain a mapping, otherwise the SDK won't read the file.




回答22:


Resetting the simulator settings worked for me.

iOS Simulator > Reset Content and Settings...




回答23:


Be sure to not put '@' in front of your key or value like so:

@"key" = @"value";

It should be just:

"key" = "value";

The '@' only goes in front of the key when accessing it:

NSWebLocalizedString(@"key", @"label for coder");



回答24:


I had everything working when suddenly localization just stopped translating strings. This means the file is somehow unreadable to Xcode.

This had happened to me because I had pasted a bad character in the Localized.strings file. When I deleted the few lines with the offending character (a non unicode character? bad quote signs? Couldn't tell) everything went back to normal.

To find the offending lines I made a breakpoint, and manually translated the strings in my file in the debugger, until I hit the first one that won't translate.




回答25:


Did you tried cleaning and rebuilding the project?




回答26:


For xcode 9.2 removing "Localizable.strings" files from the simulators for the project using console solved it for me. Here is the commands for the lazy ones like me ;)

Do not forget to replace YOUR_APP_NAME_HERE with your project name

Shell script:

cd
cd Library/Developer/CoreSimulator/Devices/
find . -name "Localizable.strings" | grep "YOUR_APP_NAME_HERE.app" | xargs rm

If you are experiencing the problem with Unit Tests it will work in simulator ;)




回答27:


Swift 4:

If you use more than one bundle such as you use it in an external framework:

var currentBundle = Bundle.main
NSLocalizedString("CONNECTIONERRORITLE", tableName: nil, bundle: currentBundle, value: "", comment: "")



回答28:


I resolved it using this approach.

The localize file was created with the name main.Strings. Then, I open the main.Strings files (for each language added) and I renamed them manually with the name localize.strings and add them one by one to my project, also I deleted the main.strings.

The second thing to evaluate is: check . your file, all the keys have to end with ; and be sure all the quotes are properly opened and closed.

And you can use in swift 4 :

myButon.setTitle(NSLocalizedString("forgotpassword.key", comment: ""), for: UIControlState.normal)



回答29:


I had the issue when one language was working properly and other language worked half of the time and other time I was getting the key, instead of localized version of that key.

Problem in my case was that after manually merging version control conflict, there was extra line of '>>>>>' left, project didn't complain (not like when you miss the semicolon, it complains) and was building properly, so every key before that '>>>>>' was being translated and every key after, not.

If more simpler solutions fails, you might have to go through every line and look for extra characters (not only '>>>>>', other extra characters too), or if you are using the version control get older, stable version of Localizable.strings file and manually go through changes and add later commits.



来源:https://stackoverflow.com/questions/9251177/nslocalizedstring-only-retrieves-the-key-not-the-value-in-localizable-strings

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!