কীভাবে এনএসএলোক্যালাইজড স্ট্রিংকে একটি নির্দিষ্ট ভাষা ব্যবহার করতে বাধ্য করা যায়


263

অন ​​আইফোন আইফোনের NSLocalizedStringভাষায় স্ট্রিংটি ফিরিয়ে দেয়। NSLocalizedStringডিভাইসের চেয়ে আলাদা ভাষায় অ্যাপ্লিকেশন রাখতে কোনও নির্দিষ্ট ভাষা প্রয়োগ করার জন্য জোর করা কি সম্ভব ?


দয়া করে এটি উল্লেখ করুন: স্ট্যাকওভারফ্লো.com/ a / 48187049 / 6665075 একটি কবজির মতো কাজ করে
অঙ্কিত কুমার গুপ্ত

উত্তর:


261

NSLocalizedString()(এবং এর রূপগুলি) NSUserDefaultsপছন্দের ভাষার জন্য ব্যবহারকারীর সেটিংস কী তা নির্ধারণ করতে "অ্যাপল্যাঙ্গোয়েজস" কী অ্যাক্সেস করে । এটি ভাষার কোডগুলির একটি অ্যারে প্রদান করে, যার মধ্যে প্রথমটি তাদের ফোনের জন্য ব্যবহারকারীর দ্বারা সেট করা হয় এবং পরবর্তী সংস্করণ যদি পছন্দের ভাষায় কোনও সংস্থান না পাওয়া যায় তবে ফলব্যাক হিসাবে ব্যবহৃত হয়। (ডেস্কটপে, ব্যবহারকারী সিস্টেম পছন্দগুলিতে কাস্টম অর্ডার সহ একাধিক ভাষা নির্দিষ্ট করতে পারে)

আপনি যদি নিজের ভাষা তালিকাটি সেট করার জন্য সেটঅবজেক্ট: ফোরকি: পদ্ধতি ব্যবহার করে আপনার নিজের অ্যাপ্লিকেশনটির জন্য গ্লোবাল সেটিংটি ওভাররাইড করতে পারেন। এটি বিশ্বব্যাপী নির্ধারিত মানের চেয়ে অগ্রাধিকার গ্রহণ করবে এবং স্থানীয়করণ সম্পাদন করছে এমন আপনার অ্যাপ্লিকেশনটিতে যে কোনও কোডে ফিরে আসবে। এর জন্য কোডটি দেখতে এমন কিছু দেখাচ্ছে:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate

এটি আপনার অ্যাপ্লিকেশনের জন্য জার্মানকে পছন্দের ভাষা করে ফেলবে, ইংরাজী এবং ফরাসিকে ফ্যালব্যাক হিসাবে with আপনি আপনার অ্যাপ্লিকেশন শুরু হওয়ার আগেই এই কল করতে চান। আপনি ভাষা / স্থানীয় পছন্দগুলি সম্পর্কে এখানে আরও পড়তে পারেন: আন্তর্জাতিকীকরণ প্রোগ্রামিংয়ের বিষয়গুলি: বর্তমান ভাষা এবং স্থানীয় অবস্থান প্রাপ্ত


4
এটি আমার পক্ষে কাজ করে না, এটি যাই হোক না কেন এটি ডিফল্ট ভাষা ব্যবহার করবে।
কোয়ানো

50
Denniss; অ্যাপটি চালু হওয়ার আগে আপনি যদি ভাষা পছন্দটি সেট করেন তবে এটি আরও ভাল কাজ করছে বলে মনে হচ্ছে । ইউআইএপ্লিকেশনমেন () কল করার আগে আমি এটি মূল () ফাংশনে করি। এটি একবার চলার পরে, এটি ব্যবহৃত ভাষা পরিবর্তন করবে না, তবে কেবল পরবর্তী সময়ের জন্য পছন্দটি সেট করবে।
জিওন

3
ইউআইকিট শুরু করার আগে আপনাকে ভাষাটি সেট করতে হবে এবং আপনাকে অবশ্যই একটি সম্পূর্ণ ভাষা + অঞ্চল লোকাল নির্দিষ্ট করতে হবে - একটি সম্পূর্ণ উদাহরণের জন্য এটি পরীক্ষা করে দেখুন blog.federicomestrone.com/2010/09/15/…
ফেডমিস্ট

18
অ্যাপলল্যাঙ্গেজগুলি সেট করার ফলে রানটাইমে কোনও ভাষা পরিবর্তিত হবে যদি মূল () - এ করা হয়! তবে ... অ্যাপ্লিকেশনটি ইনস্টল হওয়ার পরে প্রথম বার, ইউআইএপ্লিকেশনমেন () নামে পরিচিত হওয়ার পরে nsuserdeafults শুরু করা হয়, যা পূর্ববর্তী সেট আপেলল্যাঙ্গেজগুলিকে উপেক্ষা করবে এবং পছন্দসই ভাষাটি দেখার জন্য অ্যাপটির একটি কুৎসিত বল-পুনঃসূচনা প্রয়োজন হবে require
জনপায়েন

3
এটি লোকালাইজেবল.স্ট্রিংসডিক্টে সংজ্ঞায়িত বহুবচন আইটেমগুলির সাথে কাজ করে না। কোনও সম্ভাবনা আছে যদি কোন ধারণা?
মিহাই ফ্রেতু

147

আমার সম্প্রতি একই সমস্যা হয়েছিল এবং আমি আমার সম্পূর্ণ এনএসলোক্যালাইজড স্ট্রিং শুরু করতে এবং প্যাচ করতে চাই না বা অ্যাপ্লিকেশনটিকে নতুন ভাষার কাজ করার জন্য পুনরায় চালু করতে বাধ্য করব না। আমি চাই সমস্ত কিছু যেমন হয় তেমন কাজ করা।

আমার সমাধানটি ছিল মূল বান্ডিলের শ্রেণিটি গতিময়ভাবে পরিবর্তন করা এবং সেখানে উপযুক্ত বান্ডিলটি লোড করা:

শিরোনাম ফাইল

@interface NSBundle (Language)
+(void)setLanguage:(NSString*)language;
@end

বাস্তবায়ন

#import <objc/runtime.h>

static const char _bundle=0;

@interface BundleEx : NSBundle
@end

@implementation BundleEx
-(NSString*)localizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    NSBundle* bundle=objc_getAssociatedObject(self, &_bundle);
    return bundle ? [bundle localizedStringForKey:key value:value table:tableName] : [super localizedStringForKey:key value:value table:tableName];
}
@end

@implementation NSBundle (Language)
+(void)setLanguage:(NSString*)language
{
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^
    {
        object_setClass([NSBundle mainBundle],[BundleEx class]);
    });
    objc_setAssociatedObject([NSBundle mainBundle], &_bundle, language ? [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]] : nil, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
@end

সুতরাং মূলত, যখন আপনার অ্যাপ্লিকেশন শুরু হয় এবং আপনি আপনার প্রথম নিয়ামকটি লোড করার আগে, কেবল কল করুন:

[NSBundle setLanguage:@"en"];

আপনার ব্যবহারকারী যখন আপনার সেটিং স্ক্রিনে তার পছন্দের ভাষা পরিবর্তন করেন, কেবল এটিকে আবার কল করুন:

[NSBundle setLanguage:@"fr"];

সিস্টেম ডিফল্টগুলিতে পুনরায় সেট করতে, কেবল শূন্যস্থানটি পাস করুন:

[NSBundle setLanguage:nil];

উপভোগ করুন ...

যাদের একটি সুইফ্ট সংস্করণ প্রয়োজন:

var bundleKey: UInt8 = 0

class AnyLanguageBundle: Bundle {

