iPad 应用程序 - 以编程方式更改语言

2024-02-24

我有一个需要两种语言的应用程序:英语和法语。

我已经在各自的“en.lproj”和“fr.lproj”文件夹中设置了 Localized.strings 文件...当我更改 iPad 的语言(在本机设置应用程序中),然后启动我的应用程序时,它确实如此事实上加载正确的文本(即英文副本或法文副本)。

我需要在两种语言之间进行 UISegmentedControl 切换,而无需重新启动应用程序。

如何让应用程序更改(当前)语言,以便当我调用(重新)设置所有 UILabels 文本和 UIImageViews 图像的方法时,它们从相反的 .lproj 文件夹的 Localized.strings 文件中读取?!?

我知道如何使用 UISegmentedControl,这不是我的问题。我正在寻找更多设置应用程序的捆绑语言或区域设置或其他内容的代码行(因为我对 Internationalization.localization 还很陌生)。

-

我如何为 UIImageView 设置图像的示例:

myUIImageView1.image = [UIImage imageNamed:NSLocalizedString(@"myUIImageView1", @"comment for the translator")];

我如何设置 UILabel 文本的示例:

myLabel1.text = NSLocalizedString(@"myLabel1", @"comment for the translator");

找到解决方案!

以下测试应用程序有一个函数,可以从正确的“Localized.strings”文件中读取所需的字符串(基于所选的语言):https://github.com/object2dot0/Advance-Localization-in-ios-apps https://github.com/object2dot0/Advance-Localization-in-ios-apps

-

