Amazon Musicの革新的なローカライズアプローチ

昨日、 Amazon Musicアプリケーション(50,000,000回以上のインストール)をインストールしましたが、開始できませんでした。 そして、これは私が彼らの主要な加入者であり、米国に住んでいるという事実にもかかわらずです。



次のメッセージが画面に表示されました。















はい、電話の設定にはロシア語があります。 しかし、ドーナツ(1.6)以降のAndroidの使用と開発の記憶では、そのようなものを見たことはありません。 ユーザーがスマートフォンのシステム設定を変更するまで、ユーザーにアプリケーションを実行する機会を与えたくない理由がまだわかりません。





そのような禁止がどのように指示される可能性があるかについて、誰にもアイデアがありますか?



PS Androidで使用可能な翻訳と言語が一致しない場合、 res/ values フォルダーからstrings.xmlが自動的に選択されるという開発者の無知を信じていません。



05/02更新:
kolipassのアドバイスで、電話からapkを引き出しました(Es File Explorerを使用)。 次に、 オンラインの逆コンパイラを使用して、ソースをかなりうまく解凍しました(プロガードをまったく使用していないようです)。 しかし、 strings.xmlを使用すると、彼は賢く、ほとんどの場合、 compatライブラリgoogle playサービスからの翻訳を含めました

したがって、古き良きapktoolデコンパイラーを起動する必要がありましたが、 res / valuesフォルダーに独自のstrings.xmlがあり、すべての英語のローカライズがそこにあることが判明しました。 この場合、 values-ru dadにはロシア語も含まれています!



しかし、その後、 BaseActivity.javaファイルMarket.javaファイルからすべてが明らかになりました。



class BaseActivity { ... if (!Market.isCountrySupported(getResources())) { String s = TAG; Object aobj[] = new Object[1]; aobj[0] = getClass().getName(); Log.warning(s, "Finishing %s due to unsupported locale", aobj); startActivity(InvalidLocaleActivity.getIntent(this)); finish(); } } class Market { static { US = new Market("US", 0, "ATVPDKIKX0DER", "ATVPDKIKX0DER", new String[] { "US" }); UK = new Market("UK", 1, "A1F83G8C2ARO7P", "A1F83G8C2ARO7P", new String[] { "UK", "GB" }); GERMANY = new Market("GERMANY", 2, "A1PA6795UKMFR9", "A1PA6795UKMFR9", new String[] { "DE", "AT", "CH" }); FRANCE = new Market("FRANCE", 3, "A13V1IB3VIYZZH", "A13V1IB3VIYZZH", new String[] { "FR" }); SPAIN = new Market("SPAIN", 4, "A1RKKUPIHCS9HS", "AJZF8LZ1EJVJN", new String[] { "ES" }); ITALY = new Market("ITALY", 5, "APJ6JRA9NG5V4", "A3HOBANJMCMD83", new String[] { "IT" }); JAPAN = new Market("JAPAN", 6, "A1VC38T7YXB528", "A1VC38T7YXB528", new String[] { "JP" }); CANADA = new Market("CANADA", 7, "A2EUQ1WTGCTBG2", "A2EUQ1WTGCTBG2", new String[] { "ZH" }); CHINA = new Market("CHINA", 8, "AAHKV2X7AFYLW", "AAHKV2X7AFYLW", new String[] { "CN" }); BRAZIL = new Market("BRAZIL", 9, "A2Q3Y263D00KWC", "A2Q3Y263D00KWC", new String[] { "BR" }); INDIA = new Market("INDIA", 10, "A21TJRUUN4KGV", "A2XZLSVIQ0F4JT", new String[] { "IN" }); MEXICO = new Market("MEXICO", 11, "A1AM78C64UM0Y8", "A3P3J5A7D2ZVXI", new String[] { "MX" }); AUSTRALIA = new Market("AUSTRALIA", 12, "A39IBJ37TRP1C6", "A1RNPCQ4K8U27I", new String[] { "AU" }); RUSSIA = new Market("RUSSIA", 13, "AD2EMQ3L3PG8S", "A38NPJYVS5YHNH", new String[] { "RU" }); NETHERLANDS = new Market("NETHERLANDS", 14, "A1805IZSGTT6HS", "A1M3WC0SJ3A38T", new String[] { "NL" }); Market amarket[] = new Market[15]; amarket[0] = US; amarket[1] = UK; amarket[2] = GERMANY; amarket[3] = FRANCE; amarket[4] = SPAIN; amarket[5] = ITALY; amarket[6] = JAPAN; amarket[7] = CANADA; amarket[8] = CHINA; amarket[9] = BRAZIL; amarket[10] = INDIA; amarket[11] = MEXICO; amarket[12] = AUSTRALIA; amarket[13] = RUSSIA; amarket[14] = NETHERLANDS; $VALUES = amarket; DEFAULT_MARKET = US; Market market = US; Market amarket1[] = new Market[6]; amarket1[0] = UK; amarket1[1] = GERMANY; amarket1[2] = FRANCE; amarket1[3] = SPAIN; amarket1[4] = ITALY; amarket1[5] = JAPAN; SUPPORTED_MARKETS = EnumSet.of(market, amarket1); LANGUAGE_TO_MARKET = new HashMap(16); LANGUAGE_TO_MARKET.put("en", US); LANGUAGE_TO_MARKET.put("de", GERMANY); LANGUAGE_TO_MARKET.put("fr", FRANCE); LANGUAGE_TO_MARKET.put("es", SPAIN); LANGUAGE_TO_MARKET.put("it", ITALY); LANGUAGE_TO_MARKET.put("ja", JAPAN); LANGUAGE_TO_MARKET.put("zh", CHINA); LANGUAGE_TO_MARKET.put("ru", RUSSIA); LANGUAGE_TO_MARKET.put("nl", NETHERLANDS); Market amarket2[] = values(); int i = (int)(0.5F + (float)(2 * amarket2.length) / 0.75F); int j = (int)(0.5F + (float)amarket2.length / 0.75F); OBFUSCATED_MARKET_TO_MARKET = new HashMap(i); COUNTRY_TO_MARKET = new HashMap(j); int k = amarket2.length; for (int l = 0; l < k; l++) { Market market1 = amarket2[l]; OBFUSCATED_MARKET_TO_MARKET.put(market1.mProdObfuscatedMarket, market1); OBFUSCATED_MARKET_TO_MARKET.put(market1.mDevoObfuscatedMarket, market1); String as[] = market1.mCountryCodes; int i1 = as.length; for (int j1 = 0; j1 < i1; j1++) { String s = as[j1]; COUNTRY_TO_MARKET.put(s.toUpperCase(Locale.ROOT), market1); } } } ... public static boolean isCountrySupported(Resources resources) { Locale locale = resources.getConfiguration().locale; Market market = (Market)COUNTRY_TO_MARKET.get(locale.getCountry().toUpperCase(Locale.ROOT)); return SUPPORTED_MARKETS.contains(market); } }
      
      







一般に、私のマーケットでは、彼らはアプリケーションをロシア語ロケールで実行させないことに決めました。 しかし、私はまだ理由を理解していませんか?



09/03更新:
最後に、Amazonはローカライズを修正し、「厄介なバグ」であることを認めました。










All Articles