    override func localizedString(forKey key: String,
                                  value: String?,
                                  table tableName: String?) -> String {

        guard let path = objc_getAssociatedObject(self, &bundleKey) as? String,
              let bundle = Bundle(path: path) else {

            return super.localizedString(forKey: key, value: value, table: tableName)
            }

        return bundle.localizedString(forKey: key, value: value, table: tableName)
    }
}

extension Bundle {

    class func setLanguage(_ language: String) {

        defer {

            object_setClass(Bundle.main, AnyLanguageBundle.self)
        }

        objc_setAssociatedObject(Bundle.main, &bundleKey,    Bundle.main.path(forResource: language, ofType: "lproj"), .OBJC_ASSOCIATION_RETAIN_NONATOMIC)
    }
}

7
হাই @ ওয়ার্সিং, এটি এখন পর্যন্ত আমার পক্ষে দুর্দান্ত কাজ করে। এমনকি আমি দোকানে একটি অ্যাপ্লিকেশন আপলোড করেছি এবং অ্যাপলের কোনও অভিযোগ নেই।
গিলাদ নভিক

7
এটি একটি দুর্দান্ত সমাধান, আমি এখানেও এটি উল্লেখ করছি: मध्यम.com
জেমস টাং

1
হাই @ জামেসটাং, রেফারেন্স এবং আপনার পোস্টের জন্য ধন্যবাদ - আমি স্থানীয়করণ সম্পর্কিত সেখানে প্রচুর দরকারী তথ্য পেয়েছি।
গিলাদ নভিক '

3
@ গিলাড আপনার পদ্ধতিটি গতিশীল স্ট্রিংগুলির জন্য নিখুঁত কাজ করে (স্ট্রিংগুলি যা আমি স্থানীয়করণযোগ্য। স্ট্রিংগুলিতে সংজ্ঞায়িত করেছি) তবে স্টোরিবোর্ড বোতাম এবং লেবেলগুলি কেবলমাত্র মূল পদ্ধতিতে কাজ করে। সুতরাং আপনি ইউআই নিয়ন্ত্রণ স্থানীয়করণ অন্তর্ভুক্ত আপনার উত্তর প্রসারিত করতে পারেন? মানে আমি কীভাবে স্টোরিবোর্ডটি রিফ্রেশ করব (বন্ধ না করে) আমি [এনএসবান্ডেল সেটল্যাঙ্গুয়েজ: @ "??"] ;?
জাওয়াদ আল শায়খ

2
এক্সআইবি / স্টোরিবোর্ডের জন্য: ভিউটি লোড করার আগে আপনাকে অবশ্যই এই পদ্ধতিটি কল করার বিষয়টি নিশ্চিত করতে হবে। যতদূর পর্যন্ত লাইভ আপডেট করা হয়েছে: আমার ক্ষেত্রে আমি ভিউ কন্ট্রোলারটিকে কেবল পুনরায় লোড করেছি (আমি এটিকে একটি নেভিগেশন কন্ট্রোলারে রেখেছি এবং কেবলমাত্র নিয়ামককে প্রতিস্থাপন করেছি it এটি পুনরায় লোড করার পরে - এটি নতুন অনুবাদকৃত স্ট্রিং পেয়েছে)। আমি এর জন্য কোকোপডে কাজ করছি, আমি সম্ভবত সেখানে একটি উদাহরণও অন্তর্ভুক্ত করব। থাকুন ...
গিলাদ নভিক

137

আমি সাধারণত এটি এইভাবে করি তবে আপনার প্রকল্পে সমস্ত স্থানীয়করণ ফাইল থাকা উচিত।

@implementation Language

static NSBundle *bundle = nil;

+(void)initialize 
{
    NSUserDefaults* defs = [NSUserDefaults standardUserDefaults];
    NSArray* languages = [defs objectForKey:@"AppleLanguages"];
    NSString *current = [[languages objectAtIndex:0] retain];
    [self setLanguage:current];
}

/*
  example calls:
    [Language setLanguage:@"it"];
    [Language setLanguage:@"de"];
*/
+(void)setLanguage:(NSString *)l
{
    NSLog(@"preferredLang: %@", l);
    NSString *path = [[ NSBundle mainBundle ] pathForResource:l ofType:@"lproj" ];
    bundle = [[NSBundle bundleWithPath:path] retain];
}

+(NSString *)get:(NSString *)key alter:(NSString *)alternate 
{
    return [bundle localizedStringForKey:key value:alternate table:nil];
}

@end

1
+1 টি। এটি সত্যিই দুর্দান্ত কৌশল যা আমি অন্য কোথাও দেখিনি। স্থানীয়করণ ফোল্ডারগুলির মধ্যে একটি থেকে একটি "সাব বান্ডেল" তৈরি করে, আপনি এনএসএলোক্যালাইজড স্ট্রিংয়ের যে কোনও কিছু এখানে ঘুরে বেড়াচ্ছেন না কেন আপনি স্ট্রিং স্টাফটি ভাল কাজ করতে পারবেন।
বেন জোটো

4
দুর্দান্ত মাওরো। আমি লক্ষ্য করেছি যে এটি আপনার প্রকল্পের বাইরে ফাইলগুলির জন্যও কাজ করতে পারে। যদি কোনও কারণে (আমার ক্ষেত্রে যেমন হয়) তবে আপনার নেটওয়ার্ক থেকে স্ট্রিং ফাইলগুলি ডাউনলোড করতে হবে এবং সেগুলি আপনার 'ডকুমেন্টস' ডিরেক্টরিতে সংরক্ষণ করতে হবে (ফোল্ডার কাঠামো নথিতে / en.lproj / লোকালাইজেবল.স্ট্রিংস, নথি / fr.lproj / স্থানীয়করণযোগ্য.স্ট্রিংস, ...)। আপনি যদিও এনএসবান্ডেল তৈরি করতে পারেন। পাথের জন্য কেবল এই কোডটি ব্যবহার করুন: এনএসএসটিং * পাথ = [এনএসহোমডাইরেক্টরি () স্ট্রিংবাই অ্যাপেন্ডিংপ্যাথ কম্পোনেন্ট: [এনএসএস স্ট্রিং উইথফোর্ম্যাট: @ "/ ডকুমেন্টস /% @ l lroj", l, নীল]];
আরনাড দেল

1
আমার কাছে মনে হচ্ছে নীচে আলেসান্দ্রোর অবদানের সাথে এটিই সেরা পন্থা। এটি এতটা অনুপ্রবেশকারী নয় এবং এটি পুনঃসূচনা করার দরকার নেই।
পিকেসিএলসফট

1
আমি কি ভুল করছি? আমি এনএসবজেক্টকে উত্তরাধিকারসূত্রে একটি ভাষা ক্লাস তৈরি করেছি, এটি বাস্তবায়নের জন্য রেখেছি, পদ্ধতিটির নামগুলি in আমার চেঞ্জ ল্যাঙ্গুয়েজ বোতামে কোড রান করে (বোতামের পদ্ধতিটি কল হয়ে যায় এবং ভাষা ক্লাসে যায়), কিন্তু কিছুই করে না। আমি আমার স্থানীয়করণযোগ্য। স্ট্রিংস (স্প্যানিশ) সেট আপ আছে। তবে মনে হয় এটি অন্যান্য অনেক লোকের জন্য কাজ করছে। দয়া করে কেউ আমার জন্য এটি নিস্তেজ করে দিন।
স্যাররুপার্টআইআইআই

1
@ কে কেন্ডল আপনি এটিকে ডাকেন: [ভাষা সেটল্যাঙ্গুয়েজ: @ "এস"]; এনএসএসটিং * স্ট্রিংটোস = [ভাষা প্রাপ্ত: @ "আপনার পাঠ্য" পরিবর্তন: শূন্য];
মিক্রস্যা

41

আইওএস ৯ এ ব্যবহার করবেন না This এটি এর মধ্য দিয়ে যাওয়া সমস্ত স্ট্রিংয়ের জন্য শূন্য করে।