我获取了此代码以及设置应用程序的主要语言所需的代码(在 Brayden 发布的上述答案中找到:如何强制 NSLocalizedString 使用特定语言 https://stackoverflow.com/questions/1669645/how-to-force-nslocalizedstring-to-use-a-specific-language),并将它们放在一起。

这是我的代码现在的样子(注意 - 我的 UISegmentedControl 在其视图的 viewController 中调用一个函数 [当触发 UISegmentedControl 的“值更改”方法时],然后调用父 viewController 中的toggleLanguage 函数):

    -(void)toggleLanguage:(NSString *)primaryLanguage secondaryLanguage:(NSString *)secondaryLanguage
    {
        //set app's primary language
        defaults = [NSUserDefaults standardUserDefaults];
        [defaults setObject:[NSArray arrayWithObjects:primaryLanguage,secondaryLanguage,nil] forKey:@"AppleLanguages"];
        [defaults synchronize];

        //update UILabel and UIImageViews
        [self setLanguageSpecificItems];
    }
    -(NSString *)languageSelectedStringForKey:(NSString *)key
    {
        //read primary language
        NSArray *appleLanguagesArray = [defaults objectForKey:@"AppleLanguages"];
        NSString *currentLanguage = [appleLanguagesArray objectAtIndex:0];

        //get the path to the desired lproj file
        NSString *path;
        if(currentLanguage==@"en")
        {
            path = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
        }
        else
        if(currentLanguage==@"fr")
        {
            path = [[NSBundle mainBundle] pathForResource:@"fr" ofType:@"lproj"];
        }
        NSBundle* languageBundle = [NSBundle bundleWithPath:path];

        //find and return the desired string
        NSString* str=[languageBundle localizedStringForKey:key value:@"" table:nil];
        return str;
    }
    -(void)setLanguageSpecificItems
    {
        myUIImageView1.image = [UIImage imageNamed:[self languageSelectedStringForKey:@"myUIImageView1"]];
        myLabel1.text = [self languageSelectedStringForKey:@"myLabel1"];
    }

-

谢谢大家的帮助!!!

——克里斯·阿林森

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPad 应用程序 - 以编程方式更改语言 的相关文章

随机推荐

  • sqlite删除行数

    我需要编写一个 SQLite 查询 该查询将从表中删除 200 以上的行 我认为这会起作用 DELETE FROM tbl names WHERE count gt 200 但这给了我 滥用聚合函数 count 我知道我可以使用一个限制条款
  • 在 postgres 中打印运行时消息

    我们可以使用RAISE NOTICE在 postgres 中相当于RAISERROR 要显示的消息 WITH NOWAIT在 SQL Server 中 或者是否有更好的方法在 postgres 查询运行时打印中间消息 请建议是否有更好的方法
  • lxc 驱动程序不支持 Exec:如何解决这个问题?

    在 CoreOS 上使用 Docker 我有一个脚本调用 docker exec 这在 CoreOS 上工作得很好 但我也想在上面测试一下CircleCI http circleci com 当我尝试在 CircleCI 上运行该脚本时 我
  • java中mongo数据库中所有集合的列表

    如何获取数据库中所有集合的列表 数据库 mongodb 语言 java ide 日食 获取集合列表 每个数据库都有零个或多个集合 您可以从数据库中检索它们的列表 并打印出其中的任何内容 Set
  • 用于散列资产和资源文件夹的文件名的 Angular 构建过程

    我有一个角度 4 4 6应用程序 我使用构建它角度 CLI 1 0 1 我遇到的问题是 除了inline bundle js main bundle polyfills bundle js styles bundle js vendor b
  • x86子指令操作码混淆[重复]

    这个问题在这里已经有答案了 玩了一下 Turbo Assembler 和 Turbo Debugger 我对操作码感到惊讶 更准确地说 我有一些汇编的二进制文件 其中 Turbo Debugger 反汇编了单词 29 C3 正确地sub b
  • 通过构造函数传递实例还是使用静态访问它?

    最近 我一直在使用 Bukkit API 进行编码 但是我的问题与它没有直接关系 在 Bukkit API 中 可以拥有主类的单个实例 new MainClass 引发错误 所以我想知道 使用构造函数将主类传递给我的所有类是否更好 或者我应
  • 在 Python 中使用 Chromedriver 启用 Flash

    尝试使用 python 在 chromedriver 中启用 Adob e Flash Player 我进行了多次尝试 包括 prefs plugins plugins enabled Adobe Flash Player prefs pl
  • 如何像 Windows 10 气球提示一样显示气球提示而不拉伸图标

    我有 WPF 桌面应用程序 它使用以下方式推送一些通知 NotifyIcon ShowBalloonTip ToolTipIcon None 问题是 Windows 10 使用新的 带有图像和文本的 Windows 10 矩形 样式进行气球
  • 在 Google 地图对象上添加 3D 图层

    我想添加一个 3D 图层 在 Google 地图上显示云位置和海拔 这个想法是 当您倾斜地图 在地球模式下按住 Ctrl 键并拖动 时 您可以看到每朵云的高度 我发现这篇文章解释了如何添加 3D 建筑物 但它是 假的 欺骗纬度以获得一些高度
  • 解析数百万个小 XML 文件

    我有 1000 万个小 XML 文件 300KB 500KB 我在 Mapreduce 中使用 Mahaout 的 XML 输入格式来读取数据 并使用 SAX 解析器进行解析 但处理速度非常慢 使用输入文件的压缩 lzo 有助于提高性能吗
  • 为 Magento 属性创建新选项

    我在尝试在 管理选项 选项卡中创建新选项时遇到问题 当您创建属性时 我知道如何将数据正确保存在数据库中 我正在更换Mage Adminhtml Block Catalog Product Attribute Edit Tab Options
  • Reflect.getOwnMetadata 不是具有 karma-typescript 的函数

    我正在尝试进行单元测试 使用 Karma Jasmine 业力打字稿 https www npmjs com package karma typescript 我的 TypeScript 项目 项目结构如下 root src ts all
  • Lucene 与 PHP

    我可以将 Lucene 与 PHP 一起使用吗 我不想使用 Zend 我可以在本机 PHP 非框架 中使用吗 我建议使用阿帕奇SOLR http lucene apache org solr 作为您的 Lucene 后端 并通过 PHP 代
  • 如何使用 Java 8 DateTimeFormatter 更改解析两个字母年份的基准日期?

    如果我使用类似的模式d M yy用于创建 Java 8 DateTimeFormatter 例如使用DateTimeFormatter ofPattern pattern 我只会用于解析 而不是格式化 它将所有两个字母的年份解释为 20xx
  • 具有列表项选择样式的 LongListSelector

    我正在使用 Windows Phone 8 并且我有长列表选择器 其中几乎没有项目 我使用下面的代码来突出显示列表框中所选的项目 但我希望 LongListSelector 能够达到相同的效果 怎么做
  • 在确保翻译单元之间的可用性时是否不推荐使用静态?

    从以下堆栈溢出答案 https stackoverflow com a 3416755 908939 用户说 这意味着该变量是翻译单元的本地变量 简单地说 到单个源文件 并且无法从外部访问 这 事实上 当前的 C 标准不推荐使用 stati
  • OSError: [Errno 12] 使用 python 多处理池时无法分配内存

    我正在尝试使用 Python 将函数并行应用于 5 个交叉验证集multiprocessing并对不同的参数值重复此操作 如下所示 import pandas as pd import numpy as np import multipro
  • 在 CalenderView 中仅显示单个月份,并在其他月份之间进行导航

    这是这个问题的后续问题 安卓 CalendarView 一次仅显示一个月的日历 https stackoverflow com questions 33810905 android calendarview show only one mo
  • iPad 应用程序 - 以编程方式更改语言

    我有一个需要两种语言的应用程序 英语和法语 我已经在各自的 en lproj 和 fr lproj 文件夹中设置了 Localized strings 文件 当我更改 iPad 的语言 在本机设置应用程序中 然后启动我的应用程序时 它确实如