Unikaj Androida Lint narzeka na nieprzetłumaczony ciąg


119

czy można określić, że ciągi znaków w pliku w value-* katalogach celowo nie są tłumaczone na inne języki? Mam kilka ciągów znaków, które są wspólne dla wszystkich języków i nie wymagają tłumaczenia, więc utworzyłem unlocalized-strings.xmlplik w valueskatalogu. Uruchamiam Android Lint w celu sprawdzenia problemów. Ciągle mówi, że brakuje niektórych tłumaczeń. Nie chcę aby wyłączyć to sprawdzanie w całym projekcie, chciałbym to wyłączyć tylko w niektórych plikach XML .. czy to możliwe?

"title_widget_updater_service" is not translated in de, en, en-rUS, it

Issue: Checks for incomplete translations where not all strings are translated
Id: MissingTranslation

If an application has more than one locale, then all the strings declared in one language     
should also be translated in all other languages.

By default this detector allows regions of a language to just provide a subset of the 
strings and fall back to the standard language strings. You can require all regions to 
provide a full translation by setting the environment variable 
ANDROID_LINT_COMPLETE_REGIONS.

W jaki sposób można to zdefiniowany obszar z unlocalized strun?


Odpowiedzi:


159

Nie wiem, jak zignorować cały plik, ale możesz to zrobić ciąg po łańcuchu, używając:

<string name="hello" translatable="false">hello</string>

1
to daje „nieprzekładalne zasoby powinny być zdefiniowane tylko w podstawowych wartościach / folderze.
anon58192932

2
I to się zgadza. Jeśli nie chcesz, aby ciąg był tłumaczony, powinieneś zdefiniować go tylko w „wartościach bazowych / folderze”, co oznacza, że ​​nie wpisuj ciągu w przetłumaczonych wartościach / folderze.
Luis

1
Odpowiedź @CyrilLeroux jest bardziej wyczerpująca i powinna być oznaczona jako poprawna, ponieważ pokazuje opcję umieszczenia wszystkich nieprzetłumaczalnych ciągów w jednym pliku.
Yoel Gluschnaider

To działa, ale nie sądzę, aby najlepszym sposobem rozwiązania problemu było oznaczenie łańcucha, który można przetłumaczyć jako „niemożliwy do przetłumaczenia”, tylko po to, aby usunąć komunikat o błędzie. Po prostu postanowiliśmy nie tłumaczyć na razie niektórych ciągów. Ale to nie znaczy, że nie można ich przetłumaczyć.
Zili FENG

Chcę umieścić ciąg tylko w jednym języku, a jest to język niemiecki (de) (nie domyślny angielski). Włożyłem go tam i kiedy próbowałem wydać kompilację, dostałem błąd. Co robić w takim przypadku?
Aanal Mehta

228

Jest to ignoreatrybut toolsprzestrzeni nazw w pliku ciągów znaków, jak poniżej:

<?xml version="1.0" encoding="utf-8"?>
<resources
  xmlns:tools="http://schemas.android.com/tools"
  tools:ignore="MissingTranslation" >

  <!-- your strings here; no need now for the translatable attribute -->

</resources>

<resources tools: ignore = "MissingTranslation"> daje mi błąd podczas analizowania XML: niepowiązany prefiks
anon58192932

5
To działa dobrze, ale musiałem przejść Project->Cleanostatecznie, aby usunąć błędy.
Xonya

Przynajmniej eclipse nie zmusiło nas do przetłumaczenia wszystkiego, w tym dziwnych folderów z ciągami znaków, takich jak ids.xml i analytics.xml.
Androidcoder,

2
Powinno to być zaakceptowaną odpowiedzią na rozwiązanie wszystkich problemów w zaledwie 2 wierszach kodu.
nhoxbypass

153

Dodaj do build.gradle:

android {
     lintOptions {
        disable 'MissingTranslation'
    }
}

7
Jedyne możliwe rozwiązanie do radzenia sobie z automatycznie generowanymi zasobami ciągów. Dzięki.
SqueezyMo

6
nie, nie powinno, na podstawie pytania: „Nie chcę wyłączać tego sprawdzania w całym projekcie”
Yoel Gluschnaider

@Giraffe Lion powinieneś zamieścić to jako inne pytanie i odpowiedzieć sobie samodzielnie.Dziękuję za rozwiązanie, wcześniej musiałem to wyłączyć ręcznie.
Diljeet

1
To zablokowało całą kontrolę, której należy unikać, jeśli to możliwe. Nie mogę zrozumieć, dlaczego ma tyle głosów.
tasomaniac

23

Znam 3 sposoby:

Aby zastosować wartość modyfikacji według wartości: Ustaw atrybut translatable="false"w <string>definicji:

<string name="account_setup_imap" translatable="false">IMAP</string>

Jeśli masz dużo zasobów, które nie powinny być tłumaczone, możesz umieścić je w pliku o nazwie, donottranslate.xmla lint uzna je wszystkie za nieprzekładalne.

Inny sposób, który odkryłem podczas przeglądania źródeł projektów Hackers Keyboard :
Możesz dodać prefiks donottranslate-do swojego pliku zasobów. Podobnie jak w poprzednim przykładzie, lint weźmie pod uwagę wszystkie z nich zasoby nieprzekładalne.
W twoim przypadku można zastąpić unlocalized-strings.xmlprzez donottranslate-strings.xml. Wygląda na to, że działa, ale nie znalazłem żadnej dokumentacji do tej wskazówki.

Zobacz: Witryna projektu Android Tools: ciągi nieprzekładalne


Czy to prawda, że ​​jeśli umieścimy nasz ciąg w pliku donottranlate.xml, nie musimy już dodawać translatable="false"tagu?
Yuchen Zhong

Tak. W całym projekcie używam plików donottranslate-strings.xml. Działa w porządku. Spróbuj, to bardzo przydatne!
Cyril Leroux

12

A oto rozwiązanie Android Studio do wyłączania tego krytycznego błędu Lint:

wprowadź opis obrazu tutaj


2
Może to być irytujący błąd, ale może cię uratować, gdy przypadkowo zapomnisz przetłumaczyć nowy ciąg na jeden z języków aplikacji.
Elad Nava,


2

Utwórz plik zasobów z nazwą pliku zaczynającą się od „ donottranslate ” (np. Donottranslate.xml , donottranslate_urls.xml itp.), A lint całkowicie zignoruje jego ciągi znaków podczas sprawdzania brakujących tłumaczeń.


1

Jeśli chcesz wyłączyć sprawdzanie kłaczków w brakującym tłumaczeniu, możesz iść

"Project Properties -> Android Lint Preferences -> Select MissingTranslation -> Swtich To Ignore In Severity",

ma nadzieję, że pomoże to innym, ponieważ właśnie napotykam ten problem :)


2
Czy jest na to sposób w Android Studio? Nie mogłem znaleźć ustawień związanych z
lintem

1

Innym sposobem na to jest dodanie swojego ciągu znaków do pliku gradle za pomocą resValuelub buildConfigField. Coś w tym stylu:

buildTypes {
    debug {
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        buildConfigField "string", "app_name1", "App Name"
        resValue "string", "app_name2", "App Name"
    }
}

Zastosowania:

// buildConfigField
BuildConfig.APP_NAME1

// resValue
getString(R.string.app_name2)

0

Aby uniknąć ostrzeżeń w Android Studio, otwórz Preferencje ==> Inspekcje, odznacz „Niekompletne tłumaczenia”. Ale nie wpłynie to na kompilację Gradle.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.