Интернационализировавшие маркировки в JSF/Facelets

Я использую настраиваемое представление, которое я компоную поверх других, и просто рисует 4 маленьких перевернутых угла в том же цвете, что и фон.

Преимущества:

  • Не выделяет растровое изображение.
  • Работает независимо от вида, в который вы хотите применить закругленные углы.
  • ] Работает для всех уровней API;)

Код:

public class RoundedCornersView extends View {
    private float mRadius;
    private int mColor = Color.WHITE;
    private Paint mPaint;
    private Path mPath;

    public RoundedCornersView(Context context) {
        super(context);
        init();
    }

    public RoundedCornersView(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();

        TypedArray a = context.getTheme().obtainStyledAttributes(
                attrs,
                R.styleable.RoundedCornersView,
                0, 0);

        try {
            setRadius(a.getDimension(R.styleable.RoundedCornersView_radius, 0));
            setColor(a.getColor(R.styleable.RoundedCornersView_cornersColor, Color.WHITE));
        } finally {
            a.recycle();
        }
    }

    private void init() {
        setColor(mColor);
        setRadius(mRadius);
    }

    private void setColor(int color) {
        mColor = color;
        mPaint = new Paint();
        mPaint.setColor(mColor);
        mPaint.setStyle(Paint.Style.FILL);
        mPaint.setAntiAlias(true);

        invalidate();
    }

    private void setRadius(float radius) {
        mRadius = radius;
        RectF r = new RectF(0, 0, 2 * mRadius, 2 * mRadius);
        mPath = new Path();
        mPath.moveTo(0,0);
        mPath.lineTo(0, mRadius);
        mPath.arcTo(r, 180, 90);
        mPath.lineTo(0,0);
        invalidate();
    }

    @Override
    protected void onDraw(Canvas canvas) {

        /*This just draws 4 little inverted corners */

        int w = getWidth();
        int h = getHeight();
        canvas.drawPath(mPath, mPaint);
        canvas.save();
        canvas.translate(w, 0);
        canvas.rotate(90);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.save();
        canvas.translate(w, h);
        canvas.rotate(180);
        canvas.drawPath(mPath, mPaint);
        canvas.restore();
        canvas.translate(0, h);
        canvas.rotate(270);
        canvas.drawPath(mPath, mPaint);
    }
}
5
задан Peter Hilton 19 September 2008 в 08:40
поделиться

6 ответов

Вы могли создать свою собственную библиотеку тегов поверхностей для создания этого менее подробным, что-то как:

<ph:i18n key="label.widget.count" p0="#{widgetCount}"/>

Затем создайте taglib в своем dir представления: /components/ph.taglib.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE facelet-taglib PUBLIC "-//Sun Microsystems, Inc.//DTD Facelet Taglib 1.0//EN" "https://facelets.dev.java.net/source/browse/*checkout*/facelets/src/etc/facelet-taglib_1_0.dtd">

<facelet-taglib xmlns="http://java.sun.com/JSF/Facelet">
    <namespace>http://peterhilton.com/core</namespace>

    <tag>
        <tag-name>i18n</tag-name>
        <source>i18n.xhtml</source>
    </tag>

</facelet-taglib>

создайте/components/i18n.xhtml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
    xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:h="http://java.sun.com/jsf/html"        
    xmlns:f="http://java.sun.com/jsf/core">

    <h:outputFormat value="#{messages[key]}">
            <!-- crude but it works -->
        <f:param value="#{p0}" />
        <f:param value="#{p1}" />
        <f:param value="#{p2}" />
        <f:param value="#{p3}" />
    </h:outputFormat>

</ui:composition>

Можно, вероятно, найти изящный способ передать споры с небольшим исследованием.

Теперь зарегистрируйте свой новый taglib в web.xml

<context-param>
<param-name>facelets.LIBRARIES</param-name>
<param-value>
        /components/ph.taglib.xml
    </param-value>
</context-param>

Просто добавьте xmlns:ph="http://peterhilton.com/core" к Вашим представлениям и Вы все установлены!

3
ответ дан 18 December 2019 в 09:55
поделиться

Я думал об этом больше, и мне приходит в голову, что я мог, вероятно, записать свою собственную функцию JSTL, которая берет клавишу сообщения и переменное количество параметров:

<h:outputText value="#{my:message('label.widget.count', widgetCount)}"/>

и если бы моя функция сообщения, HTML - кодирует результат, прежде чем произведено, я не должен был бы даже использовать h:outputText

#{my:message('label.widget.count', widgetCount)}
3
ответ дан 18 December 2019 в 09:55
поделиться

Я никогда не сталкивался с другим способом сделать его кроме outputFormat. Это является, к сожалению, довольно подробным.

Единственная другая вещь, которую я могу предложить, создает сообщение в отступающем бобе и затем производит это, а не messageFormat.

В моем случае мне интегрировали MessageSource Spring с JSF (использующий MessageSourcePropertyResolver). Затем довольно легко в Ваших бобах поддержки получить параметризованные сообщения - просто необходимо знать, в какой Локали пользователь находится (снова, мне связали Локаль с отступающим свойством компонента, таким образом, это доступно через JSF или Java).

Я думаю, что параметры - конкретный в сообщениях - являются одной вещью, JSF мог действительно добиться большего успеха!

3
ответ дан 18 December 2019 в 09:55
поделиться

Так как Вы используете Шов, можно использовать EL в файле сообщений.

Свойство:

label.widget.count = You have a total of #{widgetCount} widgets.

XHTML:

<h:outputFormat value="#{messages['label.widget.count']}" />

Это все еще использует outputFormat, но является менее подробным.

5
ответ дан 18 December 2019 в 09:55
поделиться

Можно использовать Интерполятор Шва:

<h:outputText value="#{interpolator.interpolate(messages['label.widget.count'], widgetCount)}"/>

Это имеет @BypassInterceptors на нем так, производительность должна быть в порядке.

3
ответ дан 18 December 2019 в 09:55
поделиться

Используйте ResourceBundle и файлы свойств.

-1
ответ дан 18 December 2019 в 09:55
поделиться
Другие вопросы по тегам:

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