简介

Android SDK 2.0完全重写了Kotlin中的原始SDK。重写背后的想法是关注性能、可靠性和可扩展性。此外,SDK内部现在使用ViewPump库,它允许你使用自己的布局拦截器与我们的SDK。为简单起见,本文档中的所有示例都将放在Java.此外,如果您喜欢新版本的SDK,也欢迎任何积极的反馈。

限制

自定义视图中的文本需要以编程方式更新(LokaliseResources类可用于获取最新的字符串)。

Beta 10的突破性更改

我们正在最终确定SDK 2的规格,这可能是该SDK正式发布前的最后一个beta版本。请注意,自从beta-10LokaliseMenuInflater已删除,您应该使用translateToolbarItems方法从LokaliseResources如果您希望自动翻译菜单项。

MainActivity扩展了AppCompatActivity {
...
私人工具栏工具栏;

@Override
protected void onCreate(Bundle savedInstanceState) {
工具栏= findViewById (R.id.toolbar);


@Override
公共boolean onCreateOptionsMenu(菜单菜单){
getMenuInflater () .inflate (R.menu。主菜单);
((LokaliseResources) getresource ()) .translateToolbarItems(工具栏);
返回true;

...

同时,Realm.io库已更新到版本10,因此,如果您的项目正在使用旧版本的Realm.io,你可能需要更新它。

文件大小

请注意,新的APK文件的大小可能会增加。为了缓解这个问题,我们建议上传一个由Android Studio生成的包到谷歌Play,而不是一个简单的APK文件。这将允许谷歌Play只向终端用户设备提供所需的资源,大大减少了下载大小。

开始

步骤1:在Lokalise中设置项目

如果你还没有这样做,在Lokalise中添加一个新项目,上传你可能有的任何源语言文件(或者直接在Lokalise的编辑器中添加键,如果你正在构建一个新的应用程序)。注意项目ID,它可以在项目设置中找到,通常看起来像这样:

3281927757690217 f560f6.71199070

步骤2:生成包

下载页面,选择“Lokalise Android SDK”作为格式,点击构建只按钮来生成包。您将被自动带到项目设置中的bundle版本管理页面。暂时让开关保持原样。请参阅管理捆绑包部分中的详细信息。

确保在发布应用程序时总是在项目中包含最新的字符串。

步骤3:在项目中包含Lokalise SDK

首先你需要添加https://maven.www.wwealerts.com达到你的最高境界.gradle文件:

allprojects {
存储库{
...
maven {
url“https://maven.www.wwealerts.com”



之后,将SDK添加到应用程序模块级别.gradle文件(注意它现在是sdk)而不是ota-sdk

依赖关系{
...
实现(com.lokalise.android: sdk: 2.0.1) {
传递= true


或者如果你想要一个轻量级版本的SDK(使用SQLite而不是Realm.io),你可以使用新的lite版本:

...
实现(com.lokalise.android: sdk: 2.0.1-lite) {
传递= true

如果您正在使用ProGuard,请添加以下规则(请注意,它现在是com。):

com.lokalise小类。* * {*;}
-dontwarn com.lokalise。*
-keep @interface io.realm.annotations.RealmModule {*;}
-keep类io.realm.annotations.RealmModule {*;}

根据您的ProGuard设置,您可能还需要包括Gson库的规则


另外,如果你正在使用DexGuard,你需要指定这些额外的规则:

/ * * -keepresources字符串
-keepresources字符串数组/ * *
-keepresources复数/ * *

步骤4:初始化SDK

对于这一步,你需要你的SDK令牌(在项目设置> General选项卡中生成一个令牌)和所需项目的项目ID(在项目设置中获得)。在你的主Application类中包含以下代码:

公共类MyApplication扩展应用
...
@Override
公共无效onCreate() {
super.onCreate ();
//在"super.onCreate()"后面的init很重要
Lokalise。Init (this, "","<项目id>">);

//只有当你想使用预发布包时才添加这个
Lokalise.setPreRelease(真正的);

//从Lokalise获取最新的翻译(可以在任何地方调用)
Lokalise.updateTranslations ();

...


我们还需要将Lokalise SDK注入到Activity上下文中,并使用来自的方法转换菜单项LokaliseResources.为此,我们建议您创建一个基本Activity类,并从中扩展所有的活动。添加以下代码到您的活动:

MainActivity扩展了AppCompatActivity {
...
私人工具栏工具栏;

@Override
protected void onCreate(Bundle savedInstanceState) {
工具栏= findViewById (R.id.toolbar);


@Override
protected void attachBaseContext(Context newBase) {
//将Lokalise SDK注入到活动上下文
super.attachBaseContext (LokaliseContextWrapper.wrap (newBase));


@Override
公共boolean onCreateOptionsMenu(菜单菜单){
getMenuInflater () .inflate (R.menu。主菜单);
((LokaliseResources) getresource ()) .translateToolbarItems(工具栏);
返回true;

...


就是这样!你已经准备好了!

使用

更新的翻译

没有必要更新你的代码,照例引用键:

...
< TextView
android: id =“@ + id /测试”
android:文本= " @string / hello_world”
.../>
...


或从代码:

TextView test = (TextView) findViewById(R.id.test);
test.setText (R.string.hello_world);


或者如果你需要从应用程序的部分获得最新的翻译上下文是否被覆盖(例如在自定义视图内),您可以使用LokaliseResources类直接:

LokaliseResources = new LokaliseResources(context);
String myString = lokaliseresource . getstring (R.string.hello_world);

改变应用程序语言环境

如果需要手动更改应用程序的区域设置,请使用Lokalise。setLocale(, [, activityContext])方法。

不需要自定义区域设置更改代码或上下文包装器,只需调用此方法并重新启动Activity。如果希望传播区域设置更改,还建议传递当前Activity的上下文。

但是,请注意,Lokalise SDK只使用上下文中的语言环境信息,不会在应用程序重新启动时持久化设置的语言环境。这个方法只是一个helper方法,它试图设置Context的语言环境,在应用程序的生命周期中,它可以被其他系统组件覆盖,在这种情况下,您将需要调用setLocale一次。

动态地添加键

有时需要添加新的字符串而无需重新编译应用程序。

在通过Lokalise界面添加一个新密钥并创建一个新的Android SDK包后,你可以使用以下代码通过名称引用新密钥:

...
LokaliseResources资源= new LokaliseResources(context);
String newKey = resources.getString("new_key_name");
if(newKey != null) {
//对新值执行一些操作

请注意,当您请求该键时,并不能保证它会存在,因为您可以将任何键名传递给方法,所以请确保检查返回值是否为空。

回调

如果您需要知道Lokalise何时下载完一个新的翻译包,有几个选项。

LokaliseCallback

最简单的方法是使用LokaliseCallback接口:

myCallback = new LokaliseCallback() {
@Override
onUpdated(long oldBundleId, long newBundleId) {



@Override
onUpdateFailed(LokaliseUpdateError错误){



@Override
onupdatenonneeded () {


});

Lokalise.addCallback (myCallback);


如果需要删除回调,只需使用Lokalise.removeCallback (myCallback);

广播接收器

你也可以通过Broadcast接收器接收关于bundle更新的通知:

...
myIntentFilter = new IntentFilter();
myIntentFilter.addAction (LokaliseDefines.INTENT_TRANSLATIONS_UPDATED);
myIntentFilter.addAction (LokaliseDefines.INTENT_TRANSLATION_UPDATE_FAILED);
myIntentFilter.addAction (LokaliseDefines.INTENT_TRANSLATION_UPDATE_NOT_NEEDED);

BroadcastReceiver myReceiver = new BroadcastReceiver() {
@Override
onReceive(Context Context, Intent Intent) {
String action = intent.getAction();
如果(action.equals (LokaliseDefines.INTENT_TRANSLATIONS_UPDATED)) {
lokalisedefinitions . long olbundleid = intent.getLongExtraEXTRA_BUNDLE_VERSION_OLD, 0);
lokalisedefinitions . long newBundleId = intent.getLongExtraEXTRA_BUNDLE_VERSION_NEW, 0);

/ /做某事
} else if(action.equals(lokalisedefinitions . intent_translation_update_failed)) {
LokaliseUpdateError错误= (LokaliseUpdateError) intent.getSerializableExtra(lokalisedefinitions . extra_update_error);

/ /做某事
} else if(action.equals(lokalisedefinitions . intent_translation_update_not_needed)) {
/ /做某事


};

@Override
onResume() {
super.onResume ();
registerReceiver (myReceiver myIntentFilter);


@Override
受保护的无效onPause() {
super.onPause ();
unregisterReceiver (myReceiver);

...

兼容ViewPump

如果在项目中使用ViewPump,则可以将拦截器的列表传递给Lokalise.init ()方法。

...
List postInterceptors = new ArrayList<>();
preInterceptors = new ArrayList<>();

Lokalise。init(this, "","<项目id>">, postInterceptors, preInterceptors);
...

请注意,您需要使用LokaliseContextWrapper而不是ViewPumpContextWrapper为了让一切正常运转。

管理包

出版的变化

Lokalise支持包的生产版本和预发布版本,并允许您保留每个包的不同版本。

当bundle生成时,它将带你到项目设置/ Lokalise Android SDK部分。在bundle发布到生产或预发布之前打开相关开关。

打击保存更改申请。

包冻结

Lokalise提供了在特定应用版本上冻结特定包的选项。正如你在下面的截图中所看到的,“Test_01”包被分配给构建从0到6的应用,而最新的包被分配给构建从7到12的应用。Lokalise Android SDK 1.3及以上版本支持此功能。

移动SDK的见解

我们在项目的统计页面上提供了全面的使用统计。这些报告包括:

  • 每日独立用户(范围)

  • 每日请求(范围)

  • 应用程序语言(所有时间)

  • 设备语言(所有时间)

  • 设备-应用程序语言对(所有时间)

  • 应用程序语言(每周比较)

  • 每月活跃用户

用户隐私

我们不会追踪您的应用程序用户的个人数据。SDK收集关于用户的有限信息,以提供Mobile SDK Insights。这包括设备语言和应用程序语言。

这回答了你的问题吗?