механизм plugin.properties в затмении RCP

A0 не является допустимой последовательностью UTF-8. Ошибки, с которыми вы сталкивались, где ошибки кодирования XML, в то время как эта - ошибка кодировки символов.

A0 - это кодовая точка Unicode для неразрывного пробела. Это также кодировка iso-8859-1 и cp1252 этой кодовой точки.

Я бы порекомендовал исправить проблему у ее источника. Но если это невозможно, я бы порекомендовал использовать Encoding :: FixLatin для исправления этого нового типа ошибки (возможно, с помощью связанного скрипта fix_latin). Он правильно заменит A0 на C2 A0 (кодировка UTF-8 неразрывного пробела).

В сочетании с существующим сценарием:

perl -i -MEncoding::FixLatin=fix_latin -0777pe'
   

A0 не является допустимой последовательностью UTF-8. Ошибки, с которыми вы сталкивались, где ошибки кодирования XML, в то время как эта - ошибка кодировки символов.

A0 - это кодовая точка Unicode для неразрывного пробела. Это также кодировка iso-8859-1 и cp1252 этой кодовой точки.

Я бы порекомендовал исправить проблему у ее источника. Но если это невозможно, я бы порекомендовал использовать Encoding :: FixLatin для исправления этого нового типа ошибки (возможно, с помощью связанного скрипта fix_latin). Он правильно заменит A0 на C2 A0 (кодировка UTF-8 неразрывного пробела).

В сочетании с существующим сценарием:

[110] = fix_latin(

A0 не является допустимой последовательностью UTF-8. Ошибки, с которыми вы сталкивались, где ошибки кодирования XML, в то время как эта - ошибка кодировки символов.

A0 - это кодовая точка Unicode для неразрывного пробела. Это также кодировка iso-8859-1 и cp1252 этой кодовой точки.

Я бы порекомендовал исправить проблему у ее источника. Но если это невозможно, я бы порекомендовал использовать Encoding :: FixLatin для исправления этого нового типа ошибки (возможно, с помощью связанного скрипта fix_latin). Он правильно заменит A0 на C2 A0 (кодировка UTF-8 неразрывного пробела).

В сочетании с существующим сценарием:

[110]); utf8::decode(

A0 не является допустимой последовательностью UTF-8. Ошибки, с которыми вы сталкивались, где ошибки кодирования XML, в то время как эта - ошибка кодировки символов.

A0 - это кодовая точка Unicode для неразрывного пробела. Это также кодировка iso-8859-1 и cp1252 этой кодовой точки.

Я бы порекомендовал исправить проблему у ее источника. Но если это невозможно, я бы порекомендовал использовать Encoding :: FixLatin для исправления этого нового типа ошибки (возможно, с помощью связанного скрипта fix_latin). Он правильно заменит A0 на C2 A0 (кодировка UTF-8 неразрывного пробела).

В сочетании с существующим сценарием:

[110]); s/[^\x9\xA\xD\x20-\x{D7FF}\x{E000}-\x{FFFD}\x{10000}-\x{10FFFF}]+//g; utf8::encode(

A0 не является допустимой последовательностью UTF-8. Ошибки, с которыми вы сталкивались, где ошибки кодирования XML, в то время как эта - ошибка кодировки символов.

A0 - это кодовая точка Unicode для неразрывного пробела. Это также кодировка iso-8859-1 и cp1252 этой кодовой точки.

Я бы порекомендовал исправить проблему у ее источника. Но если это невозможно, я бы порекомендовал использовать Encoding :: FixLatin для исправления этого нового типа ошибки (возможно, с помощью связанного скрипта fix_latin). Он правильно заменит A0 на C2 A0 (кодировка UTF-8 неразрывного пробела).

В сочетании с существующим сценарием:

[110]); ' file.xml

7
задан Markus Lausberg 24 March 2009 в 08:18
поделиться

5 ответов

Хотя я понял информацию превратно... У меня была точно та же проблема. Плагин не активируется дважды, и я не могу добраться до ключа Локализации Пакета фрагментов.

Я хочу все свои языковые переводы в plugin.properties (я знаю, что это осуждено, но намного легче управлять единственным файлом).

Я (наполовину) решил проблему при помощи

public void populate(Bundle bundle) {
    String localisation = (String) bundle.getHeaders().get("Bundle-Localization");
    Locale locale = Locale.getDefault();

    populate(bundle.getEntry(getFileName(localisation)));
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage())));
    populate(bundle.getEntry(getFileName(localisation, locale.getLanguage(), locale.getCountry())));
    populate(bundle.getResource(getFileName("fragment")));
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage())));
    populate(bundle.getResource(getFileName("fragment", locale.getLanguage(), locale.getCountry())));
}

и просто назовите мое имя файла локализации фрагмента 'fragment.properties'.

Это не особенно изящно, но это работает.

Между прочим, для получения файлов от фрагмента, Вам нужен getResource, кажется, что файлы фрагмента находятся на пути к классу или только ищутся при использовании getResource.

Если у кого-то есть лучший подход, исправьте меня.

Всего наилучшего,

Mark.

3
ответ дан 7 December 2019 в 14:38
поделиться