আমি আরও একটি সমাধান পেয়েছি যা আপনাকে ভাষার স্ট্রিংগুলি আপডেট করতে, ডাব্লু / ও অ্যাপ্লিকেশনটি পুনরায় চালু করতে এবং জেনস্ট্রিংয়ের সাথে সামঞ্জস্য করে:

এই ম্যাক্রোটিকে প্রিফিক্স.পিচিতে রাখুন:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]

এবং যেখানে আপনার কোনও স্থানীয়ীকৃত স্ট্রিং ব্যবহারের প্রয়োজন হবে:

NSLocalizedStringFromTableInBundle(@"GalleryTitleKey", nil, currentLanguageBundle, @"")

ভাষার ব্যবহার সেট করতে:

[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];

এমনকী একটানা ভাষার সাথে কাজ করে যেমন:

NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"fr"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"it"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:@"de"] forKey:@"AppleLanguages"];
NSLog(@"test %@", NSLocalizedStringFromTableInBundle(@"NewKey", nil, currentLanguageBundle, @""));

2
@ পাওয়ারj1984: না, এটি আপনার উত্স ফাইলগুলিতে কেবল স্ট্রিংগুলিকে পরিবর্তন করবে। আপনি যদি xib ভাষা পরিবর্তন করতে চান, আপনাকে আপনার নির্বাচিত ভাষার বান্ডিল থেকে হাতে xibs পুনরায় লোড করতে হবে।
gklka

@gklka আমি টুডোজিয়ারের দেওয়া পদক্ষেপগুলি অনুসরণ করেছি কিন্তু আমার XIB এর ভাষা পরিবর্তন হচ্ছে না, আপনি যেমন XIB কে পুনরায় লোড করতে বলেছিলেন, XIB পুনরায় লোড করার আসলে কী বোঝায়?
ডিসি কুমার

: @DkKumar: আপনি কিছু এই অনুরূপ যা করতে হবে stackoverflow.com/questions/21304988/...
gklka

@gklka আপনার উত্তরটি সঠিক বলে মনে হচ্ছে এবং আপনি নিজের উত্তরের বর্ণনায় আমি একই পদক্ষেপগুলি করেছি, তবে সমস্যাটি কী তা যদি আমরা বান্ডিলের পথটি পরিবর্তন করি তবে এটি সমস্ত সংস্থান (যেমন XIB তে ব্যবহৃত .png ফাইল) খুঁজে পাবে the একই বান্ডিল, সুতরাং আমাদের en.lproj, es.lproj এবং এর মতো সমস্ত বান্ডলে ইমেজ ফোল্ডারটি অনুলিপি করতে হবে .. তাই আইপিএ আকার বাড়ানোর উপর প্রভাব ফেলবে, তাই এই সমস্যাটি কাটিয়ে ওঠার কোনও উপায় আছে কি? যেমনটি আপনি আপনার পোস্টে বলেছিলেন, আমাকে এটির জন্য চেষ্টা করুন এবং এর জন্য আমাকে সাহায্য করার জন্য আপনাকে ধন্যবাদ জানাতে চাই
কুমার

1
এটি আইওএস 9-এ ভয়াবহভাবে ভেঙে গেছে, সমস্ত স্ট্রিংয়ের জন্য শূন্যস্থানটি ফিরিয়েছে।
অ্যালেক্স জাভাটোন

32

যেমনটি আগে বলা হয়েছে, কেবল করুন:

[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"el", nil] forKey:@"AppleLanguages"];

তবে অ্যাপ্লিকেশনটি পুনরায় চালু করতে এড়াতে, (...) এর main.mঠিক আগে, প্রধান পদ্ধতিতে লাইনটি দিন UIApplicationMain


2
খুব সহায়ক উত্তর! পিএস অ-শুরুর দিকে স্পষ্ট মনে হতে পারে তবে আপনার সেই লাইনটি NSAutoreleasePool * pool ..sertোকানো উচিত বা কয়েকটি স্বতঃপ্রযুক্ত বস্তু ফাঁস হওয়ার পরে ।
pt2ph8

1
গুরুত্বপূর্ণ: আপনি যদি [[NSBundle mainBundle] URLForResource:withExtension:]আগে কল করেন তবে এটি কাজ করবে না ।
Kof

3
যদি সুইফট ব্যবহার করা হয় তবে কী মেইন.এম নেই?
22

আপনি কী সুইচ এবং স্টোরিবোর্ডে চেষ্টা করেছেন তা কি কাজ করছে?
iDevAmit

হাই, সার্ভার থেকে আগত ডায়নামিক পাঠ্যকে কীভাবে স্থানীয়করণ করা যায়, আমার প্রয়োগে প্রতিটি পাঠ্যকে আমি সরলিকৃত চীনা ভাষায় প্রদর্শিত করতে পারি, তবে কীভাবে ইংরেজীতে আসছে সেই চীনা ভাষায় পাঠ্যটি প্রদর্শন করব। আমাকে সাহায্য কর.
মহেশ নার্লা

31

অ্যাপ্লিকেশন থেকে নির্দিষ্ট ভাষা নির্বাচন করে নির্দিষ্ট ভাষা ব্যবহারের কৌশলটি NSLocalizedStringনির্বাচিত ভাষার উপর নির্ভর করে নির্দিষ্ট বান্ডিলটি ব্যবহার করতে বাধ্য করা ,

আইওএস অ্যাপ্লিকেশনগুলিতে এই শেখার অগ্রিম স্থানীয়করণের জন্য আমি যে পোস্টটি লিখেছি তা এখানে here

এবং এখানে আইওএস অ্যাপ্লিকেশনগুলিতে একটি নমুনা অ্যাপ্লিকেশন অগ্রিম স্থানীয়করণের কোড


এটি আইওএস on-তেও কাজ করে, ব্রায়ানের সমাধান থেকে আমাকে এটিকে স্যুইচ করতে হবে কারণ মনে হচ্ছে আইওএস আবারও ভাষাগুলির বিকল্পকে ওভাররাইড করে এইভাবে আমি ভাষার প্রথমবারের সাথে সেটিংটি আটকে রেখেছি। আপনার সমাধান একটি কবজ মত কাজ করে!
হ্যাক্স্পোর

14

আপনি সুইফট 3 এর এই সমাধান সম্পর্কে কী ভাবেন?

extension String {

    func localized(forLanguage language: String = Locale.preferredLanguages.first!.components(separatedBy: "-").first!) -> String {

        guard let path = Bundle.main.path(forResource: language == "en" ? "Base" : language, ofType: "lproj") else {

            let basePath = Bundle.main.path(forResource: "Base", ofType: "lproj")!

            return Bundle(path: basePath)!.localizedString(forKey: self, value: "", table: nil)
        }

        return Bundle(path: path)!.localizedString(forKey: self, value: "", table: nil)
    }
}

সাধারণ ব্যবহার:

"report".localized(forLanguage: "pl") //forced language
"report".localized() //default language selected by user in settings, in case when your app doesnt support selected lanaguage, the default one is selected, here is an english.

হাই, সার্ভার থেকে আগত ডায়নামিক পাঠ্যকে কীভাবে স্থানীয়করণ করা যায়, আমার প্রয়োগে প্রতিটি পাঠ্যকে আমি সরলিকৃত চীনা ভাষায় প্রদর্শিত করতে পারি, তবে কীভাবে ইংরেজীতে আসছে সেই চীনা ভাষায় পাঠ্যটি প্রদর্শন করব। আমাকে সাহায্য কর.
মহেশ নার্লা

এটি একটি উজ্জ্বল উত্তর;)
বার্তোমিয়েজ সেমাসেকিক

