多言語管理

BaaS@rakuzaではアプリで利用するデータを複数の言語で管理することができます。

このページでは、多言語管理機能を利⽤する実装例を紹介します。

注意

多言語管理機能は有償オプションです。利用したい場合は、製品サイトopen in new windowよりお問い合わせください。

使用する言語を追加する

標準では日本語のみが利用可能になっています。使用可能な言語を追加するには、製品サイトopen in new windowよりお問い合わせください。

オブジェクト項目を設定する

多言語はオブジェクト項目ごとに有効にできます。

オブジェクトの編集画面を開き、多言語化したいオブジェクト項目の編集ボタンをクリックします。表示タイプの右側に表示される、「多言語対応」のチェックボックスをONにしてください。

使用可能な言語の一覧を取得する

使用可能な言語を取得して、ユーザーに言語を選択させたり、端末で選択している言語が使用可能かどうかをチェックすることができます。

使用可能な言語の取得はgetLocaleListメソッド(JavaScript・FlutterはLocaleQuery.findメソッド)で行います。

RKZService.sharedInstance().getLocaleList(nil, sortConditionArray: nil) { locales, responseStatus in
    if responseStatus.isSuccess {
        // 成功時
        locales.forEach { item in
            print("language_cd:", item.language_cd ?? "") // 言語コード
            print("language_name:", item.language_name ?? "") // 言語名称
            print("locale:", item.locale ?? "") // ロケール(言語コードをLocaleに変換した値)
            print("default_flg:", item.default_flg) // 初期選択フラグ
        }
    } else {
        // 失敗
        print("statusCode:", responseStatus.statusCode.rawValue)
        print("message:", responseStatus.message ?? "")
    }
}
[[RKZService sharedInstance] getLocaleList:nil sortConditionArray:nil withBlock:^(NSArray<RKZLocaleData *> * _Nonnull locales, RKZResponseStatus * _Nonnull responseStatus) {
    if (responseStatus.isSuccess) {
        // 成功時
        for (RKZLocaleData *item in locales) {
            NSLog(@"language_cd: %@", item.language_cd); // 言語コード
            NSLog(@"language_name: %@", item.language_name); // 言語名称
            NSLog(@"locale: %@", item.locale); // ロケール(言語コードをLocaleに変換した値)
            NSLog(@"default_flg: %d", item.default_flg); // 初期選択フラグ
        }
    } else {
        // 失敗
        NSLog(@"statusCode: %ld", responseStatus.statusCode);
        NSLog(@"message: %@", responseStatus.message);
    }
}];
RKZClient.getInstance().getLocaleList(null, null) { locales, rkzResponseStatus ->
    if (rkzResponseStatus.isSuccess) {
        // 成功時
        locales.forEach {
            Log.d(TAG, "languageCd: ${it.languageCd}") // 言語コード
            Log.d(TAG, "languageName: ${it.languageName}") // 言語名称
            Log.d(TAG, "locale: ${it.locale}") // ロケール(言語コードをLocaleに変換した値)
            Log.d(TAG, "isDefaultFlg: ${it.isDefaultFlg}") // 初期選択フラグ
        }
    } else {
        // 失敗
        Log.e(TAG, "statusCode: ${rkzResponseStatus.statusCode}")
        Log.e(TAG, "message: ${rkzResponseStatus.message}")
    }
}
RKZClient.getInstance().getLocaleList(null, null, new OnGetLocaleListListener() {
    @Override
    public void onGetLocaleList(List<LocaleData> locales, RKZResponseStatus rkzResponseStatus) {
        if (rkzResponseStatus.isSuccess()) {
            // 成功時
            for (LocaleData item : locales) {
                Log.d(TAG, "languageCd: " + item.getLanguageCd()); // 言語コード
                Log.d(TAG, "languageName: " + item.getLanguageName()); // 言語名称
                Log.d(TAG, "locale: " + item.getLocale()); // ロケール(言語コードをLocaleに変換した値)
                Log.d(TAG, "isDefaultFlg: " + item.isDefaultFlg()); // 初期選択フラグ
            }
        } else {
            // 失敗
            Log.e(TAG, "statusCode: " + rkzResponseStatus.getStatusCode());
            Log.e(TAG, "message: " + rkzResponseStatus.getMessage());
        }
    }
});
RKZClient.getLocaleList(null, null, function (locales) {
  // 成功時
  locales.forEach(function (item) {
    console.debug('language_cd:', item.language_cd) // 言語コード
    console.debug('language_name:', item.language_name) // 言語名称
    console.debug('locale:', item.locale) // ロケール(JSでは、言語コードと同じ)
    console.debug('default_flg:', item.default_flg) // 初期選択フラグ
  })
}, function (error) {
  // 失敗時
  console.error('status_code:', error.status_code)
  console.error('message:', error.message)
})
const locales = await RKZ.localeQuery().find()

