我在尝试这个:
NSDictionary *components = [NSDictionary dictionaryWithObject:@"USD" forKey:NSLocaleCurrencyCode];
NSString *localeIdentifier = [NSLocale localeIdentifierFromComponents:components];
NSLocale *localeForDefaultCurrency = [[NSLocale alloc] initWithLocaleIdentifier:localeIdentifier];
Run Code Online (Sandbox Code Playgroud)
它创建NSLocale对象,但它不包含任何区域信息.例如,
[localeForDefaultCurrency objectForKey:NSLocaleCountryCode];
Run Code Online (Sandbox Code Playgroud)
返回零;
知道如何从货币代码中获取NSLocale吗?
我有一个NSString,我想转换成一个NSDecimalNumber.该字符串是从服务器接收的,并且始终使用en_US类似于XXX.YYY或不相似的语言环境进行格式化XXX,YYY.我想创建一个NSDecimalNumber接受XXX.YYY用户无论语言环境如何.该数字永远不会显示给用户,它用于进行内部数学运算.
通常你会做这样的事情:
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234"];
Run Code Online (Sandbox Code Playgroud)
但是,如果用户正在运行fr_FRMac OS X 的区域设置,则会中断.en_US将其解释为一点二三四,其中 - fr_FR将其解释为一千二百三十四,两者都是非常不同的数字.
显而易见的解决方案是使用+decimalNumberWithString:locale:.但是我不确定将该locale:参数作为参数传递给所有国际版本的Mac OS X.我最好的猜测是这样做:
NSLocale *l = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Run Code Online (Sandbox Code Playgroud)
这是最好的方法吗,安全吗?@"en_US"是否可以在所有国际版本的Mac OS X上使用本地标识符,或者nil在某些情况下是否可以返回NSLocale?
更新1:这似乎运作良好,更明确:
NSDictionary *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Run Code Online (Sandbox Code Playgroud)
NSLocaleDecimalSeparator是一个为NSLocale定义的常量,它响应-objectWithKey:,就像NSDictionary一样.你可以提供你想要的任何小数点分隔符,比如@"," …
简单地说,我有一个正整数[9,393,3,993],我想将它本地化为某种语言[9,393,3,939].
如果我使用NSNumberFormatter,它将根据用户的语言环境本地化数字.但是,我想覆盖它并选择任何语言环境来将数字转换为.
我尝试以下,并没有工作:
// user locale is @"en"
NSNumberFormatter* formatter = [NSNumberFormatter new];
[formatter setNumberStyle:NSNumberFormatterNoStyle];
[formatter setLocale:[[NSLocale alloc] initWithLocaleIdentifier:@"ar"]];
[formatter setMinimumIntegerDigits:padding];
return [formatter stringFromNumber:@(num)];
Run Code Online (Sandbox Code Playgroud)
返回的字符串是英文的.
请注意,我有一个非常相似的代码片段NSDateFormatter,但它按预期工作.该NSDateFormatter对象尊重设置的区域设置.
所以在我的应用程序中,我试图让设备目前设置语言及其首字母缩略词.所以我这样做:
NSString *fullLanguage = [[NSLocale currentLocale] displayNameForKey:NSLocaleIdentifier value:[[NSLocale preferredLanguages] objectAtIndex:0]];
NSString *abrlanguage = [[NSLocale preferredLanguages] objectAtIndex:0];
Run Code Online (Sandbox Code Playgroud)
但是有些用户报告说语言正在返回类似:en_UK或类似的内容,这反过来又搞乱了我的应用程序的功能.
无论如何,有没有办法获得设备的当前设置语言,无论设备区域设置如何?
谢谢!
NSLocale currentLocale与autoupdatingCurrentLocale之间有什么区别?从阅读文档来看并不明显.
我有这个代码:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSMutableArray *daysNames = [NSMutableArray arrayWithArray:dateFormatter.weekdaySymbols];
NSLog(@"daysNames = %@", daysNames);
Run Code Online (Sandbox Code Playgroud)
它输出:
daysNames = (
Sunday,
Monday,
Tuesday,
Wednesday,
Thursday,
Friday,
Saturday
)
Run Code Online (Sandbox Code Playgroud)
我的问题是:
如果用户位于美国以外的其他国家/地区,让我们说法国或俄罗斯,阵列是否仍然从星期日(而不是星期一)开始,或者我不应该依赖于此?
事情是我设置闹钟日.在视觉上,用户从表视图中选择,该视图在第一行中始终具有星期一.如果日期设置与否,我会根据事实在NSMutableArray中保留0或1.如果daysNames [0]总是对应于星期日,我可以轻松地将所有元素向右移动一个位置,并且一切都将正确映射,否则当周星期一开始而不是星期日时,我还会遇到更多令人头疼的问题.
这是我为此写的完整代码(在美国它运作完美):
// Set the short days names
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
NSMutableArray *daysNames = [NSMutableArray arrayWithArray:dateFormatter.weekdaySymbols];
NSLog(@"daysNames = %@", daysNames);
// daysNames will become @"SUN MON TUE WED THU FRI SAT";
for (NSInteger i = 0; i < daysNames.count; i++) {
NSUInteger length = ((NSString *)daysNames[i]).length; …Run Code Online (Sandbox Code Playgroud) 我希望能够根据用户位置更改应用程序.我使用下面的代码:
NSLocale *locale = [NSLocale autoupdatingCurrentLocale];
NSString *countryCode = [locale objectForKey: NSLocaleCountryCode];
NSString *countryName = [locale displayNameForKey: NSLocaleCountryCode value: countryCode];
NSLog(@"countryName %@", countryName);
Run Code Online (Sandbox Code Playgroud)
这很好用,但我想知道它是如何countryName显示的,所以我可以设置开关盒,如果你不知道每个国家的拼写是多么困难:美国,美国,美利坚合众国等等是否有Apple的countryCode列表,我找不到.
还有办法确保结果是英文的吗?
我想获得系统默认语言和系统区域设置.
我已经尝试了以下代码片段来获取系统当前语言环境,如下所示
NSLocale *locale;
locale = [NSLocale systemLocale];
NSString * localLanguage = [locale objectForKey:NSLocaleIdentifier];
NSLog (@"Language : %@", localLanguage);
NSLog(@"System locale Identifier %@",[locale localeIdentifier]);
Run Code Online (Sandbox Code Playgroud)
但系统区域设置标识符没有显示任何内容.如果它是currentlocale,它会给出正确的结果.为什么系统区域设置没有给出任何值以及如何获取系统默认语言而不是用户首选语言?请帮助
有没有办法在运行单元测试时强制使用特定的语言环境?
例如。始终使用 en_US 或强制无语言环境,以便不加载任何 .lproj 文件。
我的单元测试对设置应用程序(在 iOS 模拟器中)中当前选择的语言很敏感。最好我希望我的单元测试对语言不敏感。
下面是我的单元测试代码,显示了问题
@interface MYGalleryTests : SenTestCase
@end
@implementation MYGalleryTests
-(void)test0 {
// This test doesn't work.
// I get 'No pictures' when locale is en_US
// I get 'Ingen billeder' when locale is da_DK
NSString* actual = [MYGallery emptyMessage];
NSString* expected = @"EMPTY_MESSAGE";
STAssertEqualObjects(actual, expected, nil);
}
@end
@interface MYGallery : NSObject
+(NSString*)emptyMessage;
@end
@implementation MYGallery
+(NSString*)emptyMessage {
return NSLocalizedStringFromTable(@"EMPTY_MESSAGE", @"Gallery", @"Message shown when gallery is empty");
}
@end
en.lproj/Gallery.strings
/* Message …Run Code Online (Sandbox Code Playgroud) 我的应用程序在运行时更改语言,并建议用户重新启动应用程序.我是这样做的:
typealias LanguageLocaleType = (language: String?, locale: String?, title: String)
let elements: [LanguageLocaleType] = [
(nil, nil, "System Default"),
("en", "en_US", "English"),
("ar", "ar_SA", "Arabic"),
]
//...func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath)...
let element = elements[indexPath.row]
guard let language = element.language else {
// How to really reset app back to OS language/locale???
UserDefaults.standard.removeObject(forKey: "AppleLanguages")
UserDefaults.standard.removeObject(forKey: "AppleLocale")
return
}
UserDefaults.standard.set([language], forKey: "AppleLanguages")
if let locale = element.locale, !locale.isEmpty,
Locale.current.identifier != locale,
!Locale.current.identifier.hasPrefix("\(language)_") {
UserDefaults.standard.set(locale, forKey: "AppleLocale")
}
Run Code Online (Sandbox Code Playgroud)
我想提供在列表中设置语言并选择正确的语言,其中一个语言被提供给语言设置System …
nslocale ×10
ios ×5
objective-c ×4
cocoa ×3
locale ×2
localization ×2
macos ×2
swift ×2
cocoa-touch ×1
currency ×1
foundation ×1
iphone ×1
nsstring ×1