দুর্দান্ত উত্তর.হেল্প করেছিল আমাকে
দিলীপ তিওয়ারি

13

ব্রায়ান ওয়েবস্টার যেমন উল্লেখ করেছেন, ভাষাটি "আপনার অ্যাপ্লিকেশনটির শুরুতে কিছুটা আগে" সেট করা দরকার। আমি ভেবেছিলাম applicationDidFinishLaunching:এটি করার AppDelegateউপযুক্ত জায়গা হওয়া উচিত, যেহেতু আমি অন্য সমস্ত সূচনা এখানেই করি।

উইলিয়াম ডেনিস যেমন উল্লেখ করেছেন, অ্যাপটি পুনরায় চালু হওয়ার পরে কেবল তারই প্রভাব আছে বলে মনে হচ্ছে এটি এক ধরণের অকেজো।

আমি কোডটি মূল ফাংশনে রেখে দিলে এটি ঠিকঠাক কাজ করছে বলে মনে হচ্ছে, যদিও:

int main(int argc, char *argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    // Force language to Swedish.
    [[NSUserDefaults standardUserDefaults]
     setObject:[NSArray arrayWithObject:@"sv"]
     forKey:@"AppleLanguages"];

    int retVal = UIApplicationMain(argc, argv, nil, nil);
    [pool release];
    return retVal;
}

আমি এই সম্পর্কে কোন মন্তব্য প্রশংসা করব।


আমার বাস্তবায়নে এটি একটি ব্যবহারকারী-স্থিতিযোগ্য জিনিস - তাই আমি তাদের একটি পুনর্সূচনা প্রয়োজন বলার জন্য একটি কথোপকথন পপ করব :)
উইলিয়াম ডেনিস

এটি স্থানীয়ভাবে ডিফল্ট.পিএনজি চিত্র বাদে প্রায় সকলের জন্যই কাজ করে।
লুকাশজ

2
যদি আপনি ব্যবহারকারীদের কোনও ভাষা সেট করতে দিচ্ছেন এবং তারপরে অ্যাপটি পুনরায় চালু করতে বলছেন তবে কেবল মনে রাখবেন যে তারা খুব দ্রুত পুনরায় চালু করলে NSUserDephaults সংরক্ষণ করা যায় না। বেশিরভাগ ব্যবহারকারী এই দ্রুত নয়, তবে আপনি যখন অ্যাপটি পরীক্ষা করছেন তখন আপনি খুব দ্রুত হতে পারেন এবং ফলস্বরূপ অসঙ্গতিপূর্ণ আচরণ দেখতে পান see আমার ভাষার স্যুইচটি কখনও কখনও কাজ করে এবং কখনও কখনও না কেন তা বুঝতে কয়েক ঘন্টা সময় লেগেছিল!
আরলোমেডিয়া

3
এটি কোনও সমস্যা নয়, কেবল [[NSUserDefaults standardUserDefaults] synchronize];কল করার পরে ব্যবহার করুনsetObject:forKey:
বেন ব্যারন

11

আমি সেরা মাওরো ডেলরিওর পদ্ধতিটি পছন্দ করি। আমি আমার প্রোজেক্ট_প্রিফিক্স.পিচিতেও নিম্নলিখিতগুলি যুক্ত করেছি

#import "Language.h"    
#define MyLocalizedString(key, alt) [Language get:key alter:alt]

সুতরাং আপনি যদি কখনও স্ট্যান্ডার্ড পদ্ধতিটি (যা এনএসলোক্যালাইজড স্ট্রিং ব্যবহার করে) ব্যবহার করতে চান তবে আপনি সমস্ত ফাইলগুলিতে একটি দ্রুত সিনট্যাক্স প্রতিস্থাপন করতে পারেন।