locales.forEach(item => {
  console.debug('language_cd:', item.language_cd) // 言語コード
  console.debug('language_name:', item.language_name) // 言語名称
  console.debug('locale:', item.locale) // ロケール(JSでは、言語コードと同じ)
  console.debug('default_flg:', item.default_flg) // 初期選択フラグ
})
final locales = await RKZClient.instance.localeQuery().find();

locales.forEach((item) {
  print('languageCd: ${item.languageCd}'); // 言語コード
  print('languageName: ${item.languageName}'); // 言語名称
  print('locale: ${item.locale}'); // ロケール(Flutterでは、言語コードと同じ)
  print('defaultFlg: ${item.defaultFlg}'); // 初期選択フラグ
});

使用する言語を設定する

アプリが使用する言語を設定するには、setLocaleメソッドを使用します。

let userAccessToken = "xxx"
let locale = Locale(identifier: "ja") // 設定するロケール

RKZService.sharedInstance().setLocale(userAccessToken, locale: locale) { locale, responseStatus in
    if responseStatus.isSuccess {
        // 成功時
        print(locale ?? "") // 更新したロケール
    } else {
        // 失敗
        print("statusCode:", responseStatus.statusCode.rawValue)
        print("message:", responseStatus.message ?? "")
    }
}
NSString *userAccessToken = @"xxx";
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"ja"]; // 設定するロケール

[[RKZService sharedInstance] setLocale:userAccessToken locale:locale withBlock:^(NSLocale * _Nullable updateLocale, RKZResponseStatus * _Nonnull responseStatus) {
    if (responseStatus.isSuccess) {
        // 成功時
        NSLog(@"%@", locale); // 更新したロケール
    } else {
        // 失敗
        NSLog(@"statusCode: %ld", responseStatus.statusCode);
        NSLog(@"message: %@", responseStatus.message);
    }
}];
val userAccessToken = "xxx"
val locale = Locale("ja") // 設定するロケール

RKZClient.getInstance().setLocale(userAccessToken, locale) { newLocale, rkzResponseStatus ->
    if (rkzResponseStatus.isSuccess) {
        // 成功時
        Log.d(TAG, newLocale.toString()) // 更新したロケール
    } else {
        // 失敗
        Log.e(TAG, "statusCode: ${rkzResponseStatus.statusCode}")
        Log.e(TAG, "message: ${rkzResponseStatus.message}")
    }
}
String userAccessToken = "xxx";
Locale locale = new Locale("ja"); // 設定するロケール

RKZClient.getInstance().setLocale(userAccessToken, locale, new OnSetLocaleListener() {
    @Override
    public void onSetLocale(Locale newLocale, RKZResponseStatus rkzResponseStatus) {
        if (rkzResponseStatus.isSuccess()) {
            // 成功時
            Log.d(TAG, newLocale.toString()); // 更新したロケール
        } else {
            // 失敗
            Log.e(TAG, "statusCode: " + rkzResponseStatus.getStatusCode());
            Log.e(TAG, "message: " + rkzResponseStatus.getMessage());
        }
    }
});
var userAccessToken = 'xxx'
var locale = 'ja' // 設定するロケール

RKZClient.setLocale(userAccessToken, locale, function (newLocale) {
  // 成功時
  console.debug(newLocale) // 更新したロケール
}, function (error) {
  // 失敗時
  console.error('status_code:', error.status_code)
  console.error('message:', error.message)
})
const userAccessToken = 'xxx'
const locale = 'ja' // 設定するロケール

const newLocale = await RKZ.setMyLocale(userAccessToken, locale)
console.debug(newLocale)
final userAccessToken = 'xxx';
final locale = 'ja'; // 設定するロケール

final newLocale = await RKZClient.instance.setMyLocale(userAccessToken, locale);
print(newLocale);

getLocaleメソッドで設定した言語を確認することができます。

let locale = RKZService.sharedInstance().getLocale()
print(locale ?? "")
NSLocale *locale = [[RKZService sharedInstance] getLocale];
NSLog(@"%@", locale);
val locale = RKZClient.getInstance().locale
Log.d(TAG, locale.toString())
Locale locale = RKZClient.getInstance().getLocale();
Log.d(TAG, locale.toString());
RKZClient.getLocale(function (locale) {
  // 成功時
  console.debug(locale)
}, function (error) {
  // 失敗時
  console.error('status_code:', error.status_code)
  console.error('message:', error.message)
})
const locale = RKZ.config.locale
console.debug(locale)
final locale = await RKZClient.instance.getLocale();
print(locale);

