菜鸟教程小白 发表于 2022-12-13 11:42:30

ios - 使用相同的本地化按钮切换语言应用程序


                                            <p><p>我正在开发具有两种语言的 iOS 应用程序。
我为每种语言本地化了主 Storyboard,现在我尝试使用相同的按钮(切换按钮文本)在语言之间切换。</p>

<p>我发现了许多代码可以用按钮更改应用程序语言,例如
<a href="https://stackoverflow.com/questions/29872222/ios-change-language-for-user-via-buttons" rel="noreferrer noopener nofollow">this</a>和 <a href="https://stackoverflow.com/questions/16032207/how-to-change-application-language-on-run-time-using-two-button-in-iphone-sdk" rel="noreferrer noopener nofollow">Advance-Localization-in-ios-apps</a>但我不知道如何根据按钮中选择的语言重新加载带有 .strings 的 Storyboard 。
请问有什么帮助吗?谢谢</p>

<p> <a href="/image/XFcBd.png" rel="noreferrer noopener nofollow"><img src="/image/XFcBd.png" alt="localized Main.storyboard"/></a>
<a href="/image/YzjfD.png" rel="noreferrer noopener nofollow"><img src="/image/YzjfD.png" alt="English strings file"/></a> </p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>恐怕你不能使用 <code>Main.strings</code> 文件。您最终会将 Storyboard 中的所有可本地化文本移动到 <code>Localizable.strings</code> 并使用诸如 <code>NSLocalizedString(key, comment)</code> 之类的方法从那里加载它们。</p>

<p>这里是 <a href="https://github.com/dobaduc/SO-32606991" rel="noreferrer noopener nofollow">Working sample project</a>在 GitHub 上。如下图所示:</p>

<p> <a href="/image/B8rLi.gif" rel="noreferrer noopener nofollow"><img src="/image/B8rLi.gif" alt="enter image description here"/></a> </p>

<p>演示 ViewController 的完整代码</p>

<pre><code>#import &#34;ViewController.h&#34;

//--------------- Modify NSBunle behavior -------------
#import &lt;objc/runtime.h&gt;

@interface CustomizedBundle : NSBundle
@end

@implementation CustomizedBundle
static const char kAssociatedLanguageBundle = 0;

-(NSString*)localizedStringForKey:(NSString *)key
                            value:(NSString *)value
                            table:(NSString *)tableName {

    NSBundle* bundle=objc_getAssociatedObject(self, &amp;kAssociatedLanguageBundle);

    return bundle ? :
    ;
}
@end

@implementation NSBundle (Custom)
+ (void)setLanguage:(NSString*)language {
    static dispatch_once_t onceToken;
    dispatch_once(&amp;onceToken, ^{
      object_setClass(, );
    });

    objc_setAssociatedObject(, &amp;kAssociatedLanguageBundle, language ?
                            pathForResource:language ofType:@&#34;lproj&#34;]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

//--------------- Demo ---------------------------------
@interface ViewController ()
@property (weak, nonatomic) IBOutlet UILabel *label;
@property (weak, nonatomic) IBOutlet UIButton *button;

@property (nonatomic, assign) BOOL usingArabic;
@end

@implementation ViewController

- (void)viewDidLoad {
    ;

    ;
}

- (void)localizeTexts {
    self.label.text = NSLocalizedString(@&#34;explanation_message&#34;, nil);
    ;
}


- (IBAction)switchLanguageTouched:(id)sender {
    _usingArabic = !_usingArabic;
    NSString *targetLang = _usingArabic ? @&#34;ar&#34; : @&#34;en&#34;;

    ;

    [ setObject:targetLang forKey:@&#34;selectedLanguage&#34;];
    [ synchronize];

    ;

    ;
}

@end
</code></pre>

<p>您的 Localizable 文件将如下所示:</p>

<p> <a href="/image/T2mnS.png" rel="noreferrer noopener nofollow"><img src="/image/T2mnS.png" alt="enter image description here"/></a> </p>

<p>希望这会有所帮助。
编码愉快!</p>

<p><strong>编辑</strong>:
如果不调用上面示例中的“localizeTexts”之类的方法来“刷新”正在显示的文本值,就不可能反射(reflect)当前选择的语言。该对象在内存中,因此您必须重新创建或更新其值。</p></p>
                                   
                                                <p style="font-size: 20px;">关于ios - 使用相同的本地化按钮切换语言应用程序,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/32606991/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/32606991/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: ios - 使用相同的本地化按钮切换语言应用程序