1
আমি তার পদ্ধতিটিও পছন্দ করি এবং আমি পিএনজি চিত্রগুলি লোড করার জন্য একটি পদ্ধতি যুক্ত করি: + (ইউআইআইমেজ ) চিত্রনাম: (এনএসএসআরটিং *) চিত্রফিলনাম { এনএসএসআরটিং ফুলপ্যাথ = [বান্ডেল পথের জন্য উত্স: চিত্রফলক নাম: টাইপ: @ "পিএনজি"]; ইউআইআইএমএজ * ইমেজওবজ = [[ইউআইআইমেজ বরাদ্দ] #WithContentsOfFile: পূর্ণপথ]; ফিরুন [imageObj স্বতঃপ্রকাশ]; }
জাগি

11

NSLocalizedString()AppleLanguagesমানক ব্যবহারকারী ডিফল্ট ( [NSUserDefaults standardUserDefaults]) থেকে কীটির মান পড়বে । এটি রানটাইমের সমস্ত বিদ্যমান স্থানীয়করণের মধ্যে একটি উপযুক্ত স্থানীয়করণ চয়ন করতে সেই মানটি ব্যবহার করে। অ্যাপল অ্যাপ্লিকেশন প্রবর্তনের সময় ব্যবহারকারী ডিফল্ট অভিধান তৈরি করে, তারা সিস্টেম পছন্দগুলিতে পছন্দসই ভাষা (গুলি) কী সন্ধান করে এবং সেখান থেকে মানটি অনুলিপি করে। এটি উদাহরণস্বরূপ ব্যাখ্যা করে যে কেন ওএস এক্স-এ ভাষা সেটিংস পরিবর্তন করা অ্যাপ্লিকেশনগুলি চালানোর ক্ষেত্রে কোনও প্রভাব ফেলবে না, কেবল তার পরে শুরু হওয়া অ্যাপ্লিকেশনগুলিতে। একবার অনুলিপি করা হয়েছে, মান সেটিংস পরিবর্তিত কারণ আপডেট করা হয় না। এজন্য আইওএস সমস্ত অ্যাপ্লিকেশন পুনরায় চালু করে যদি আপনি ভাষা পরিবর্তন করেন।

তবে, ব্যবহারকারী ডিফল্ট অভিধানের সমস্ত মান কমান্ড লাইন আর্গুমেন্ট দ্বারা ওভাররাইট করা যেতে পারে। NSUserDefaultsডকুমেন্টেশন দেখুন NSArgumentDomain। এমনকি অ্যাপ্লিকেশন পছন্দগুলি (.plist) ফাইল থেকে লোড হওয়া সেই মানগুলিও এতে অন্তর্ভুক্ত রয়েছে। আপনি যদি পরীক্ষার জন্য একবারে কোনও মান পরিবর্তন করতে চান তবে এটি জেনে রাখা ভাল ।

সুতরাং আপনি যদি কেবল পরীক্ষার জন্য ভাষাটি পরিবর্তন করতে চান তবে আপনি সম্ভবত নিজের কোডটি পরিবর্তন করতে চান না (যদি আপনি পরে এই কোডটি সরিয়ে দিতে ভুলে যান ...), পরিবর্তে এক্সকোডকে একটি কমান্ড লাইন প্যারামিটার দিয়ে আপনার অ্যাপ্লিকেশনটি শুরু করতে বলুন ( যেমন স্প্যানিশ স্থানীয়করণ ব্যবহার করুন):

এখানে চিত্র বর্ণনা লিখুন

আপনার কোডটি স্পর্শ করার দরকার নেই। কেবল বিভিন্ন ভাষার জন্য বিভিন্ন স্কিম তৈরি করুন এবং আপনি স্কিমটি স্যুইচ করে একবারে এক ভাষাতে এবং একবার অন্য ভাষায় অ্যাপ্লিকেশনটি দ্রুত শুরু করতে পারেন।


এটি কেবলমাত্র প্রথমবারের জন্য কাজ করে তার পরে এটি আবার ডিভাইস প্রিফে লোড হয়। ভাষা ..
অক্স

@ অ্যাকস আমার জন্য প্রতিবার কাজ করে। আপনি সঠিক স্কিমটি শুরু করছেন কিনা তা নিশ্চিত করুন, আপনি Xcode এর মধ্যে থেকে শুরু করছেন তা নিশ্চিত করুন (রিলেঞ্চ, কাঁটাচামচ ইত্যাদি আর্গুমেন্টটি পাবেন না) এবং এটি নিশ্চিত করুন যে আপনি Optionsনতুন এক্সকোড সংস্করণ হিসাবে অ্যাপলটি প্রস্তাব দিয়েছেন যেমন.
মেকি

আপনার জবাবের জন্য ধন্যবাদ @ মেক্কি .. আমার জন্য এটি এক্সকোডে কাজ করছে না তবে আমি কোডে উল্লেখ করার সময় এটি কাজ করে .. তবে তবুও যদি আমি আমার ডিভাইসটিকে কিছু অন্যান্য পছন্দসই ভাষার সাথে সেট করে রেখেছি তবে আমার পছন্দসইটিতে লোড করার জন্য অ্যাপ্লিকেশনটি পুনরায় চালু করতে হবে যে ভাষায় আমি
অক্স

@ অ্যাক্সেস কোনও ডিভাইসে এটি ব্যবহার করার সময়, এটি কেবলমাত্র এক্সকোড থেকে সরাসরি শুরু হলে কাজ করবে, আপনি কোনও ডিভাইসে আইকনটি আলতো চাপ দিয়ে আবার অ্যাপ্লিকেশনটি চালু করার পরে এটি কাজ করবে না এবং অ্যাপ্লিকেশনটি মারা গেলে এটিও কাজ করবে না (উদাঃ) কারণ এটি ব্যাকগ্রাউন্ডে চলে গেছে) এবং সিস্টেম দ্বারা পুনরায় চালু হয় (যেহেতু এটি পুনরায় আরম্ভ করা Xcode দ্বারা করা পুনরায় আরম্ভ নয়) - সুতরাং আইওএস-এর মধ্যে আপনার অ্যাপ্লিকেশনটিকে মেরে ফেললে কোনও ভিন্ন অ্যাপ্লিকেশন এবং পিছনে কাজ করা চলতে পারে না (যেমন কারণ এটি স্মৃতি দরকার)।
মক্কি 3'17

10

আমি এমন একটি সমাধান নিয়ে এসেছি যা আপনাকে ব্যবহার করতে দেয় NSLocalizedString। আমি NSBundleকলের একটি বিভাগ তৈরি করি NSBundle+RunTimeLanguage। ইন্টারফেসটি এরকম।

// NSBundle+RunTimeLanguage.h
#import <Foundation/Foundation.h>
@interface NSBundle (RunTimeLanguage)
#define NSLocalizedString(key, comment) [[NSBundle mainBundle] runTimeLocalizedStringForKey:(key) value:@"" table:nil]
- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName;
@end

বাস্তবায়নটি এরকম।

// NSBundle+RunTimeLanguage.m
#import "NSBundle+RunTimeLanguage.h"
#import "AppDelegate.h"

@implementation NSBundle (RunTimeLanguage)

- (NSString *)runTimeLocalizedStringForKey:(NSString *)key value:(NSString *)value table:(NSString *)tableName
{
    AppDelegate *appDelegate = (AppDelegate *)[UIApplication sharedApplication].delegate;
    NSString *path= [[NSBundle mainBundle] pathForResource:[appDelegate languageCode] ofType:@"lproj"];
    NSBundle *languageBundle = [NSBundle bundleWithPath:path];
    NSString *localizedString=[languageBundle localizedStringForKey:key value:key table:nil];
    return localizedString;
}
@end

NSBundle+RunTimeLanguage.hযে ফাইলগুলি ব্যবহার করে সেগুলিতে কেবল আমদানি যুক্ত না করে NSLocalizedString

আপনি দেখতে পাচ্ছেন যে আমি আমার ল্যাঙ্গুয়েজ কোড একটি সংস্থায় সঞ্চয় করি AppDelegate। এটি আপনি যে কোনও জায়গায় সংরক্ষণ করতে পারেন।

আমি কেবল এটিই পছন্দ করি না এটি একটি সতর্কতা যা NSLocalizedStringমার্কো পুনরায় সংজ্ঞায়িত হয়েছে। সম্ভবত কেউ এই অংশটি ঠিক করতে আমাকে সহায়তা করতে পারে।


1
সতর্কতাটি অক্ষম করার #undef NSLocalizedStringঠিক আগে যুক্ত করুন#define
বেরিলিয়াম

এটি xib ফাইলের জন্য স্থানীয়করণে কাজ করে? নির্দিষ্ট ভাষায় ইউআই নামগুলি অনুবাদ করতে আমার কাছে .xib ফাইল এবং .স্ট্রিংস রয়েছে। আমি চেষ্টা করেছিলাম এবং এটি একাদশের সাথে কাজ করে না তবে আমি সঠিকভাবে কাজগুলি করেছি কিনা তা নিশ্চিত নই
কং হাঙ্গরাকুল

বিলম্বিত প্রতিক্রিয়ার জন্য কং দুঃখিত। আপনি যেখানে এনএসলোক্যালাইজড স্ট্রিং ব্যবহার করেন সেখানে এটি কাজ করে। সুতরাং এটি কোনও এক্সআইবিতে সরাসরি কাজ করবে না। XIB- র স্ট্রিংগুলিতে আপনার আইবিউটলেটগুলির প্রয়োজন হবে এবং তারপরে কোডিংয়ে স্ট্রিংয়ের মানগুলি প্রোগ্রামিয়ালি সেট করতে হবে।
qman64

এই পদ্ধতিটি আমার পক্ষে কাজ করেছিল এবং আমি অন ফ্লাইটে ভাষা পরিবর্তন করতে সক্ষম হয়েছি। নোট করুন যে "এস", ফ্রি "এবং" এন "এর মতো ভাষার কোডগুলি ভাল কাজ করেছে But তবে" জেডএইচ "(সরলীকৃত চাইনিজদের জন্য) ব্যর্থ হয়েছে এবং আমাকে নকল স্ট্রিংগুলি ফিরিয়ে দিয়েছে I" এস.এল.প্রোজ "এর জন্য আমি আমার সিস্টেমে একটি বিশ্বব্যাপী অনুসন্ধান করেছি to দেখতে যেখানে ফাইল আমি অ্যাক্সেস ছিল এবং আমি আবিষ্কৃত সেখানে যে "zh.lproj" আসলে "চীনা ভাষায়-Hans.lproj" হয়।
Gallymon

9

সুইফ্ট সংস্করণ:

NSUserDefaults.standardUserDefaults().setObject(["fr"], forKey: "AppleLanguages")
NSUserDefaults.standardUserDefaults().synchronize()

8

সংক্ষেপে :

আপনার অ্যাপ্লিকেশন স্থানীয়করণ

আপনাকে প্রথমে যা করতে হবে তা হ'ল আপনার অ্যাপ্লিকেশনটিকে কমপক্ষে দুটি ভাষা (ইংরেজি এবং ফরাসী উদাহরণের মধ্যে) দিয়ে স্থানীয়করণ করা।

এনএসলোক্যালাইজড স্ট্রিংকে ওভাররাইড করুন

আপনার কোডে, ব্যবহারের পরিবর্তে, NSLocalizedString(key, comment)ম্যাক্রোটি এর MYLocalizedString(key, comment)মতো সংজ্ঞায়িত করুন: #define MYLocalizedString(key, comment) [[MYLocalizationSystem sharedInstance] localizedStringForKey:(key) value:(comment)];

এই MYLocalizationSystemসিঙ্গলটন করবে:

  • সঠিক স্থানীয়ায়িত এনএসবান্ডেল ব্যবহারকারী জিজ্ঞাসা করে সেট করে ল্যাঙ্গেজ সেট করুন
  • পূর্ববর্তী সেট ভাষা অনুসারে স্থানীয় এনএসএসআর্টিং ফেরত দেয়

ব্যবহারকারীর ভাষা সেট করুন

যখন ব্যবহারকারী ফরাসি ভাষায় অ্যাপ্লিকেশন ভাষা পরিবর্তন করেন, কল করুন [[MYLocalizationSystem sharedInstance] setLanguage:@"fr"];

- (void)setLanguage:(NSString *)lang
{
    NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj"];
    if (!path)
    {
        _bundle = [NSBundle mainBundle];
        NSLog(@"Warning: No lproj for %@, system default set instead !", lang);
        return;
    }

    _bundle = [NSBundle bundleWithPath:path];
}

এই উদাহরণে এই পদ্ধতিটি fr.lproj এ স্থানীয়ীকৃত বান্ডিল সেট করে

স্থানীয়করণের স্ট্রিংটি ফিরুন

একবার আপনি স্থানীয়ায়িত বান্ডিলটি সেট করে নিলে আপনি এই পদ্ধতিতে তার কাছ থেকে সঠিক স্থানীয়করণের স্ট্রিংটি পেতে সক্ষম হবেন:

- (NSString *)localizedStringForKey:(NSString *)key value:(NSString *)value
{
    // bundle was initialized with [NSBundle mainBundle] as default and modified in setLanguage method
    return [self.bundle localizedStringForKey:key value:value table:nil];
}

আশা করি এটা তোমাকে সাহায্য করবে।

আপনি এই নিবন্ধে আরও বিবরণ পাবেন এনএসওয়িনিয়ার.ওয়ালি থেকে


আমরা আপনাকে কেবল আপনার উত্তরের কোনও সমাধানের সাথে লিঙ্ক না দেওয়ার জন্য জিজ্ঞাসা করি; লিঙ্কটি কোনও দিন কাজ করা বন্ধ করে দিতে পারে। আপনার উত্তর থেকে আপনাকে লিঙ্কটি সরাতে হবে না, আমরা আপনাকে অনুরোধ নিবন্ধের সম্পর্কিত বিভাগের সংক্ষিপ্তসার অন্তর্ভুক্ত করার জন্য আপনার উত্তরটি সম্পাদনা করতে বলব।
আপত্তিজনক সেজে

7

সুইফট 3 এক্সটেনশন:

extension Locale {
    static var preferredLanguage: String {
        get {
            return self.preferredLanguages.first ?? "en"
        }
        set {
            UserDefaults.standard.set([newValue], forKey: "AppleLanguages")
            UserDefaults.standard.synchronize()
        }
    }
}

extension String {
    var localized: String {

    var result: String

    let languageCode = Locale.preferredLanguage //en-US

    var path = Bundle.main.path(forResource: languageCode, ofType: "lproj")

    if path == nil, let hyphenRange = languageCode.range(of: "-") {
        let languageCodeShort = languageCode.substring(to: hyphenRange.lowerBound) // en
        path = Bundle.main.path(forResource: languageCodeShort, ofType: "lproj")
    }

    if let path = path, let locBundle = Bundle(path: path) {
        result = locBundle.localizedString(forKey: self, value: nil, table: nil)
    } else {
        result = NSLocalizedString(self, comment: "")
    }
        return result
    }
}

ব্যবহার:

Locale.preferredLanguage = "uk"

label.text = "localizedKey".localized

ধন্যবাদ। ভালই কাজ করছে.
ক্রুনাল নাগবাদিয়া

5

ফাইল .pch এ সংজ্ঞায়িত করতে:

#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]


#define NSLocalizedString(str,nil) NSLocalizedStringFromTableInBundle(str, nil, currentLanguageBundle, @"")

আমি কীভাবে সতর্কতা 'ওভারভারাইড ...' থেকে মুক্তি পাব?
ইদান মোশে

1
সহজ সমাধান আমার প্রয়োজনীয় সমস্ত কাজ করে। এটি আমার সমস্যা সমাধানের জন্য গাইড হিসাবে ব্যবহার করতে সক্ষম হয়েছিল। যদি প্যাথফোর্ডসোর্স যদি শূন্য করে দেয় কারণ আমার কাছে স্থানীয়করণের ফাইল নেই তবে আমি পথ ফোর্সেসোর্স: @ "বেস" ব্যবহার করি কারণ আমি অন্য কোনও কিছুই বেস লোকাইজেশন থেকে স্ট্রিং টানতে চেষ্টা করে নি। ধন্যবাদ.
জিআরডাব্লু

এটি হ্যাকি (অন্য সমস্ত উত্তরগুলিও তাই), এবং আমি লিখছি ইউনিট পরীক্ষায় এটি প্রয়োগ করা সবচেয়ে সহজ ছিল।
সর্বোচ্চ

4

হতে পারে আপনার এটির সাথে পরিপূরণ করা উচিত (# ইম্পোর্টের পরে .pch ফাইলটিতে):

extern NSBundle* bundle; // Declared on Language.m

#ifdef NSLocalizedString
    #undef NSLocalizedString
    // Delete this line to avoid warning
    #warning "Undefining NSLocalizedString"
#endif

#define NSLocalizedString(key, comment) \
    [bundle localizedStringForKey:(key) value:@"" table:nil]

/ ইউজারস / পেয়াং / ডেস্কটপ / মাইশাইনসভেন / মাইশাইন / ভিউ কন্ট্রোলার / ওরিয়েন্টেশন রিডিপেজ ভিউ.ম ১৯:৩৩:৩৩: অঘোষিত শনাক্তকারী 'বান্ডিল' ব্যবহার করুন
পেঙ্গওয়ং

4

সুইফট 3 সমাধান:

let languages = ["bs", "zh-Hant", "en", "fi", "ko", "lv", "ms", "pl", "pt-BR", "ru", "sr-Latn", "sk", "es", "tr"]
UserDefaults.standard.set([languages[0]], forKey: "AppleLanguages")

ভাষা কোডগুলির কয়েকটি উদাহরণ দেওয়া যেতে পারে যা ব্যবহার করা যায়। আশাকরি এটা সাহায্য করবে


3

আপনি এটি করতে চান এমন স্থানীয় স্ট্রিংগুলির সেট সহ একটি উপ-বান্ডিল তৈরি করতে পারেন এবং NSLocalizedStringFromTableInBundle()সেগুলি লোড করার জন্য ব্যবহার করতে পারেন । (আমি ধরে নিচ্ছি যে এটি আপনি যে অ্যাপ্লিকেশনটিতে করছেন সম্ভবত সাধারণ UI স্থানীয়করণ থেকে পৃথক সামগ্রী।


3

আমার ক্ষেত্রে আমার দুটি স্থানীয় ফাইল আছে, জা এবং এন

সিস্টেমে পছন্দসই ভাষা যদি en বা ja না হয় তবে আমি এটি জোর করে চাপিয়ে দিতে চাই

আমি main.m ফাইল সম্পাদনা করতে যাচ্ছি

আমি যাচাই করবো যে প্রথম পছন্দটি en বা ja, যদি না হয় তবে আমি দ্বিতীয় পছন্দ ভাষাটি en এ পরিবর্তন করব।

int main(int argc, char *argv[])
{

    [[NSUserDefaults standardUserDefaults] removeObjectForKey:@"AppleLanguages"];
    [[NSUserDefaults standardUserDefaults] synchronize];

    NSString *lang = [[NSLocale preferredLanguages] objectAtIndex:0];

    if (![lang isEqualToString:@"en"]  &&  ![lang isEqualToString:@"ja"]){

        NSMutableArray *array = [[NSMutableArray alloc] initWithArray:[NSLocale preferredLanguages]];
        [array replaceObjectAtIndex:1 withObject:@"en"];

        [[NSUserDefaults standardUserDefaults] setObject:array forKey:@"AppleLanguages"];
        [[NSUserDefaults standardUserDefaults] synchronize];


    }

    @autoreleasepool {
        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));


    }


}

ধন্যবাদ @ চিংস 228 এটি আমার পক্ষে উপযোগী তবে এটি প্রতিটি ভাষার জন্য আমার কাছে আলাদা আলাদা স্প্ল্যাশ রয়েছে এমন অ্যাপ্লিকেশনটির জন্য ডিফল্ট লঞ্চ চিত্র (স্প্ল্যাশ) পরিবর্তন করবে না। আপনি কি জানেন এর জন্য কীভাবে আবেদন করবেন ??
JERC

আমি মনে করি মূল প্রোগ্রামটি চালুর আগে স্প্ল্যাশ চলেছে, সুতরাং আমি কীভাবে এটি ওভাররাইড করতে জানি না, প্লাস্ট সাহায্য করতে পারে তবে এটি পরবর্তী সময় অ্যাপ্লিকেশনটি খোলার জন্য কাজ করতে পারে
চিংস 228

2

আপনি এর মতো কিছু করতে পারেন:

NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"es"];


