2015-08-30 58 views
0

我有設置NSUserDefaults根據英文版播放歌曲的方法。我目前正在將其全部翻譯成其他語言,但由於警報基於NSUserDefaults對象。這應該使更多的意義:獲取本地化字符串的英文版

- (void)applySoundNameAndSaveSoundToNSUserDefaults { 
    [self.audioPlayer stop]; 

    NSString *soundName = self.soundNameLabel.text; 
    [[NSUserDefaults standardUserDefaults] setObject:soundName forKey:@"AlarmSound"]; 
} 

所以你可以看到,如果電池標籤是局部的,它將把該名稱的語言版本NSUserDefaults的中,如果我去做了這種方式,我不想至。

這是我怎麼玩:

self.alarmSound = [[NSUserDefaults standardUserDefaults] stringForKey:@"AlarmSound"]; 

- (void) fireLocalNotification { 
    NSString *notificationSound; 
    notificationSound = [NSString stringWithFormat:@"%@", self.alarmSound]; 
    notificationSound = [notificationSound stringByAppendingString:@".caf"]; 

    UILocalNotification *localNotification = [[UILocalNotification alloc] init]; 
    localNotification.soundName = [NSString stringWithFormat:@"%@", notificationSound]; 
} 

這個擁有一種問題,因爲在主束我sound.caf文件中的英文格式命名。那麼如何在本地化時獲得英文版本的'self.soundNameLabel.text'?


編輯我發現這個在docs:initWithFormat:locale:這正是我要找的。但我讀過它不是autoreleased,所以我不知道這是我應該使用的東西。此外,使用它

+0

你做錯了。不要將程序行爲基於顯示給用戶的字符串。我確信你可以保留必要的信息,而不是本地化的文本。 – Sulthan

回答

0

Jteve,

,當我得到的東西,這樣的錯誤「字符串不是文字字符串」我可能會用一個簡單的驗證做到這一點。您可以使用其他方式來解決您的問題,但這意味着您必須更改所有代碼。這是我會做什麼(不推薦THO):

- (void)applySoundNameAndSaveSoundToNSUserDefaults { 

    [self.audioPlayer stop]; 

    NSString *soundName = self.soundNameLabel.text; 

    //You know your translation value and your original English String so: 

    if ([soundName isEqualToString:@"SpanishString1"] || [soundName isEqualToString:@"GermanString1"]) { 
     soundName = @"EnglishString1"; 
    } else if ([soundName isEqualToString:@"GermanString2"]) { 
     soundName = @"EnglishString2"; 
    } 

//Multiple if conditions in case you have more than one .caf 

    [[NSUserDefaults standardUserDefaults] setObject:soundName forKey:@"AlarmSound"]; 

} 

這樣的

- (void) fireLocalNotification 

方法將不受影響

我強烈建議不惜一切代價避免創建算法邏輯基礎本土化。你的代碼應該在任何語言上完美地工作,因爲這應該只是表面上的。

我希望這可以工作。還有其他方法可以做到這一點,但這是避免更改整個方法的最簡單方法。

+0

我想避免這種情況,我希望有一個更簡單的API友好的方法,我不會創建一個條件if語句,因爲我有很多語言和___很多聲音名稱(類似於22)所以這將是很多if語句 –

+0

您可以在您的souneNameLabel上使用標籤,並且只需將您的.caf的名稱從1到22。和你避免所有本地化@JteveSobs –

+0

theres只有1個標籤雖然(標籤更改取決於選擇),所以這是一個好主意,但不會工作。標籤總是等於1或我設置的任何東西。我只是想知道是否有一種方法來獲得本地化字符串的反向 –

0

我能夠解決這個問題,只需創建一個從主包的鍵/對象字典,因爲那是本地化的字符串,然後得到對象的鍵(這將永遠是英語,因爲那是我的基礎) :

NSString *localizedSoundName = self.soundNameLabel.text; 

NSDictionary *localizedDict = [[NSDictionary alloc] initWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings"]]; 
NSArray *tempArray = [localizedDict allKeysForObject:localizedSoundName]; 
NSString *englishSoundName = [tempArray objectAtIndex:0]; 

[[NSUserDefaults standardUserDefaults] setObject:englishSoundName forKey:@"AlarmSound"]; 
0

您應該重做您的模型,以便將面向用戶的UI字符串與基礎文件名分開。例如,設想一個表示聲音的模型對象,它將有一個displayName(向用戶顯示,本地化)和一個fileName(傳遞給AVAudioPlayer)。無論應用程序的本地化位置如何,fileName始終對應於正確的文件。

+0

這正是我的案例benjamin? displayName(顯示給用戶,本地化)是例如@「Polizei」,而fileName(傳遞給AVAudioPlayer)是Police.caf,這就是爲什麼我需要英文版本。我沒有'objectAtIndex'來引用,否則這個問題甚至不會被詢問,這是一個只從標籤中獲取它的例子 –