Измените имя своего фрагмента plugin.properties к чему-то еще, например, fragment.properties

в Вашем фрагменте декларация изменяют Локализацию Пакета: плагин к Локализации Пакета: фрагмент

Ваш плагин будет активирован дважды, в первый раз с помощью plugin.properties, второе использование fragment.properties.

0
ответ дан 7 December 2019 в 14:38
поделиться

Сменная активация обрабатывается Равноденствием во время выполнения OSGi. Однако я сильно препятствовал бы попытке исправить любые файлы там для создания определенного поведения. Предложенный путь от Mark кажется намного более нормальным подходом к Вашей проблеме.

0
ответ дан 7 December 2019 в 14:38
поделиться
/**
 * The Hacked NLS (National Language Support) system.
 * <p>
 * Singleton.
 * 
 * @author mima
 */
public final class HackedNLS {
    private static final HackedNLS instance = new HackedNLS();

    private final Map<String, String> translations;

    private final Set<String> knownMissing;

    /**
     * Create the NLS singleton. 
     */
    private HackedNLS() {
        translations = new HashMap<String, String>();
        knownMissing = new HashSet<String>();
    }

    /**
     * Populates the NLS key/value pairs for the current locale.
     * <p>
     * Plugin localization files may have any name as long as it is declared in the Manifest under
     * the Bundle-Localization key.
     * <p>
     * Fragments <b>MUST</b> define their localization using the base name 'fragment'.
     * This is due to the fact that I have no access to the Bundle-Localization key for the
     * fragment.
     * This may change.
     * 
     * @param bundle The bundle to use for population.
     */
    public void populate(Bundle bundle) {
        String baseName = (String) bundle.getHeaders().get("Bundle-Localization");

        populate(getLocalizedEntry(baseName, bundle));
        populate(getLocalizedEntry("fragment", bundle));
    }

    private URL getLocalizedEntry(String baseName, Bundle bundle) {
        Locale locale = Locale.getDefault();
        URL entry = bundle.getEntry(getFileName(baseName, locale.getLanguage(), locale.getCountry()));
        if (entry == null) {
            entry = bundle.getResource(getFileName(baseName, locale.getLanguage(), locale.getCountry()));
        }
        if (entry == null) {
            entry = bundle.getEntry(getFileName(baseName, locale.getLanguage()));
        }
        if (entry == null) {
            entry = bundle.getResource(getFileName(baseName, locale.getLanguage()));
        }
        if (entry == null) {
            entry = bundle.getEntry(getFileName(baseName));
        }
        if (entry == null) {
            entry = bundle.getResource(getFileName(baseName));
        }
        return entry;
    }

    private String getFileName(String baseName, String...arguments) {
        String name = baseName;
        for (int index = 0; index < arguments.length; index++) {
            name += "_" + arguments[index];
        }
        return name + ".properties";
    }

    private void populate(URL resourceUrl) {
        if (resourceUrl != null) {
            Properties props = new Properties();
            InputStream stream = null;
            try {
                stream = resourceUrl.openStream();
                props.load(stream);
            } catch (IOException e) {
                warn("Could not open the resource file " + resourceUrl, e);
            } finally {
                try {
                    stream.close();
                } catch (IOException e) {
                    warn("Could not close stream for resource file " + resourceUrl, e);
                }
            }
            for (Object key : props.keySet()) {
                translations.put((String) key, (String) props.get(key));
            }
        }
    }

    /**
     * @param key The key to translate.
     * @param arguments Array of arguments to format into the translated text. May be empty.
     * @return The formatted translated string.
     */
    public String getTranslated(String key, Object...arguments) {
        String translation = translations.get(key);
        if (translation != null) {
            if (arguments != null) {
                translation = MessageFormat.format(translation, arguments);
            }
        } else {
            translation = "!! " + key;
            if (!knownMissing.contains(key)) {
                warn("Could not find any translation text for " + key, null);
                knownMissing.add(key);
            }
        }
        return translation;
    }

    private void warn(String string, Throwable cause) {
        Status status;
        if (cause == null) {
            status = new Status(
                    IStatus.ERROR, 
                    MiddlewareActivator.PLUGIN_ID, 
                    string);
        } else {
            status = new Status(
                IStatus.ERROR, 
                MiddlewareActivator.PLUGIN_ID, 
                string,
                cause);
        }
        MiddlewareActivator.getDefault().getLog().log(status);

    }

    /**
     * @return The NLS instance.
     */
    public static HackedNLS getInstance() {
        return instance;
    }

    /**
     * @param key The key to translate.
     * @param arguments Array of arguments to format into the translated text. May be empty.
     * @return The formatted translated string.
     */
    public static String getText(String key, Object...arguments) {
        return getInstance().getTranslated(key, arguments);
    }
}
1
ответ дан 7 December 2019 в 14:38
поделиться

Один из способов - подключить прослушиватель пакетов и прослушивать установки пакетов (и, возможно, также смотреть на уже установленные пакеты), а для каждого пакета генерировать / предоставлять - и устанавливать - фрагмент с требуемые файлы свойств. Если это будет сделано до запуска приложения, это должно иметь эффект.

0
ответ дан 7 December 2019 в 14:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: