1 29 30 package com.caucho.quercus.lib.gettext.expr; 31 32 import com.caucho.quercus.env.StringValue; 33 34 37 public class PluralExpr 38 { 39 private PluralExprParser _parser; 40 41 private Expr _npluralsExpr; 42 private Expr _pluralExpr; 43 44 private PluralExpr(CharSequence expr) 45 { 46 _parser = new PluralExprParser(expr); 47 } 48 49 private void init() 50 { 51 if (_parser != null) { 52 _npluralsExpr = _parser.getNpluralsExpr(); 53 _pluralExpr = _parser.getPluralExpr(); 54 _parser = null; 55 } 56 } 57 58 64 public static PluralExpr getPluralExpr(StringValue metaData) 65 { 66 String pluralForms = "Plural-Forms:"; 67 int i = metaData.indexOf(pluralForms); 68 69 if (i < 0) 70 return new PluralExpr("nplurals=2; plural=n!=1"); 71 72 i += pluralForms.length(); 73 int j = metaData.indexOf('\n', i); 74 75 if (j < 0) 76 return new PluralExpr(metaData.substring(i)); 77 else 78 return new PluralExpr(metaData.substring(i, j)); 79 } 80 81 87 public static int eval(CharSequence expr, int quantity) 88 { 89 return new PluralExpr(expr).eval(quantity); 90 } 91 92 95 public int eval(int quantity) 96 { 97 init(); 98 99 return validate(quantity); 100 } 101 102 105 private int validate(int quantity) 106 { 107 int pluralForm; 108 int numOfPlurals; 109 110 if (_pluralExpr == null) 111 pluralForm = -1; 112 else 113 pluralForm = _pluralExpr.eval(quantity); 114 115 if (_npluralsExpr == null) 116 numOfPlurals = -1; 117 else 118 numOfPlurals = _npluralsExpr.eval(quantity); 119 120 if (numOfPlurals < 1 || pluralForm < 0) 121 { 122 if (quantity == 1) 123 return 0; 124 else 125 return 1; 126 } 127 128 if (pluralForm >= numOfPlurals) 130 return 0; 131 132 return pluralForm; 133 } 134 } 135 | Popular Tags |