অন আইফোন আইফোনের NSLocalizedString
ভাষায় স্ট্রিংটি ফিরিয়ে দেয়। NSLocalizedString
ডিভাইসের চেয়ে আলাদা ভাষায় অ্যাপ্লিকেশন রাখতে কোনও নির্দিষ্ট ভাষা প্রয়োগ করার জন্য জোর করা কি সম্ভব ?
অন আইফোন আইফোনের NSLocalizedString
ভাষায় স্ট্রিংটি ফিরিয়ে দেয়। NSLocalizedString
ডিভাইসের চেয়ে আলাদা ভাষায় অ্যাপ্লিকেশন রাখতে কোনও নির্দিষ্ট ভাষা প্রয়োগ করার জন্য জোর করা কি সম্ভব ?
উত্তর:
NSLocalizedString()
(এবং এর রূপগুলি) NSUserDefaults
পছন্দের ভাষার জন্য ব্যবহারকারীর সেটিংস কী তা নির্ধারণ করতে "অ্যাপল্যাঙ্গোয়েজস" কী অ্যাক্সেস করে । এটি ভাষার কোডগুলির একটি অ্যারে প্রদান করে, যার মধ্যে প্রথমটি তাদের ফোনের জন্য ব্যবহারকারীর দ্বারা সেট করা হয় এবং পরবর্তী সংস্করণ যদি পছন্দের ভাষায় কোনও সংস্থান না পাওয়া যায় তবে ফলব্যাক হিসাবে ব্যবহৃত হয়। (ডেস্কটপে, ব্যবহারকারী সিস্টেম পছন্দগুলিতে কাস্টম অর্ডার সহ একাধিক ভাষা নির্দিষ্ট করতে পারে)
আপনি যদি নিজের ভাষা তালিকাটি সেট করার জন্য সেটঅবজেক্ট: ফোরকি: পদ্ধতি ব্যবহার করে আপনার নিজের অ্যাপ্লিকেশনটির জন্য গ্লোবাল সেটিংটি ওভাররাইড করতে পারেন। এটি বিশ্বব্যাপী নির্ধারিত মানের চেয়ে অগ্রাধিকার গ্রহণ করবে এবং স্থানীয়করণ সম্পাদন করছে এমন আপনার অ্যাপ্লিকেশনটিতে যে কোনও কোডে ফিরে আসবে। এর জন্য কোডটি দেখতে এমন কিছু দেখাচ্ছে:
[[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObjects:@"de", @"en", @"fr", nil] forKey:@"AppleLanguages"];
[[NSUserDefaults standardUserDefaults] synchronize]; //to make the change immediate
এটি আপনার অ্যাপ্লিকেশনের জন্য জার্মানকে পছন্দের ভাষা করে ফেলবে, ইংরাজী এবং ফরাসিকে ফ্যালব্যাক হিসাবে with আপনি আপনার অ্যাপ্লিকেশন শুরু হওয়ার আগেই এই কল করতে চান। আপনি ভাষা / স্থানীয় পছন্দগুলি সম্পর্কে এখানে আরও পড়তে পারেন: আন্তর্জাতিকীকরণ প্রোগ্রামিংয়ের বিষয়গুলি: বর্তমান ভাষা এবং স্থানীয় অবস্থান প্রাপ্ত
আমার সম্প্রতি একই সমস্যা হয়েছিল এবং আমি আমার সম্পূর্ণ এনএসলোক্যালাইজড স্ট্রিং শুরু করতে এবং প্যাচ করতে চাই না বা অ্যাপ্লিকেশনটিকে নতুন ভাষার কাজ করার জন্য পুনরায় চালু করতে বাধ্য করব না। আমি চাই সমস্ত কিছু যেমন হয় তেমন কাজ করা।
আমার সমাধানটি ছিল মূল বান্ডিলের শ্রেণিটি গতিময়ভাবে পরিবর্তন করা এবং সেখানে উপযুক্ত বান্ডিলটি লোড করা:
শিরোনাম ফাইল
@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)
}
}
আমি সাধারণত এটি এইভাবে করি তবে আপনার প্রকল্পে সমস্ত স্থানীয়করণ ফাইল থাকা উচিত।
@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
আইওএস ৯ এ ব্যবহার করবেন না 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, @""));
যেমনটি আগে বলা হয়েছে, কেবল করুন:
[[NSUserDefaults standardUserDefaults] setObject: [NSArray arrayWithObjects:@"el", nil] forKey:@"AppleLanguages"];
তবে অ্যাপ্লিকেশনটি পুনরায় চালু করতে এড়াতে, (...) এর main.m
ঠিক আগে, প্রধান পদ্ধতিতে লাইনটি দিন UIApplicationMain
।
NSAutoreleasePool * pool ..
sertোকানো উচিত বা কয়েকটি স্বতঃপ্রযুক্ত বস্তু ফাঁস হওয়ার পরে ।
[[NSBundle mainBundle] URLForResource:withExtension:]
আগে কল করেন তবে এটি কাজ করবে না ।
অ্যাপ্লিকেশন থেকে নির্দিষ্ট ভাষা নির্বাচন করে নির্দিষ্ট ভাষা ব্যবহারের কৌশলটি NSLocalizedString
নির্বাচিত ভাষার উপর নির্ভর করে নির্দিষ্ট বান্ডিলটি ব্যবহার করতে বাধ্য করা ,
আইওএস অ্যাপ্লিকেশনগুলিতে এই শেখার অগ্রিম স্থানীয়করণের জন্য আমি যে পোস্টটি লিখেছি তা এখানে here
এবং এখানে আইওএস অ্যাপ্লিকেশনগুলিতে একটি নমুনা অ্যাপ্লিকেশন অগ্রিম স্থানীয়করণের কোড
আপনি সুইফট 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.
ব্রায়ান ওয়েবস্টার যেমন উল্লেখ করেছেন, ভাষাটি "আপনার অ্যাপ্লিকেশনটির শুরুতে কিছুটা আগে" সেট করা দরকার। আমি ভেবেছিলাম 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;
}
আমি এই সম্পর্কে কোন মন্তব্য প্রশংসা করব।
[[NSUserDefaults standardUserDefaults] synchronize];
কল করার পরে ব্যবহার করুনsetObject:forKey:
আমি সেরা মাওরো ডেলরিওর পদ্ধতিটি পছন্দ করি। আমি আমার প্রোজেক্ট_প্রিফিক্স.পিচিতেও নিম্নলিখিতগুলি যুক্ত করেছি
#import "Language.h"
#define MyLocalizedString(key, alt) [Language get:key alter:alt]
সুতরাং আপনি যদি কখনও স্ট্যান্ডার্ড পদ্ধতিটি (যা এনএসলোক্যালাইজড স্ট্রিং ব্যবহার করে) ব্যবহার করতে চান তবে আপনি সমস্ত ফাইলগুলিতে একটি দ্রুত সিনট্যাক্স প্রতিস্থাপন করতে পারেন।
NSLocalizedString()
AppleLanguages
মানক ব্যবহারকারী ডিফল্ট ( [NSUserDefaults standardUserDefaults]
) থেকে কীটির মান পড়বে । এটি রানটাইমের সমস্ত বিদ্যমান স্থানীয়করণের মধ্যে একটি উপযুক্ত স্থানীয়করণ চয়ন করতে সেই মানটি ব্যবহার করে। অ্যাপল অ্যাপ্লিকেশন প্রবর্তনের সময় ব্যবহারকারী ডিফল্ট অভিধান তৈরি করে, তারা সিস্টেম পছন্দগুলিতে পছন্দসই ভাষা (গুলি) কী সন্ধান করে এবং সেখান থেকে মানটি অনুলিপি করে। এটি উদাহরণস্বরূপ ব্যাখ্যা করে যে কেন ওএস এক্স-এ ভাষা সেটিংস পরিবর্তন করা অ্যাপ্লিকেশনগুলি চালানোর ক্ষেত্রে কোনও প্রভাব ফেলবে না, কেবল তার পরে শুরু হওয়া অ্যাপ্লিকেশনগুলিতে। একবার অনুলিপি করা হয়েছে, মান সেটিংস পরিবর্তিত কারণ আপডেট করা হয় না। এজন্য আইওএস সমস্ত অ্যাপ্লিকেশন পুনরায় চালু করে যদি আপনি ভাষা পরিবর্তন করেন।
তবে, ব্যবহারকারী ডিফল্ট অভিধানের সমস্ত মান কমান্ড লাইন আর্গুমেন্ট দ্বারা ওভাররাইট করা যেতে পারে। NSUserDefaults
ডকুমেন্টেশন দেখুন NSArgumentDomain
। এমনকি অ্যাপ্লিকেশন পছন্দগুলি (.plist) ফাইল থেকে লোড হওয়া সেই মানগুলিও এতে অন্তর্ভুক্ত রয়েছে। আপনি যদি পরীক্ষার জন্য একবারে কোনও মান পরিবর্তন করতে চান তবে এটি জেনে রাখা ভাল ।
সুতরাং আপনি যদি কেবল পরীক্ষার জন্য ভাষাটি পরিবর্তন করতে চান তবে আপনি সম্ভবত নিজের কোডটি পরিবর্তন করতে চান না (যদি আপনি পরে এই কোডটি সরিয়ে দিতে ভুলে যান ...), পরিবর্তে এক্সকোডকে একটি কমান্ড লাইন প্যারামিটার দিয়ে আপনার অ্যাপ্লিকেশনটি শুরু করতে বলুন ( যেমন স্প্যানিশ স্থানীয়করণ ব্যবহার করুন):
আপনার কোডটি স্পর্শ করার দরকার নেই। কেবল বিভিন্ন ভাষার জন্য বিভিন্ন স্কিম তৈরি করুন এবং আপনি স্কিমটি স্যুইচ করে একবারে এক ভাষাতে এবং একবার অন্য ভাষায় অ্যাপ্লিকেশনটি দ্রুত শুরু করতে পারেন।
Options
নতুন এক্সকোড সংস্করণ হিসাবে অ্যাপলটি প্রস্তাব দিয়েছেন যেমন.
আমি এমন একটি সমাধান নিয়ে এসেছি যা আপনাকে ব্যবহার করতে দেয় 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
মার্কো পুনরায় সংজ্ঞায়িত হয়েছে। সম্ভবত কেউ এই অংশটি ঠিক করতে আমাকে সহায়তা করতে পারে।
#undef NSLocalizedString
ঠিক আগে যুক্ত করুন#define
আপনাকে প্রথমে যা করতে হবে তা হ'ল আপনার অ্যাপ্লিকেশনটিকে কমপক্ষে দুটি ভাষা (ইংরেজি এবং ফরাসী উদাহরণের মধ্যে) দিয়ে স্থানীয়করণ করা।
আপনার কোডে, ব্যবহারের পরিবর্তে, 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];
}
আশা করি এটা তোমাকে সাহায্য করবে।
আপনি এই নিবন্ধে আরও বিবরণ পাবেন এনএসওয়িনিয়ার.ওয়ালি থেকে
সুইফট 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
ফাইল .pch এ সংজ্ঞায়িত করতে:
#define currentLanguageBundle [NSBundle bundleWithPath:[[NSBundle mainBundle] pathForResource:[[NSLocale preferredLanguages] objectAtIndex:0] ofType:@"lproj"]]
#define NSLocalizedString(str,nil) NSLocalizedStringFromTableInBundle(str, nil, currentLanguageBundle, @"")
হতে পারে আপনার এটির সাথে পরিপূরণ করা উচিত (# ইম্পোর্টের পরে .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]
সুইফট 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")
ভাষা কোডগুলির কয়েকটি উদাহরণ দেওয়া যেতে পারে যা ব্যবহার করা যায়। আশাকরি এটা সাহায্য করবে
আপনি এটি করতে চান এমন স্থানীয় স্ট্রিংগুলির সেট সহ একটি উপ-বান্ডিল তৈরি করতে পারেন এবং NSLocalizedStringFromTableInBundle()
সেগুলি লোড করার জন্য ব্যবহার করতে পারেন । (আমি ধরে নিচ্ছি যে এটি আপনি যে অ্যাপ্লিকেশনটিতে করছেন সম্ভবত সাধারণ UI স্থানীয়করণ থেকে পৃথক সামগ্রী।
আমার ক্ষেত্রে আমার দুটি স্থানীয় ফাইল আছে, জা এবং এন
সিস্টেমে পছন্দসই ভাষা যদি 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]));
}
}
আপনি এর মতো কিছু করতে পারেন:
NSString *bundlePath = [[NSBundle mainBundle] pathForResource:@"Localizable" ofType:@"strings" inDirectory:nil forLocalization:@"es"];
NSBundle *spanishBundle = [[NSBundle alloc] initWithPath:[bundlePath stringByDeletingLastPathComponent]];
NSLocalizedStringFromTableInBundle(@"House", nil, spanishBundle, nil):
অ্যাপ্লিকেশন না রেখে বা পুনরায় আরম্ভ না করেই ভাষা পরিবর্তন করার জন্য টিউডোরাইজারের উত্তরের ভিত্তিতে ।
কোনও ম্যাক্রোর পরিবর্তে, কোনও নির্দিষ্ট ভাষার কোড উপস্থিত রয়েছে কিনা তা পরীক্ষা করতে পছন্দের ভাষায় অ্যাক্সেসের জন্য একটি ক্লাস ব্যবহার করুন।
আইওএস 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"];
সুইফ্ট 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
এটি সর্বোত্তম উপায় কিনা তা আমি জানি না তবে আমি এটি খুব সহজ পেয়েছি এবং এটি আমার পক্ষে কাজ করে, আমি আশা করি এটি আপনাকে সহায়তা করবে!
এই ফাংশনটি বর্তমান ভাষার জন্য স্থানীয়করণের স্ট্রিং নেওয়ার চেষ্টা করবে এবং যদি এটি খুঁজে না পাওয়া যায় তবে তা ইংরাজী ভাষা ব্যবহার করে এটি পাবে।
- (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;
}
আমি এমন কোনও ভাষার জন্য সমর্থন যুক্ত করতে চেয়েছিলাম যা আইওএস দ্বারা আনুষ্ঠানিকভাবে সমর্থিত নয় (সিস্টেম সেটিংসের অধীনে ভাষা বিভাগে তালিকাভুক্ত নয়)। অ্যাপলের আন্তর্জাতিকীকরণ টিউটোরিয়াল এবং ব্রায়ান ওয়েবস্টার এবং জিওনের এখানে কয়েকটি ইঙ্গিত অনুসরণ করে আমি এই কোডের টুকরোটি নিয়ে এসেছি (এটিকে মূল ভাষায় রেখেছি):
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]));
}
}
এটি স্টোরিবোর্ড এবং এনএসলোক্যালাইজড স্ট্রিং কোড উভয়ের জন্যই ভাল কাজ করে। কোডটি ধরে নিয়েছে যে ব্যবহারকারীর কাছে পরে অ্যাপ্লিকেশনটির ভিতরে ম্যানুয়ালি ভাষা পরিবর্তন করার বিকল্প থাকবে।
অবশ্যই, সঠিক স্টোরিবোর্ড অনুবাদ এবং লোকালাইজেবল.স্ট্রিংস অনুবাদগুলি যুক্ত করতে ভুলবেন না (এটি কীভাবে করবেন তার জন্য উপরের অ্যাপল পৃষ্ঠার লিঙ্কটি দেখুন)।
এই সমস্যার জন্য এখানে একটি শালীন সমাধান রয়েছে এবং এর জন্য অ্যাপ্লিকেশন পুনঃসূচনা করার প্রয়োজন নেই।
https://github.com/cmaftuleac/BundleLocalization
এই প্রয়োগটি এনএসবান্ডেলের ভিতরে টুইট করে কাজ করে। ধারণাটি হ'ল আপনি এনএসবান্ডেল অবজেক্টের উদাহরণে স্থানীয়করণের স্ট্রিংফোর্কি পদ্ধতিটি ওভাররাইড করে এবং তারপরে এই পদ্ধতিটিকে একটি ভিন্ন ভাষার সাথে একটি আলাদা বান্ডেলে কল করে। সরল এবং মার্জিত সমস্ত ধরণের সংস্থার সাথে সম্পূর্ণ সুসংগত।
NSString *path = [[NSBundle mainBundle] pathForResource:lang ofType:@"lproj" ];
আপনি যা কিছু করেন না কেন, সর্বোত্তম উপায় হ'ল সংক্ষিপ্ত নামটি নির্দিষ্ট ভাষার জন্য নেওয়া, যেমন: ফ্রি, এন, এন, এল, ডি, ইত্যাদি ... এবং বিশ্বব্যাপী মানকে একই বরাদ্দ করা।
ড্রপ ডাউন মেনুর মতো পপ আপ করতে একটি পিকর ভিউ করুন (ক্লিকের উপর একটি বোতামের সংমিশ্রণ যা নীচের দিক থেকে একটি পিকচার ভিউ ভাষার তালিকার সাথে প্রদর্শিত হবে) এবং আপনার পছন্দের ভাষাটি নির্বাচন করুন। সংক্ষিপ্ত নামটি অভ্যন্তরীণভাবে সংরক্ষণ করা যাক। লোকালাইজডস্ট্রিং নামে একটি .h + .m ফাইল তৈরি করুন।
লোকালাইজড স্ট্রিং.এম-তে প্রাপ্ত মানের সমান হতে সংক্ষিপ্ত নামটির গ্লোবাল মান সেট করুন the যখন প্রয়োজনীয় ভাষা নির্বাচন করা হয় তখন প্রয়োজনীয় ভাষার জন্য প্রকল্পের উপ-ডিরেক্টরিগুলি তৈরি করতে NSBundlePath বরাদ্দ করুন। উদাহরণস্বরূপ, nl.proj, en.proj।
যখন নির্দিষ্ট প্রজ ফোল্ডারটি নির্বাচিত হয় তখন সংশ্লিষ্ট ভাষার জন্য স্থানীয় স্ট্রিংকে কল করুন এবং ভাষাটি পরিবর্তনশীলভাবে পরিবর্তন করুন।
কোনও নিয়ম ভাঙা হয়নি।
সুইফ্টের জন্য আপনি 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
ফাইলটি অপসারণের সাথে একত্রে যুক্ত ।