...

Source file src/github.com/chai2010/gettext-go/plural/formula.go

Documentation: github.com/chai2010/gettext-go/plural

     1  // Copyright 2013 ChaiShushan <chaishushan{AT}gmail.com>. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package plural
     6  
     7  import (
     8  	"strings"
     9  )
    10  
    11  // Formula provides the language's standard plural formula.
    12  func Formula(lang string) func(n int) int {
    13  	if idx := index(lang); idx != -1 {
    14  		return formulaTable[fmtForms(FormsTable[idx].Value)]
    15  	}
    16  	if idx := index("??"); idx != -1 {
    17  		return formulaTable[fmtForms(FormsTable[idx].Value)]
    18  	}
    19  	return func(n int) int {
    20  		return n
    21  	}
    22  }
    23  
    24  func index(lang string) int {
    25  	for i := 0; i < len(FormsTable); i++ {
    26  		if strings.HasPrefix(lang, FormsTable[i].Lang) {
    27  			return i
    28  		}
    29  	}
    30  	return -1
    31  }
    32  
    33  func fmtForms(forms string) string {
    34  	forms = strings.TrimSpace(forms)
    35  	forms = strings.Replace(forms, " ", "", -1)
    36  	return forms
    37  }
    38  
    39  var formulaTable = map[string]func(n int) int{
    40  	fmtForms("nplurals=n; plural=n-1;"): func(n int) int {
    41  		if n > 0 {
    42  			return n - 1
    43  		}
    44  		return 0
    45  	},
    46  	fmtForms("nplurals=1; plural=0;"): func(n int) int {
    47  		return 0
    48  	},
    49  	fmtForms("nplurals=2; plural=(n != 1);"): func(n int) int {
    50  		if n <= 1 {
    51  			return 0
    52  		}
    53  		return 1
    54  	},
    55  	fmtForms("nplurals=2; plural=(n > 1);"): func(n int) int {
    56  		if n <= 1 {
    57  			return 0
    58  		}
    59  		return 1
    60  	},
    61  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n != 0 ? 1 : 2);"): func(n int) int {
    62  		if n%10 == 1 && n%100 != 11 {
    63  			return 0
    64  		}
    65  		if n != 0 {
    66  			return 1
    67  		}
    68  		return 2
    69  	},
    70  	fmtForms("nplurals=3; plural=n==1 ? 0 : n==2 ? 1 : 2;"): func(n int) int {
    71  		if n == 1 {
    72  			return 0
    73  		}
    74  		if n == 2 {
    75  			return 1
    76  		}
    77  		return 2
    78  	},
    79  	fmtForms("nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < 20)) ? 1 : 2;"): func(n int) int {
    80  		if n == 1 {
    81  			return 0
    82  		}
    83  		if n == 0 || (n%100 > 0 && n%100 < 20) {
    84  			return 1
    85  		}
    86  		return 2
    87  	},
    88  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
    89  		if n%10 == 1 && n%100 != 11 {
    90  			return 0
    91  		}
    92  		if n%10 >= 2 && (n%100 < 10 || n%100 >= 20) {
    93  			return 1
    94  		}
    95  		return 2
    96  	},
    97  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
    98  		if n%10 == 1 && n%100 != 11 {
    99  			return 0
   100  		}
   101  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   102  			return 1
   103  		}
   104  		return 2
   105  	},
   106  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
   107  		if n%10 == 1 && n%100 != 11 {
   108  			return 0
   109  		}
   110  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   111  			return 1
   112  		}
   113  		return 2
   114  	},
   115  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
   116  		if n%10 == 1 && n%100 != 11 {
   117  			return 0
   118  		}
   119  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   120  			return 1
   121  		}
   122  		return 2
   123  	},
   124  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
   125  		if n%10 == 1 && n%100 != 11 {
   126  			return 0
   127  		}
   128  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   129  			return 1
   130  		}
   131  		return 2
   132  	},
   133  	fmtForms("nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
   134  		if n%10 == 1 && n%100 != 11 {
   135  			return 0
   136  		}
   137  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   138  			return 1
   139  		}
   140  		return 2
   141  	},
   142  	fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
   143  		if n == 1 {
   144  			return 0
   145  		}
   146  		if n >= 2 && n <= 4 {
   147  			return 1
   148  		}
   149  		return 2
   150  	},
   151  	fmtForms("nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;"): func(n int) int {
   152  		if n == 1 {
   153  			return 0
   154  		}
   155  		if n >= 2 && n <= 4 {
   156  			return 1
   157  		}
   158  		return 2
   159  	},
   160  	fmtForms("nplurals=3; plural=(n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);"): func(n int) int {
   161  		if n == 1 {
   162  			return 0
   163  		}
   164  		if n%10 >= 2 && n%10 <= 4 && (n%100 < 10 || n%100 >= 20) {
   165  			return 1
   166  		}
   167  		return 2
   168  	},
   169  	fmtForms("nplurals=4; plural=(n%100==1 ? 0 : n%100==2 ? 1 : n%100==3 || n%100==4 ? 2 : 3);"): func(n int) int {
   170  		if n%100 == 1 {
   171  			return 0
   172  		}
   173  		if n%100 == 2 {
   174  			return 1
   175  		}
   176  		if n%100 == 3 || n%100 == 4 {
   177  			return 2
   178  		}
   179  		return 3
   180  	},
   181  }
   182  

View as plain text