Translations + rate us dialog

This commit is contained in:
serso 2016-03-01 10:50:38 +01:00
parent 6f685f4a2a
commit 6427c91953
39 changed files with 195 additions and 57 deletions

View File

@ -1,15 +1,15 @@
package org.solovyev.android.calculator;
import android.content.Context;
import android.content.ActivityNotFoundException;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.net.Uri;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.v7.app.AlertDialog;
import android.support.v7.app.AppCompatActivity;
import android.text.method.LinkMovementMethod;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.TextView;
import org.solovyev.android.Android;
import org.solovyev.android.calculator.wizard.CalculatorWizards;
import org.solovyev.android.wizard.Wizard;
@ -20,7 +20,9 @@ import javax.inject.Named;
import javax.inject.Singleton;
import static org.solovyev.android.calculator.release.ReleaseNotes.hasReleaseNotes;
import static org.solovyev.android.wizard.WizardUi.*;
import static org.solovyev.android.wizard.WizardUi.continueWizard;
import static org.solovyev.android.wizard.WizardUi.createLaunchIntent;
import static org.solovyev.android.wizard.WizardUi.startWizard;
@Singleton
public class StartupHelper {
@ -47,7 +49,7 @@ public class StartupHelper {
editor.apply();
}
private void handleOnMainActivityOpened(@NonNull AppCompatActivity activity, @NonNull SharedPreferences.Editor editor, int opened) {
private void handleOnMainActivityOpened(@NonNull final AppCompatActivity activity, @NonNull SharedPreferences.Editor editor, int opened) {
final int currentVersion = Android.getAppVersionCode(activity);
final Wizards wizards = App.getWizards();
final Wizard wizard = wizards.getWizard(CalculatorWizards.FIRST_TIME_WIZARD);
@ -72,17 +74,28 @@ public class StartupHelper {
}
}
if (opened > 30 && !UiPreferences.rateUsShown.getPreference(uiPreferences)) {
final LayoutInflater layoutInflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
final View view = layoutInflater.inflate(R.layout.feedback, null);
final TextView feedbackTextView = (TextView) view.findViewById(R.id.feedbackText);
feedbackTextView.setMovementMethod(LinkMovementMethod.getInstance());
final AlertDialog.Builder builder = new AlertDialog.Builder(activity, App.getTheme().alertDialogTheme).setView(view);
builder.setPositiveButton(android.R.string.ok, null);
if (shouldShowRateUsDialog(opened)) {
final AlertDialog.Builder builder = new AlertDialog.Builder(activity, App.getTheme().alertDialogTheme);
builder.setPositiveButton(R.string.cpp_rateus_ok, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
try {
final Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse("https://market.android.com/details?id=org.solovyev.android.calculator"));
activity.startActivity(intent);
} catch (ActivityNotFoundException ignored) {
}
}
});
builder.setNegativeButton(R.string.cpp_rateus_cancel, null);
builder.setMessage(activity.getString(R.string.cpp_rateus_message, activity.getString(R.string.c_app_name)));
builder.setTitle(activity.getString(R.string.cpp_rateus_title, activity.getString(R.string.c_app_name)));
builder.create().show();
UiPreferences.rateUsShown.putPreference(editor, true);
}
}
private boolean shouldShowRateUsDialog(int opened) {
return opened > 30 && !UiPreferences.rateUsShown.getPreference(uiPreferences);
}
}

View File

