因为我们公司项目已经到后期,所以算是很庞大了。现在需要做优化和重载,其中涉及到多语言适配化方面,不可能将几千个单词再同时翻译成其他各个国家的吧,那任务量太重了。所以我们就使用了Lokalise这个工具,帮助我们适配,但是集成他们的sdk是需要付费的,但确实挺好用的,如果公司能接受,可以推荐。
注册账号后,里面可以创建工程并上传自己的字符串文件。参考里面的文档,集成自己的sdk,我是集成了android sdk。
1. 在lokalise里创建自己的工程
创建后,导入自己的字符串文件l,ex(strings.xml),将各种语言导入后,去到“project setting”里,得到工程的project id。
for example:
3281927757690217f560f6.71199070
2.生成bundle
3.在工程中添加lokalise的库
在自己的module工程里放入lokalise库
repositories {
...
maven {
url "https://maven.lokalise.co"
}
}
...
dependencies {
...
compile 'com.lokalise.android:ota-sdk:1.+'
compile 'com.google.code.gson:gson:2.8.0'
}
添加库后,需要混淆,
1)用的是ProGuard,就添加下列语句
-keep class co.lokalise.** { *; }
-dontwarn co.lokalise.*
2)用DexGuard,就添加
-keepresources string/**
-keepresources string-array/**
-keepresources plurals/**
4.在代码中初始化sdk
public class MyApplication extends Application {
...
@Override
public void onCreate() {
super.onCreate();
// Initialise Lokalise SDK with projects SDK token and project id
// It is important to call this right after the "super.onCreate()"
// If you are using AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
// make sure it is called before LokaliseSDK.init()
LokaliseSDK.init("<sdk token>", "<project id>", this);
// Add this only if you want to use pre-release bundles
LokaliseSDK.setPreRelease(true);
// Fetch the latest translations from Lokalise (can be called anywhere)
LokaliseSDK.updateTranslations();
}
...
}
public class MainActivity extends AppCompatActivity {
...
@Override
protected void attachBaseContext(Context newBase) {
// Inject the Lokalise SDK into the activity context
super.attachBaseContext(LokaliseContextWrapper.wrap(newBase));
}
...
}
如果使用Calligraphy library,就用下面语句
...
super.attachBaseContext(LokaliseContextWrapper.wrap(
CalligraphyContextWrapper.wrap(newBase)
));
...
5.使用
在使用中,就跟平常一样调用字符串文件,但是当你在lokalise上修改某个字符串时,调用下列语句去监测到字符串更新
1)Lokalise callback
LokaliseCallback myCallback = new LokaliseCallback() {
@Override
public void onTranslationsUpdated(long oldBundleVersion, long newBundleVersion) {
// Do something
}
};
LokaliseSDK.addCallback(myCallback);
2)Broadcast receiver
...
IntentFilter myIntentFilter = new IntentFilter(LokaliseDefines.INTENT_TRANSLATIONS_UPDATED);
BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
long previous_version = intent.getLongExtra(LokaliseDefines.EXTRA_BUNDLE_VERSION_OLD, 0);
long current_version = intent.getLongExtra(LokaliseDefines.EXTRA_BUNDLE_VERSION_NEW, 0);
// Do something
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(myReceiver, myIntentFilter);
}
@Override
protected void onPause() {
super.onPause();
unregisterReceiver(myReceiver);
}
...
监测到字符串文件更新后,lokalise会自动给你返回最新的字符串库的response,然后你的程序会自动使用所有的最新字符串。
缺点:
这个是国外提供的库,可能会涉及到由于网络缓慢而导致字符串更新缓慢,从而达不到立即更新的效果。 但是可以大量节省你每次都在本地添加字符串的时间,而且这个跨平台,你可以在lokalise平台上更改字符串文件后,自动导出各种平台的字符串文件(Android,iOS,web and so on),然后copy到本地使用,就可以解决上面的问题,但这也就不用使用sdk啦,总之有利有弊,看公司情况决定。