注意

JavaScriptの場合、設定した言語は端末に保存されません。そのため、設定した言語はアプリ側で永続データ領域に保存して、アプリを起動した際にSDKに再設定してください。

// ローカルストレージから言語を取得して、SDKに設定
RKZ.config.locale = localStorage.getItem('locale')

言語を設定すると、設定した言語のデータを取得することができます。

例えば、以下の様に「店舗」というオブジェクトの名称を多言語化して、各言語の名称を入力します。

設定した言語が英語の場合、店舗オブジェクトを取得すると、英語の名称が取得できます。

let userAccessToken = "xxx"
let locale = Locale(identifier: "en") // 英語を設定

RKZService.sharedInstance().setLocale(userAccessToken, locale: locale) { locale, responseStatus in
    if responseStatus.isSuccess {
        // オブジェクトデータ1件を取得
        RKZService.sharedInstance().getData("shop", code: "0001") { objectData, responseStatus in
            if responseStatus.isSuccess, let objectData = objectData {
                // 英語の名称が表示される
                print(objectData.name ?? "") // => People Cafe Okayama
            } else {
                // ...
            }
        }
    } else {
        // ...
    }
}
NSString *userAccessToken = @"xxx";
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"en"]; // 英語を設定

[[RKZService sharedInstance] setLocale:userAccessToken locale:locale withBlock:^(NSLocale * _Nullable updateLocale, RKZResponseStatus * _Nonnull responseStatus) {
    if (responseStatus.isSuccess) {
        // オブジェクトデータ1件を取得
        [[RKZService sharedInstance] getData:@"shop" code:@"0001" withBlock:^(RKZObjectData * _Nullable objectData, RKZResponseStatus * _Nonnull responseStatus) {
            if (responseStatus.isSuccess) {
                // 英語の名称が表示される
                NSLog(@"%@", objectData.name); // => People Cafe Okayama
            } else {
                // ...
            }
        }];
    } else {
        // ...
    }
}];
val userAccessToken = "xxx"
val locale = Locale("en") // 英語を設定

RKZClient.getInstance().setLocale(userAccessToken, locale) { newLocale, rkzResponseStatus ->
    if (rkzResponseStatus.isSuccess) {
        // オブジェクトデータ1件を取得
        RKZClient.getInstance().getData("shop", "0001") { objectData, rkzResponseStatus ->
            if (rkzResponseStatus.isSuccess) {
                // 英語の名称が表示される
                Log.d(TAG, objectData.name) // => People Cafe Okayama
            } else {
                // ...
            }
        }
    } else {
        // ...
    }
}
String userAccessToken = "xxx";
Locale locale = new Locale("en"); // 英語を設定

RKZClient.getInstance().setLocale(userAccessToken, locale, new OnSetLocaleListener() {
    @Override
    public void onSetLocale(Locale locale, RKZResponseStatus rkzResponseStatus) {
        if (rkzResponseStatus.isSuccess()) {
            // オブジェクトデータ1件を取得
            RKZClient.getInstance().getData("shop", "0001", new OnGetRKZObjectDataListener() {
                @Override
                public void onGetRKZObjectData(RKZObjectData objectData, RKZResponseStatus rkzResponseStatus) {
                    if (rkzResponseStatus.isSuccess()) {
                        // 英語の名称が表示される
                        Log.d(TAG, objectData.getName()); // => People Cafe Okayama
                    } else {
                        // ...
                    }
                }
            });
        } else {
            // ...
        }
    }
});
var userAccessToken = 'xxx'
var locale = 'en' // 英語を設定

RKZClient.setLocale(userAccessToken, locale, function (newLocale) {
  // オブジェクトデータ1件を取得
  RKZClient.getData('shop', '0001', function (data) {
    // 英語の名称が表示される
    console.debug(data.name) // => People Cafe Okayama
  }, function (error) {
    // ...
  })
}, function (error) {
  // ...
})
const userAccessToken = 'xxx'
const locale = 'en' // 英語を設定

await RKZ.setMyLocale(userAccessToken, locale)

const data = await RKZ.Data.get('shop', '0001')

// 英語の名称が表示される
console.debug(data.name) // => People Cafe Okayama
final userAccessToken = 'xxx';
final locale = 'en'; // 英語を設定

await RKZClient.instance.setMyLocale(userAccessToken, locale);

final data = await RKZClient.instance.getData('shop', '0001');

// 英語の名称が表示される
print(data.name); // => People Cafe Okayama