2016-06-13 4 views
3

Gibt es eine Möglichkeit, automatisch Accept-Language Header basierend auf OS-Einstellungen hinzuzufügen?Nachrüstung 2: Standard Accept-Sprache

Zum Beispiel: Ich habe Englisch (US) als mein System lang, wäre es toll, in einiger einfachen Art und Weise zu haben Accept-Language: en-us hinzugefügt ...

Auch ermöglicht Android N multiple locales in settings zu wählen, so wäre es toll, wie: Accept-Language: da, en-gb;q=0.8, en;q=0.7

Danke.

Antwort

0

wenn Sie

ausgewählte Sprache des Geräts sehen wollen

Verwenden Sie diesen Code:

Locale.getDefault().getDisplayLanguage(); 

Hope this helfen! Prost!

2

Wenn Sie Ihr Retrofit-Objekt erstellen, können Sie die Header anpassen, die von der Netzwerkbibliothek OkHttp gesendet werden. Betrachten Sie das folgende Beispiel:

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(); 

Im „Ihr Wert“ string Sie den Wert Ihrer Kopf zwicken können und zum Beispiel setzen: builder.addHeader("Accept-Language", Locale.getDefault().getDisplayLanguage())

+0

Ich verstehe, dass ich 'Interceptor' verwenden kann, um dieses Ergebnis zu erzielen. Ich dachte nur, dass es einen einfacheren Weg gibt. Problem ist nicht nur beim Erstellen eines neuen Interceptors, sondern auch beim Formatieren von Sprachcode, da 'Locale.getDefault(). GetDisplayLanguage()' einen ** Anzeigenamen ** zurückgibt, nicht den, der [BCP 47] entspricht (http: // www .w3.org/International/artikel/sprache-tags /). Aber danke! – oleynikd

4

Für jeden, der fragt sich ich mit diesem Interceptor endete:

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(); 
    } 
} 

Dann können Sie es gerne verwenden:

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