改造2:默认接受语言

时间:2016-06-13 13:18:59

标签: android retrofit2

有没有办法根据操作系统设置自动添加Accept-Language标题?

例如:我有英语(美国)作为我的系统语言,以一种简单的方式添加Accept-Language: en-us会很棒......

此外,Android N允许选择multiple locales in settings,因此使用它会很棒:Accept-Language: da, en-gb;q=0.8, en;q=0.7

感谢。

5 个答案:

答案 0 :(得分:4)

创建Retrofit对象时,您可以自定义OkHttp网络库发送的标头。 请考虑以下示例:

Retrofit ret = new Retrofit.Builder()
                .client(new OkHttpClient.Builder()
                .addNetworkInterceptor(new Interceptor() {

                    @Override
                    public Response intercept(Chain chain) throws IOException {
                        Request.Builder builder = chain.request().newBuilder();

                        builder.addHeader("Accept-Language", "Your value");
                        Request request = builder.build();
                        Response response = chain.proceed(request);

                        return response;
                    }
                }).build())
                .build();

在“您的值”字符串中,您可以调整标题的值,例如:builder.addHeader("Accept-Language", Locale.getDefault().getDisplayLanguage())

答案 1 :(得分:4)

如果有人正在寻找一种解决方案,该解决方案如何提供首选语言列表作为接受语言,那么在Android中,这是解决方法。 注意:设置首选语言列表仅在API级别24起可用

  public class AcceptLanguageHeaderInterceptor implements Interceptor {
    @Override
    public Response intercept(Chain chain) throws IOException {
      Request originalRequest = chain.request();
      Request requestWithHeaders = originalRequest.newBuilder()
        .header("Accept-Language", getLanguage())
        .build();
      return chain.proceed(requestWithHeaders);
    }

    private String getLanguage() {
      if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        return LocaleList.getDefault().toLanguageTags();
      } else {
        return Locale.getDefault().getLanguage();
      }
    }
  }

答案 2 :(得分:3)

如果您使用的是API 21,则可以使用Locale.toLanguageTag()

toLanguageTag
Added in API level 21
String toLanguageTag ()
Returns a well-formed IETF BCP 47 language tag representing this locale.

示例代码:

private class AcceptLanguageInterceptor(val locale: Locale) : Interceptor {

        @Throws(IOException::class)
        override fun intercept(chain: Interceptor.Chain): okhttp3.Response = chain.proceed(chain.request().newBuilder()
                .header("Accept-Language", locale.toLanguageTag())
                .build())
}

答案 3 :(得分:0)

Android API 24引入了多语言环境和LocaleList API。这是我的代码段,将其考虑在内并为Accept-Langauge标头创建了一个字符串,

fun getAcceptedLanguageHeaderValue(): String {
     return LocaleListCompat.getAdjustedDefault().toLanguageTags()
                .map { it.toLanguageTag() }
                .reduce { accumulator, languageTag ->
                    weight -= 0.001F
                    "$accumulator,$languageTag;q=$weight"
                }
}

输出示例:“ en-US,ta-IN; q = 0.999,it-IT; q = 0.998”

注意:getAdjustedDefault()将默认语言环境添加为列表中的第一项,然后是用户偏好的语言环境(按优先级排序)。

拦截器将是将这个Accept-Language头添加到所有网络请求中的一种非常好的方法。

有关多语言环境的更多信息-https://developer.android.com/guide/topics/resources/multilingual-support

答案 4 :(得分:-1)

如果您想查看设备的所选语言

使用此代码:

Locale.getDefault().getDisplayLanguage();

希望这会有所帮助!干杯!