@ -1,36 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
~ Copyright 2013 serso aka se.solovyev
~
~ Licensed under the Apache License, Version 2.0 (the "License");
~ you may not use this file except in compliance with the License.
~ You may obtain a copy of the License at
~
~ http://www.apache.org/licenses/LICENSE-2.0
~
~ Unless required by applicable law or agreed to in writing, software
~ distributed under the License is distributed on an "AS IS" BASIS,
~ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
~ See the License for the specific language governing permissions and
~ limitations under the License.
~
~ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~ Contact details
~
~ Email: se.solovyev@gmail.com
~ Site: http://se.solovyev.org
-->
<LinearLayout xmlns:a="http://schemas.android.com/apk/res/android"
a:layout_width="fill_parent"
a:layout_height="fill_parent">
<TextView
a:id="@+id/feedbackText"
style="@style/CppText.About"
a:layout_width="fill_parent"
a:layout_height="fill_parent"
a:text="@string/c_feedback_text" />
</LinearLayout>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">تقييم %1$s</string>
<string name="cpp_rateus_message">إذا كنت تستمتع بـ %1$s، يرجى أن تستغرق لحظة وتعطينا تقييمًا بخمس نجوم في Google Play.</string>
<string name="cpp_rateus_ok">ضع تقييمًا الآن</string>
<string name="cpp_rateus_cancel">لا، شكرًا</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Ohodnotit aplikaci %1$s</string>
<string name="cpp_rateus_message">Pokud se vám aplikace %1$s líbí, prosím věnujte nám okamžik a udělte nám pětihvězdičkové hodnocení na Google Play.</string>
<string name="cpp_rateus_ok">Ohodnotit nyní</string>
<string name="cpp_rateus_cancel">Ne, díky</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">%1$s bewerten</string>
<string name="cpp_rateus_message">Wenn Ihnen %1$s gefällt, würden wir uns über Ihre Fünf-Sterne-Bewertung in Google Play freuen.</string>
<string name="cpp_rateus_ok">Jetzt bewerten</string>
<string name="cpp_rateus_cancel">Nein danke</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Califica %1$s</string>
<string name="cpp_rateus_message">Si disfrutas usar %1$s, por favor dedica un instante y regálanos una calificación de cinco estrellas en Google Play.</string>
<string name="cpp_rateus_ok">Danos tu calificación</string>
<string name="cpp_rateus_cancel">No, gracias</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Arvostele %1$s</string>
<string name="cpp_rateus_message">Jos pidät %1$s -sovelluksesta, anna meille viiden tähden arvostelu Google Play -palvelussa.</string>
<string name="cpp_rateus_ok">Arvostele nyt</string>
<string name="cpp_rateus_cancel">Ei kiitos</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Noter %1$s</string>
<string name="cpp_rateus_message">Si vous appréciez %1$s, prenez un moment et donnez nous 5 étoiles dans Google Play.</string>
<string name="cpp_rateus_ok">Noter maintenant</string>
<string name="cpp_rateus_cancel">Non, merci</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Valuta %1$s</string>
<string name="cpp_rateus_message">Se ti piace %1$s, per favore dedica un minuto del tuo tempo per attribuirci 5 stelle su Google Play.</string>
<string name="cpp_rateus_ok">Vota adesso</string>
<string name="cpp_rateus_cancel">No, grazie</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">%1$s を評価する</string>
<string name="cpp_rateus_message">%1$s を楽しまれている場合には、Google Play での評価にご協力ください。</string>
<string name="cpp_rateus_ok">今すぐ評価する</string>
<string name="cpp_rateus_cancel">今回はしない</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Waardeer %1$s</string>
<string name="cpp_rateus_message">Als je %1$s leuk vindt, neem dan even de tijd en geef ons een beoordeling van vijf sterren bij Google Play.</string>
<string name="cpp_rateus_ok">Nu beoordelen</string>
<string name="cpp_rateus_cancel">Nee, bedankt</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Oceń program %1$s</string>
<string name="cpp_rateus_message">Jeśli podoba Ci się %1$s, poświęć chwilę i daj nam pięć gwiazdek w usłudze Google Play.</string>
<string name="cpp_rateus_ok">Oceń ją teraz</string>
<string name="cpp_rateus_cancel">Nie, dziękuję</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Avaliar o %1$s</string>
<string name="cpp_rateus_message">Se você gosta do %1$s, atribua a classificação de cinco estrelas no Google Play.</string>
<string name="cpp_rateus_ok">Classificar agora</string>
<string name="cpp_rateus_cancel">Não, obrigado</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Avalie %1$s</string>
<string name="cpp_rateus_message">Se gosta de %1$s, por favor avalie-nos com cinco estrelas na Google Play.</string>
<string name="cpp_rateus_ok">Avaliar agora</string>
<string name="cpp_rateus_cancel">Não, obrigado</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Оцените %1$s</string>
<string name="cpp_rateus_message">Если вам нравится %1$s, отвлекитесь на минутку и поставьте нам 5 звездочек в Google Play.</string>
<string name="cpp_rateus_ok">Оценить</string>
<string name="cpp_rateus_cancel">Нет, спасибо</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">%1$s\&apos;yi değerlendir</string>
<string name="cpp_rateus_message">%1$s\&apos;yı sevdiyseniz, lütfen birkaç dakikanızı ayırın ve bize Google Play\&apos;de beş yıldızlı bir puan verin.</string>
<string name="cpp_rateus_ok">Hemen değerlendirin</string>
<string name="cpp_rateus_cancel">Hayır, teşekkürler</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Xếp hạng %1$s</string>
<string name="cpp_rateus_message">Nếu bạn thích %1$s, vui lòng dành thời gian và xếp hạng chúng tôi 5 sao trong Google Play.</string>
<string name="cpp_rateus_ok">Xếp hạng nó bây giờ</string>
<string name="cpp_rateus_cancel">Không, cảm ơn</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">给 %1$s 评分</string>
<string name="cpp_rateus_message">如果您喜欢 %1$s请抽出片刻在 Google Play 中给我们五星评分。</string>
<string name="cpp_rateus_ok">立即给它评分</string>
<string name="cpp_rateus_cancel">忍泪拒绝</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">為 %1$s 評分</string>
<string name="cpp_rateus_message">如果你喜歡 %1$s請花點時間在 Google Play 上給我們五顆星評價。</string>
<string name="cpp_rateus_ok">現在就去評分</string>
<string name="cpp_rateus_cancel">不用了,謝謝</string>
</resources>

