核心是使用
NSString *path = [[NSBundle mainBundle]pathForResource:currentLanguage ofType:@"lproj"]; if (path) { localeBundle = [NSBundle bundleWithPath:path]; }else{ localeBundle= [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]]; }
改变localeBundle的值
思路:
1.使用
NSLocalizedStringFromTableInBundle(@"TNC_title", nil, localeBundle] , @""),
可以实时变换不同的国际化文件
*国际化文件一般在文件目录系统是放在lproj后缀的文件夹中的:形式如zh-Hant.lproj(繁体)zh-Hants.lproj(简体)en.lproj(英文)
因此在上文的pathForResource:currentLanguage中也需要对应相应的文件名。
2.再刷新一遍UI的text获取
基于项目的代码示例:
建一个工具类.h:
#import <Foundation/Foundation.h> @interface LanguageTool : NSObject +(instancetype)getInstance; - (NSBundle *)getLocaleBundle; -(NSString *)getTap; -(NSString *)getCurrentLanguage; -(void)changeLanguage:(NSString*)language; @end
.m:
#import "LanguageTool.h" #import "SessionManager.h" #define CNS @"zh" #define EN @"en" #define tap @"change_language" static NSBundle *localeBundle = nil; static NSString *currentLanguage = nil; @interface LanguageTool() @end @implementation LanguageTool //单例 +(instancetype)getInstance{ static LanguageTool *manager = nil; static dispatch_once_t onceToken = 0; dispatch_once(&onceToken, ^{ manager = [[LanguageTool alloc] init]; }); return manager; } -(void)changeLanguage:(NSString*)language{ currentLanguage = language; NSString *path = [[NSBundle mainBundle]pathForResource:language ofType:@"lproj"]; if (path && ![@"en" isEqualToString:language]) { localeBundle = [NSBundle bundleWithPath:path]; }else{ localeBundle = [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]]; } } //这个方法的目的是,如果什么都没有选择,就使用系统默认语言,否则使用用户选择的语言,并且不会因为关闭app而改变。 -(void)judgeLanguage{ //Get last change language NSString *lastChangeLanguage = nil; //使用一个持久化,保持上次的语言选择 lastChangeLanguage = [SessionManager getSession:[SessionManager getLastLanguageTap]]; NSLog(@"last chage language: %@",lastChangeLanguage); //语言优先级:currentLanguage > lastChangeLanguage > system default language //user 没有设定语言时:获取系统默认语言 if (!lastChangeLanguage) { if (!currentLanguage) { //获取系统默认语言: //截取:zh-Hant-HK 去掉区域保留:zh-Hant NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]); currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2]; if ([currentLanguage containsString:@"zh"]) { currentLanguage = [NSString stringWithFormat:@"%@%@",currentLanguage,@"-Hant"]; } } }else if(!currentLanguage){ //当前没有切换语言,app内有设定语言,优先app内语言 currentLanguage = lastChangeLanguage; } } - (NSBundle *)getLocaleBundle{ [self judgeLanguage]; NSLog(@"------current language :%@",currentLanguage); NSLog(@"-------system language:%@",[NSLocale preferredLanguages][0]); NSString *path = [[NSBundle mainBundle]pathForResource:currentLanguage ofType:@"lproj"]; if (path) { localeBundle = [NSBundle bundleWithPath:path]; }else{ localeBundle= [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj" ]]; } return localeBundle; } //标记 -(NSString *)getTap{ return tap; } -(NSString *)getCurrentLanguage{ // if (!currentLanguage) { // //截取:zh-Hant-HK 去掉区域保留:zh-Hant // currentLanguage = [[NSLocale preferredLanguages][0] substringToIndex:2]; // } [self judgeLanguage]; NSLog(@"current language:%@",currentLanguage); return currentLanguage; } @end
使用在需要切换语言的地方点击后调用:
//如果当前是英语就切换成繁体 if ([@"en" isEqualToString:[[LanguageTool getInstance] getCurrentLanguage]]) { [self changeLanguage:@"zh-Hant"]; } else { [self changeLanguage:@"en"]; } //通知其他页面也切换语言 [self callLanguageChangeNotificationReceiver];
-(void)changeLanguage:(NSString*)language{ [[LanguageTool getInstance] changeLanguage:language]; //刷新某些UI text [self initTableResource]; [_tableView reloadData]; }
//例如这样刷新:
-(void)initTableResource{ _dataArray = @[NSLocalizedStringFromTableInBundle(@"Home", nil, [[LanguageTool getInstance] getLocaleBundle] , @""), NSLocalizedStringFromTableInBundle(@"customization", nil, [[LanguageTool getInstance] getLocaleBundle] , @"") , NSLocalizedStringFromTableInBundle(@"TNC_title", nil, [[LanguageTool getInstance] getLocaleBundle] , @""), NSLocalizedStringFromTableInBundle(@"localizable", nil, [[LanguageTool getInstance] getLocaleBundle] , @"")]; NSString *app_version = [[[NSBundle mainBundle]infoDictionary] objectForKey:@"CFBundleShortVersionString"]; _app_version_string = [NSString stringWithFormat:@"%@ %@",NSLocalizedStringFromTableInBundle(@"slider_version_info", nil, [[LanguageTool getInstance] getLocaleBundle] , @""),app_version]; if (_version_label) { _version_label.text = _app_version_string; } [self initContentVersionLabel]; }
//设置通知:
-(void)callLanguageChangeNotificationReceiver{ [SessionManager setSession:[SessionManager getLastLanguageTap] value:[[LanguageTool getInstance] getCurrentLanguage]]; NSNotificationCenter *center = [NSNotificationCenter defaultCenter]; [center postNotificationName:[[LanguageTool getInstance] getTap] object:nil]; }
被通知的页面接收通知,并刷新一下UI,操作并不复杂:
-(void)initNotification{ [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTextView) name:[[LanguageTool getInstance]getTap] object:nil]; } -(void)refreshTextView{ _tncTextView.text = NSLocalizedStringFromTableInBundle(@"TNC_text", nil, [[LanguageTool getInstance] getLocaleBundle] , @""); _navItem.title = NSLocalizedStringFromTableInBundle(@"TNC_title", nil, [[LanguageTool getInstance] getLocaleBundle] , @""); }
资料:
1.http://blog.csdn.net/feng2qing/article/details/60479620
swift:
NSLocalizedString(Config.advanced.ping_test_title, tableName: nil, bundle: (LanguageTool.getInstance()?.getLocaleBundle())! ,value: "", comment: "")
相关推荐
安卓需要的文件
本项目“ios-App主题替换.zip”提供了一种高效的方法,通过IATheme框架来实现这一目标。IATheme由CranzCapatain在GitHub上开源,旨在简化iOS应用的主题切换过程,同时支持高度自定义。 首先,我们要理解IATheme的...
通过以上步骤,我们可以创建一个自定义的语言管理器,使iOS应用能够在不重新启动的情况下响应语言的改变,从而提升用户体验。这个过程涉及到对iOS系统和Swift语言的深入理解,以及对国际化原则的遵循。在实际开发中...
在iOS应用开发领域,Object-C是苹果官方早期推荐的编程语言,尽管现在Swift已经更为流行,但许多现有的代码库和教程仍然基于Objective-C。对于初学者来说,掌握Object-C的基本语法和特性是至关重要的,特别是在探索...
《Advanced iOS App Architecture (Swift 5)》是Raywenderlich出版的一本深入探讨iOS应用架构的高级指南,专门针对Swift 5编程语言。这本书旨在帮助开发者构建更稳定、可维护且易于扩展的iOS应用程序。它涵盖了多个...
本资源"App内切换语言"提供了一种简洁而实用的方法来实现在应用程序内部动态切换语言的功能。以下是对这个主题的详细解释: 1. **国际化(i18n)与本地化(l10n)** 国际化是一种设计过程,使软件能够适应不同的...
在iOS开发中,Swift是一种现代、安全且功能强大的编程语言,由Apple于2014年发布。它被设计用来简化Objective-C的复杂性,同时提供高性能和易于阅读的语法。Swift的特点包括类型推断、可选类型、闭包、泛型以及强大...
本教程将深入探讨Swift中实现国际化(Internationalization)的机制,包括资源文件的设置、代码的编写以及如何在App内部实现语言的便捷切换。 一、Swift中的国际化基础 1. InfoPlist.strings:每个支持的语言都...
- **App Store和Siri语言**:系统语言更改可能会影响到App Store和Siri的语言,你可以在相应的设置里单独调整它们。 总的来说,iOS的手动语言切换功能非常灵活,可以适应用户的不同需求。通过以上步骤,你不仅可以...
5. 描述文件(Profile)安装:对于iOS设备,描述文件的安装是必要的,它允许设备信任并运行该应用,尤其在非App Store分发的情况下。 这款"仿25ge封装的APP封装源码"很可能提供了自定义的封装流程,允许开发者更...
总结,实现iOS应用内的语言切换需要对国际化的基本概念有深刻理解,包括字符串文件、故事板本地化以及如何根据用户选择动态改变语言。通过以上步骤,开发者可以为用户提供一个更加友好和个性化的多语言体验。
iOS7引入了全新的设计语言,这使得许多在iOS6中正常工作的元素在新系统中可能需要调整。下面我们将详细探讨适配过程中的关键知识点。 1. Auto Layout(自动布局):iOS7引入了Auto Layout,这是一个强大的布局系统...
在iOS中,这通常是通过使用NSBundle和NSLocalizedString宏来实现的,这些工具允许开发者将硬编码的文本替换为可以在不同语言包中查找的键值对。 本地化则是将国际化应用具体转化为特定地区的版本。它包括翻译文本、...
Objective-C是一种强大的面向对象的编程语言,它是Apple生态系统的核心语言,特别用于开发iOS和macOS的应用程序。这个项目中,开发者可能利用了Objective-C的特性,如消息传递、类别(categories)、协议(protocols...
在iOS开发领域,iPhone App的源代码是学习和实践的核心部分。这个名为“pursueme”的项目,根据标题和描述,是一个专为初学者设计的练习应用,它涉及到图片显示和按钮交互的基础功能。这样的小程序是理解iOS应用开发...
在iOS应用开发中,设计和实现一款新闻类App的Tab样式是至关重要的,因为它直接影响到用户的交互体验和视觉感受。"ios模仿新闻类app的tab样式"这一主题旨在探讨如何在iOS平台上创建类似新闻应用中常见的底部导航栏...
- 在`AppDelegate`中监听`UserDefaults`变化,当语言设置改变时,调用`LanguageManager`的更新方法。 4. 缺陷与优化: - 当语言资源文件较多时,管理起来可能会变得复杂,需要良好的文件组织和命名规范。 - 必须...
内购(In-App Purchase,简称IAP)是iOS应用开发中的一个重要功能,允许用户在应用程序内部购买额外的内容、服务或功能。Objective-C是苹果官方早期推荐的编程语言,而Swift则是苹果后来推出的更现代、更安全的替代...
在实际项目中,开发者还需要考虑如何处理用户在运行时改变设备语言的情况。Hodor可能提供了一种优雅的方式来监听语言更改并实时更新应用程序的界面。 总的来说,"Simple solution to localize your iOS App"项目...