NSBundle *spanishBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];

NSLocalizedStringFromTableInBundle(@"House", nil, spanishBundle, nil):

2

অ্যাপ্লিকেশন না রেখে বা পুনরায় আরম্ভ না করেই ভাষা পরিবর্তন করার জন্য টিউডোরাইজারের উত্তরের ভিত্তিতে ।

কোনও ম্যাক্রোর পরিবর্তে, কোনও নির্দিষ্ট ভাষার কোড উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে পছন্দের ভাষায় অ্যাক্সেসের জন্য একটি ক্লাস ব্যবহার করুন।

আইওএস 9 এর জন্য কাজ করা বর্তমান ভাষার বান্ডিলটি পেতে নীচে একটি শ্রেণি ব্যবহার করা হয়েছে:

@implementation OSLocalization

+ (NSBundle *)currentLanguageBundle
{
    // Default language incase an unsupported language is found
    NSString *language = @"en";

    if ([NSLocale preferredLanguages].count) {
        // Check first object to be of type "en","es" etc
        // Codes seen by my eyes: "en-US","en","es-US","es" etc

        NSString *letterCode = [[NSLocale preferredLanguages] objectAtIndex:0];

        if ([letterCode rangeOfString:@"en"].location != NSNotFound) {
            // English
            language = @"en";
        } else if ([letterCode rangeOfString:@"es"].location != NSNotFound) {
            // Spanish
            language = @"es";
        } else if ([letterCode rangeOfString:@"fr"].location != NSNotFound) {
            // French
            language = @"fr";
        } // Add more if needed
    }

    return [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:language ofType:@"lproj"]];
}

