// © 2016 and later: Unicode, Inc. and others.
// License & terms of use: http://www.unicode.org/copyright.html#License
/*
 *******************************************************************************
 * Copyright (C) 2013-2014, International Business Machines Corporation and    *
 * others. All Rights Reserved.                                                *
 *******************************************************************************
 */
package com.ibm.icu.samples.text.pluralformat;
// ---PluralFormatExample
import java.text.FieldPosition;

import com.ibm.icu.text.MessageFormat;
import com.ibm.icu.text.PluralFormat;
import com.ibm.icu.util.ULocale;
// ---PluralFormatExample

public class PluralFormatSample {

  public static void main(String[] args) {
      PluralFormatExample();
      }

  private static void PluralFormatExample(){

      System.out.println("=======================================================================================");
      System.out.println(" PluralFormatExample()");
      System.out.println();
      System.out.println(" Use PluralFormat and Messageformat to get appropriate Plural Form for languages below:");
      System.out.println(" English, Slovenian");
      System.out.println("=======================================================================================");
      // ---PluralFormatExample
      ULocale locEn = new ULocale("en");
      ULocale locSl = new ULocale("sl");

      String patEn = "one{dog} other{dogs}";                      // English 'dog'
      String patSl = "one{pes} two{psa} few{psi} other{psov}";    // Slovenian translation of dog in Plural Form

      // Create a new PluralFormat for a given locale locale and pattern string
      PluralFormat plfmtEn = new PluralFormat(locEn, patEn);
      PluralFormat plfmtSl = new PluralFormat(locSl, patSl);
      // Constructs a MessageFormat for the specified locale and pattern.
      MessageFormat msgfmtEn = new MessageFormat("{0,number} {1}", locEn);
      MessageFormat msgfmtSl = new MessageFormat("{0,number} {1}", locSl);

      final int[] numbers = {0, 1, 2, 3, 4, 5, 10, 100, 101, 102};
      System.out.println("Output by using PluralFormat and MessageFormat API\n");
      System.out.printf("%-16s%-16s%-16s\n", "Number", "English", "Slovenian");
 
      // Use MessageFormat.format () to format the objects and appends to the given StringBuffer
      for (int num : numbers) {
          StringBuffer msgEn = new StringBuffer();
          StringBuffer msgSl = new StringBuffer();

          msgfmtEn.format(new Object[] {num, plfmtEn.format(num)}, msgEn, new FieldPosition(0));
          msgfmtSl.format(new Object[] {num, plfmtSl.format(num)}, msgSl, new FieldPosition(0));

          System.out.printf("%-16s%-16s%-16s\n", num, msgEn, msgSl);
      }

      System.out.println();

      // Equivalent code with message format pattern
      String msgPatEn = "{0,plural, one{# dog} other{# dogs}}";
      String msgPatSl = "{0,plural, one{# pes} two{# psa} few{# psi} other{# psov}}";
 
      MessageFormat altMsgfmtEn = new MessageFormat(msgPatEn, locEn);
      MessageFormat altMsgfmtSl = new MessageFormat(msgPatSl, locSl);
      System.out.println("Same Output by using MessageFormat API only\n");
      System.out.printf("%-16s%-16s%-16s\n", "Number", "English", "Slovenian");
      for (int num : numbers) {
          StringBuffer msgEn = new StringBuffer();
          StringBuffer msgSl = new StringBuffer();

          altMsgfmtEn.format(new Object[] {num}, msgEn, new FieldPosition(0));
          altMsgfmtSl.format(new Object[] {num}, msgSl, new FieldPosition(0));

          System.out.printf("%-16s%-16s%-16s\n", num, msgEn, msgSl);
      }
      /** output of the sample code:
       ********************************************************************
        Number          English         Slovenian
        0               0 dogs          0 psov
        1               1 dog           1 pes
        2               2 dogs          2 psa
        3               3 dogs          3 psi
        4               4 dogs          4 psi
        5               5 dogs          5 psov
        10              10 dogs         10 psov
        100             100 dogs        100 psov
        101             101 dogs        101 pes
        102             102 dogs        102 psa

       *******************************************************************/
      // ---PluralFormatExample
  }
}
