有没有办法根据操作系统设置自动添加Accept-Language
标题?
例如:我有英语(美国)作为我的系统语言,以一种简单的方式添加Accept-Language: en-us
会很棒......
此外,Android N允许选择multiple locales in settings,因此使用它会很棒:Accept-Language: da, en-gb;q=0.8, en;q=0.7
感谢。
答案 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();
希望这会有所帮助!干杯!