View File

@ -0,0 +1,7 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="cpp_rateus_title">Rate %1$s</string>
<string name="cpp_rateus_message">If you enjoy %1$s, please take a moment and give us a five-star rating in Google Play.</string>
<string name="cpp_rateus_ok">Rate it now</string>
<string name="cpp_rateus_cancel">No, thanks</string>
</resources>

View File

@ -49,6 +49,8 @@ public class Android {
public static void main(String... args) throws Exception {
final Options options = new Options();
options.addOption(Option.builder("aosp").hasArg().desc("Local location of aosp project").required().build());
options.addOption(Option.builder("project").hasArg().desc("Local location of Android project").build());
options.addOption(Option.builder("resources").hasArg().desc("String identifiers to be copied").build());
final CommandLineParser parser = new DefaultParser();
final CommandLine commandLine = parser.parse(options, args);
@ -59,19 +61,43 @@ public class Android {
final File aospContacts = makeInputDirectory(aosp + "/platform/packages/apps/contacts");
final File aospCalculator = makeInputDirectory(aosp + "/platform/packages/apps/calculator");
final File project;
if (commandLine.hasOption("project")) {
project = makeInputDirectory(commandLine.getOptionValue("project"));
} else {
project = null;
}
final List<TranslationLink> projectLinks = new ArrayList<>();
if (commandLine.hasOption("resources")) {
for (String resource : commandLine.getOptionValue("resources").split(",")) {
final int i = resource.indexOf("-");
if(i >= 0) {
projectLinks.add(new TranslationLink(resource.substring(0, i), "cpp_" + resource.substring(i + 1, resource.length())));
} else {
projectLinks.add(new TranslationLink(resource, "cpp_" + resource));
}
}
}
final File outDir = new File("build/translations/res");
Utils.delete(outDir);
outDir.mkdirs();
translate(outDir, "aosp", new TranslationDef(aospSettings, settingsLinks), new TranslationDef(aospCalendar, calendarLinks), new TranslationDef(aospContacts, contactsLinks), new TranslationDef(aospCalculator, calculatorLinks));
if (project != null) {
translate(outDir, "other", new TranslationDef(project, projectLinks));
}
}
private static void translate(File outDir, String outPostfix, TranslationDef... translationDefs) throws Exception {
List<String> languageLocales = new ArrayList<>(Utils.languageLocales);
languageLocales.add("");
for (String languageLocale : languageLocales) {
Resources translations = new Resources();
translate(readResources(aospSettings, languageLocale), translations, settingsLinks);
translate(readResources(aospCalendar, languageLocale), translations, calendarLinks);
translate(readResources(aospContacts, languageLocale), translations, contactsLinks);
translate(readResources(aospCalculator, languageLocale), translations, calculatorLinks);
Utils.saveTranslations(translations, languageLocale, outDir, "text_imported.xml");
for (TranslationDef def : translationDefs) {
translate(readResources(def.project, languageLocale), translations, def.links);
}
Utils.saveTranslations(translations, languageLocale, outDir, "text_imported_" + outPostfix + ".xml");
}
}
@ -124,6 +150,15 @@ public class Android {
return null;
}
private static class TranslationDef {
public final File project;
public final List <TranslationLink> links;
private TranslationDef(File project, List<TranslationLink> links) {
this.project = project;
this.links = links;
}
}
private static class TranslationLink {
public final String inName;
public final String outName;