【问题标题】:how to check a particular language is supported by device in android如何检查android中的设备是否支持特定语言
【发布时间】:2016-03-03 04:47:08
【问题描述】:

Locale.getAvaialableLocales() 为您提供设备中可用的所有语言环境。 但设备安装的字体仅支持其中一些可用的语言环境

我用Resources.getSystem().getAssets().getLocales() 它返回 "settings-> Language & Inputs -> Language" 选项中可用的列表语言。

但该设备还能够支持更多“设置->语言和输入->语言”中不存在的语言。

例如 在我的 Karbon 设备 Resources.getSystem().getAssets().getLocales() 返回 只有“印地语”和“旁遮普语”作为支持语言。 但是,当使用“Hike”应用程序选择“Telugu”语言时,此设备可以正常工作。

那么有什么方法可以检查设备是否支持特定语言。

【问题讨论】:

    标签: android


    【解决方案1】:

    好问题 Siva。

    到目前为止,很多人一直在讨论同样的事情,但没有任何答案。

    google groups discussion is here

    Locale.getAvailableLocales() 都不是 也不是Resources.getSystem().getAssets().getLocales() 为您提供一组正确的语言环境,您可以依赖这些语言环境来支持应用程序语言。

    原因是,

    它们都为您提供了该操作系统支持的所有语言环境的列表。操作系统可能支持超过 100 种语言,但设备制造商可能不会将所有这些语言字体(ttf 文件)放在 /system/fonts/(或任何系统字体目录)中,只是为了节省 ROM 内存。他们所做的是,因为他们制作了特定于区域的 rom,所以他们只放置与该特定区域相关的字体(语言环境)。这就是您在 America ROM 中找不到印度地区语言的原因。

    解决这个问题的最好方法是, 在您的应用资产中包含您想要支持的任何语言的所有 ttf 文件, 就像我们支持不同的语言字符串一样。

    但要注意字体许可等等。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      我做了以下方式:

      调用方法如下:

      isSupported(context,"English") //here "English" is the hardcoded string in specific language like Hindi,Urdu,panjabi .....etc.
      

      如果设备能够绘制特定语言字体,则支持的方法将返回 true,否则返回 false。

      public static boolean isSupported(Context context, String text) {
              final int WIDTH_PX = 200;
              final int HEIGHT_PX = 80;
      
              int w = WIDTH_PX, h = HEIGHT_PX;
              Resources resources = context.getResources();
              float scale = resources.getDisplayMetrics().density;
              Bitmap.Config conf = Bitmap.Config.ARGB_8888;
              Bitmap bitmap = Bitmap.createBitmap(w, h, conf); // this creates a MUTABLE bitmap
              Bitmap orig = bitmap.copy(conf, false);
              Canvas canvas = new Canvas(bitmap);
              Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
              paint.setColor(Color.rgb(0, 0, 0));
              paint.setTextSize((int) (14 * scale));
      
              // draw text to the Canvas center
              Rect bounds = new Rect();
              paint.getTextBounds(text, 0, text.length(), bounds);
              int x = (bitmap.getWidth() - bounds.width()) / 2;
              int y = (bitmap.getHeight() + bounds.height()) / 2;
      
              canvas.drawText(text, x, y, paint);
              boolean res = !orig.sameAs(bitmap);
              orig.recycle();
              bitmap.recycle();
              return res;
          }
      

      希望对你有帮助!

      【讨论】:

      • 很好的答案,这有助于我找出设备中不受支持的语言环境。所以我的应用现在可以支持多语言了
      • @Vikas Tiwari,请解释一下它是如何工作的以及它在不同安卓操作系统版本上的稳定性。
      • 这个答案缺乏解释
      【解决方案3】:

      使用此功能检查您的设备是否支持特定语言环境:

      boolean isLocaleAvailable(Locale locale){
          Locale defaultLocale = Locale.getDefault();
      
          //update default locale with mLocale
          Locale.setDefault(locale);
      
          String str = (String) DateUtils.getRelativeTimeSpanString(
                  Calendar.getInstance().getTimeInMillis() - 1000,
                  Calendar.getInstance().getTimeInMillis(), 0);
      
          //revert locale back to default
          Locale.setDefault(defaultLocale);
      
          return  !str.startsWith("-");
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-14
        相关资源
        最近更新 更多