/// Check if preferred language is English
+ (BOOL)isCurrentLanguageEnglish
{
    if (![NSLocale preferredLanguages].count) {
        // Just incase check for no items in array
        return YES;
    }

    if ([[[NSLocale preferredLanguages] objectAtIndex:0] rangeOfString:@"en"].location == NSNotFound) {
        // No letter code for english found
        return NO;
    } else {
        // Tis English
        return YES;
    }
}

/*  Swap language between English & Spanish
 *  Could send a string argument to directly pass the new language
 */
+ (void)changeCurrentLanguage
{
    if ([self isCurrentLanguageEnglish]) {
        [[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"];
    } else {
        [[NSUserDefaults standardUserDefaults] setObject:@[@"en"] forKey:@"AppleLanguages"];
    }
}
@end

স্ট্রিং ফাইল / চিত্র / ভিডিও / ইত্যাদি উল্লেখ করতে উপরের শ্রেণিটি ব্যবহার করুন:

// Access a localized image
[[OSLocalization currentLanguageBundle] pathForResource:@"my_image_name.png" ofType:nil]
// Access  a localized string from Localizable.strings file
NSLocalizedStringFromTableInBundle(@"StringKey", nil, [OSLocalization currentLanguageBundle], @"comment")

ভাষাটি নীচের মত লাইনে পরিবর্তন করুন বা নতুন ভাষার উল্লেখ করে একটি স্ট্রিং প্যারামিটার নিতে উপরের ক্লাসে "চেঞ্জকারেন্টল্যাঙ্গেজ" পদ্ধতিটি আপডেট করুন।

[[NSUserDefaults standardUserDefaults] setObject:@[@"es"] forKey:@"AppleLanguages"];

2

সুইফ্ট 4-এ, আমি লাইব্রেরিগুলি পুনরায় আরম্ভ বা ব্যবহার না করেই এটি সমাধান করেছি।

অনেকগুলি বিকল্প চেষ্টা করার পরে, আমি এই ফাংশনটি পেয়েছি, যেখানে আপনি অনুবাদ করতে চান যে স্ট্রিংটি লোকালাইজ (লোকালাইজিবল স্ট্রিং, স্ট্রিং ফাইলের) এবং যে ভাষাতে আপনি এটি অনুবাদ করতে চান তা এবং এটি যেটি ফিরে আসে তার মান স্ট্রিংস ফাইলটিতে আপনার এই স্ট্রিং রয়েছে:

    func localizeString (stringToLocalize: String, language: String) -> String
    {
        let path = Bundle.main.path (forResource: language, ofType: "lproj")
        let languageBundle = Bundle (path: path!)
        return languageBundle! .localizedString (forKey: stringToLocalize, value: "", table: nil)
    }

এই ফাংশনটি বিবেচনায় নিয়ে আমি একটি সুইফ্ট ফাইলে এই ফাংশনটি তৈরি করেছি:

struct CustomLanguage {

    func createBundlePath () -> Bundle {
        let selectedLanguage = //recover the language chosen by the user (in my case, from UserDefaults)
        let path = Bundle.main.path(forResource: selectedLanguage, ofType: "lproj")
        return Bundle(path: path!)!
    }
}

পুরো অ্যাপ্লিকেশনটি থেকে এবং প্রতিটি ভিউ কনট্রোলারগুলির প্রতিটি স্ট্রিংয়ে প্রবেশের পরিবর্তে:

NSLocalizedString ("StringToLocalize", comment: ")

আমি এটি দিয়ে প্রতিস্থাপন করেছি

let customLang = CustomLanguage() //declare at top
let bundleLanguage = customLang.createBundle()

NSLocalizedString("StringToLocalize", tableName: nil, bundle: bundleLanguage, value: "", comment: “”) //use in each String

এটি সর্বোত্তম উপায় কিনা তা আমি জানি না তবে আমি এটি খুব সহজ পেয়েছি এবং এটি আমার পক্ষে কাজ করে, আমি আশা করি এটি আপনাকে সহায়তা করবে!


1

এই ফাংশনটি বর্তমান ভাষার জন্য স্থানীয়করণের স্ট্রিং নেওয়ার চেষ্টা করবে এবং যদি এটি খুঁজে না পাওয়া যায় তবে তা ইংরাজী ভাষা ব্যবহার করে এটি পাবে।

- (NSString*)L:(NSString*)key
{
    static NSString* valueNotFound = @"VALUE_NOT_FOUND";
    static NSBundle* enBundle = nil;

    NSString* pl = [NSLocale preferredLanguages][0];
    NSString* bp = [[NSBundle mainBundle] pathForResource:pl ofType:@"lproj"];
    NSBundle* b = [NSBundle bundleWithPath:bp];

    NSString* s = [b localizedStringForKey:key value:valueNotFound table:nil];
    if ( [s isEqualToString:valueNotFound] ) {
        if ( !enBundle ) {
            bp = [[NSBundle mainBundle] pathForResource:@"en" ofType:@"lproj"];
            enBundle = [NSBundle bundleWithPath:bp];
        }
        s = [enBundle localizedStringForKey:key value:key table:nil];
    }

    return s;
}

1

আমি এমন কোনও ভাষার জন্য সমর্থন যুক্ত করতে চেয়েছিলাম যা আইওএস দ্বারা আনুষ্ঠানিকভাবে সমর্থিত নয় (সিস্টেম সেটিংসের অধীনে ভাষা বিভাগে তালিকাভুক্ত নয়)। অ্যাপলের আন্তর্জাতিকীকরণ টিউটোরিয়াল এবং ব্রায়ান ওয়েবস্টার এবং জিওনের এখানে কয়েকটি ইঙ্গিত অনুসরণ করে আমি এই কোডের টুকরোটি নিয়ে এসেছি (এটিকে মূল ভাষায় রেখেছি):

int main(int argc, char * argv[]) {
    @autoreleasepool {
        // Grab regional settings locale, for Slovenian this is either sl_SI or en_SI
        NSLocale *locale = [NSLocale currentLocale];
        NSString *ll = [locale localeIdentifier]; // sl_SI

        // Grab the first part of language identifier
        NSArray *comp = [ll componentsSeparatedByString:@"_"];
        NSString *ll1 = @"en";
        if (comp.count > 0) {
            ll1 = comp[0]; // sl, en, ...
        }
        // Check if we already saved language (user can manually change it inside app for example)
        if (![[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"]) {
            //   Slovenian (Slovenia),            Slovenia
            if ([ll isEqualToString:@"sl_SI"] || [ll isEqualToString:@"en_SI"]) {
                ll1 = @"sl-SI"; // This is the part of localized path for Slovenian language that Xcode generates
            }
            // Add more unsupported languages here...

            [[NSUserDefaults standardUserDefaults] setObject:ll1 forKey:@"SelectedLanguage"]; // Save language
        }
        else {
            // Restore language as we have previously saved it
            ll1 = [[NSUserDefaults standardUserDefaults] objectForKey:@"SelectedLanguage"];
        }
        // Overwrite NSLocalizedString and StoryBoard language preference
        [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:ll1, @"en", @"fr", nil] forKey:@"AppleLanguages"];
        // Make sure settings are stored to disk
        [[NSUserDefaults standardUserDefaults] synchronize];

        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
}

এটি স্টোরিবোর্ড এবং এনএসলোক্যালাইজড স্ট্রিং কোড উভয়ের জন্যই ভাল কাজ করে। কোডটি ধরে নিয়েছে যে ব্যবহারকারীর কাছে পরে অ্যাপ্লিকেশনটির ভিতরে ম্যানুয়ালি ভাষা পরিবর্তন করার বিকল্প থাকবে।

অবশ্যই, সঠিক স্টোরিবোর্ড অনুবাদ এবং লোকালাইজেবল.স্ট্রিংস অনুবাদগুলি যুক্ত করতে ভুলবেন না (এটি কীভাবে করবেন তার জন্য উপরের অ্যাপল পৃষ্ঠার লিঙ্কটি দেখুন)।


আমি দেখতে পাচ্ছি যে আপনিও স্লোভেনিয়ান ভাষার সমস্যার মুখোমুখি রয়েছেন :) আইওএস সমর্থন করে না এমন ভাষাগুলির জন্য এই উত্তরটির উন্নতি করতে, আপনি যদি বুঝতে পারেন যে আমরা যদি কাস্টম স্থানীয়করণযোগ্য স্ট্রিং সেট করতে পারি যা অ্যাপে সিস্টেম নিয়ন্ত্রণের জন্য ব্যবহৃত হবে (সম্পাদনা, সম্পন্ন, আরও, ...)?
মিহাম

1

এই সমস্যার জন্য এখানে একটি শালীন সমাধান রয়েছে এবং এর জন্য অ্যাপ্লিকেশন পুনঃসূচনা করার প্রয়োজন নেই।

https://github.com/cmaftuleac/BundleLocalization

এই প্রয়োগটি এনএসবান্ডেলের ভিতরে টুইট করে কাজ করে। ধারণাটি হ'ল আপনি এনএসবান্ডেল অবজেক্টের উদাহরণে স্থানীয়করণের স্ট্রিংফোর্কি পদ্ধতিটি ওভাররাইড করে এবং তারপরে এই পদ্ধতিটিকে একটি ভিন্ন ভাষার সাথে একটি আলাদা বান্ডেলে কল করে। সরল এবং মার্জিত সমস্ত ধরণের সংস্থার সাথে সম্পূর্ণ সুসংগত।


প্রকল্পের এই কোডটি আমাকে অনেক সহায়তা করেছিল। নির্দিষ্ট ভাষা কোডের জন্য কীভাবে একটি বান্ডিল সন্ধান করবেন ---NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
ইওনিল

এই শ্রেণিটি ভাল কাজ করছে, তবে অন্যকে ভাষা পরিবর্তনের পরে, এটি কার্যকর হয় না।
অনিলকুমার আইওএস প্রতিক্রিয়াশীল

0

আপনি যা কিছু করেন না কেন, সর্বোত্তম উপায় হ'ল সংক্ষিপ্ত নামটি নির্দিষ্ট ভাষার জন্য নেওয়া, যেমন: ফ্রি, এন, এন, এল, ডি, ইত্যাদি ... এবং বিশ্বব্যাপী মানকে একই বরাদ্দ করা।

ড্রপ ডাউন মেনুর মতো পপ আপ করতে একটি পিকর ভিউ করুন (ক্লিকের উপর একটি বোতামের সংমিশ্রণ যা নীচের দিক থেকে একটি পিকচার ভিউ ভাষার তালিকার সাথে প্রদর্শিত হবে) এবং আপনার পছন্দের ভাষাটি নির্বাচন করুন। সংক্ষিপ্ত নামটি অভ্যন্তরীণভাবে সংরক্ষণ করা যাক। লোকালাইজডস্ট্রিং নামে একটি .h + .m ফাইল তৈরি করুন।

লোকালাইজড স্ট্রিং.এম-তে প্রাপ্ত মানের সমান হতে সংক্ষিপ্ত নামটির গ্লোবাল মান সেট করুন the যখন প্রয়োজনীয় ভাষা নির্বাচন করা হয় তখন প্রয়োজনীয় ভাষার জন্য প্রকল্পের উপ-ডিরেক্টরিগুলি তৈরি করতে NSBundlePath বরাদ্দ করুন। উদাহরণস্বরূপ, nl.proj, en.proj।

যখন নির্দিষ্ট প্রজ ফোল্ডারটি নির্বাচিত হয় তখন সংশ্লিষ্ট ভাষার জন্য স্থানীয় স্ট্রিংকে কল করুন এবং ভাষাটি পরিবর্তনশীলভাবে পরিবর্তন করুন।

কোনও নিয়ম ভাঙা হয়নি।


0

সুইফ্টের জন্য আপনি main.swiftফাইলটি ওভাররাইড করতে পারেন এবং অ্যাপ্লিকেশন চালানোর আগে সেখানে ইউজারডেফল্টস স্ট্রিং সেট করতে পারেন । এইভাবে পছন্দসই প্রভাবটি দেখতে আপনাকে অ্যাপ পুনরায় চালু করতে হবে না।

import Foundation
import UIKit

// Your initialisation code here
let langCultureCode: String = "LANGUAGE_CODE"

UserDefaults.standard.set([langCultureCode], forKey: "AppleLanguages")
UserDefaults.standard.synchronize()

UIApplicationMain(CommandLine.argc, CommandLine.unsafeArgv, nil, NSStringFromClass(AppDelegate.self))

@UIApplicationMainআপনার AppDelegate.swiftফাইলটি অপসারণের সাথে একত্রে যুক্ত ।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.