2016-06-13 2 views
3

Есть ли способ автоматически добавить заголовок Accept-Language на основе настроек ОС?Retrofit 2: Default 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

, если вы хотите, чтобы увидеть выбранного язык устройства

Используйте этот код:

Locale.getDefault().getDisplayLanguage(); 

Надеется, что это поможет! ура!

2

При создании объекта 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())

+0

Я понимаю, что я могу использовать 'Interceptor' для достижения этого результата. Я просто подумал, что есть более простой способ. Проблема заключается не только в создании нового Interceptor, но и в форматировании языкового кода, потому что 'Locale.getDefault(). GetDisplayLanguage()' будет возвращать ** отображаемое имя **, а не тот, который соответствует [BCP 47] (http: // www .w3.org/Международные/статьи/язык-теги /). Однако, спасибо! – oleynikd

4

Для тех, кто интересно, я закончил с этим Interceptor:

package common.network; 

import java.io.IOException; 
import java.util.Locale; 

import okhttp3.Interceptor; 
import okhttp3.Request; 
import okhttp3.Response; 

/** 
* Created by oleynikd on 6/9/16. 
*/ 
public class AcceptLanguageHeaderInterceptor implements Interceptor { 
    @Override 
    public Response intercept(Chain chain) throws IOException { 
     Request originalRequest = chain.request(); 
     Request requestWithHeaders = originalRequest.newBuilder() 
       .header("Accept-Language", localeToBcp47Language(Locale.getDefault())) 
       .build(); 
     return chain.proceed(requestWithHeaders); 
    } 

    /* 
    * From https://github.com/apache/cordova-plugin-globalization/blob/master/src/android/Globalization.java#L140 
    * @Description: Returns a well-formed ITEF BCP 47 language tag representing 
    * the locale identifier for the client's current locale 
    * 
    * @Return: String: The BCP 47 language tag for the current locale 
    */ 
    private static String localeToBcp47Language(Locale loc) { 
     final char SEP = '-';  // we will use a dash as per BCP 47 
     String language = loc.getLanguage(); 
     String region = loc.getCountry(); 
     String variant = loc.getVariant(); 

     // special case for Norwegian Nynorsk since "NY" cannot be a variant as per BCP 47 
     // this goes before the string matching since "NY" wont pass the variant checks 
     if(language.equals("no") && region.equals("NO") && variant.equals("NY")){ 
      language = "nn"; 
      region = "NO"; 
      variant = ""; 
     } 

     if(language.isEmpty() || !language.matches("\\p{Alpha}{2,8}")){ 
      language = "und";  // Follow the Locale#toLanguageTag() implementation 
      // which says to return "und" for Undetermined 
     }else if(language.equals("iw")){ 
      language = "he";  // correct deprecated "Hebrew" 
     }else if(language.equals("in")){ 
      language = "id";  // correct deprecated "Indonesian" 
     }else if(language.equals("ji")){ 
      language = "yi";  // correct deprecated "Yiddish" 
     } 

     // ensure valid country code, if not well formed, it's omitted 
     if (!region.matches("\\p{Alpha}{2}|\\p{Digit}{3}")) { 
      region = ""; 
     } 

     // variant subtags that begin with a letter must be at least 5 characters long 
     if (!variant.matches("\\p{Alnum}{5,8}|\\p{Digit}\\p{Alnum}{3}")) { 
      variant = ""; 
     } 

     StringBuilder bcp47Tag = new StringBuilder(language); 
     if (!region.isEmpty()) { 
      bcp47Tag.append(SEP).append(region); 
     } 
     if (!variant.isEmpty()) { 
      bcp47Tag.append(SEP).append(variant); 
     } 

     return bcp47Tag.toString(); 
    } 
} 

Затем вы можете использовать его как:

private static final OkHttpClient client = new OkHttpClient.Builder() 
      .addInterceptor(new AcceptLanguageHeaderInterceptor()) 
      .build();