private ResourceBundle createUnicodeBundle(String baseName, Locale locale, String format, final ClassLoader loader,
                    final boolean reload) throws IllegalAccessException, InstantiationException, IOException {

            // The below is a copy of the default implementation.
            String bundleName = toBundleName(baseName, locale);
            ResourceBundle bundle = null;
            if ("java.class".equals(format)) {
                try {
                    @SuppressWarnings("unchecked")
                    Class<? extends ResourceBundle> bundleClass = (Class<? extends ResourceBundle>) loader.loadClass(bundleName);

                    // If the class isn't a ResourceBundle subclass, throw a ClassCastException.
                    if (!ResourceBundle.class.isAssignableFrom(bundleClass)) {
                        throw new ClassCastException(bundleClass.getName() + " cannot be cast to ResourceBundle");
                    }

                    bundle = bundleClass.getConstructor().newInstance();
                }
                catch (IllegalArgumentException | InvocationTargetException | SecurityException
                        | NoSuchMethodException | ClassNotFoundException e) {
                    // ignore for now
                }
            }
            else if ("java.properties".equals(format)) {
                String resourceName = toResourceName(bundleName, "properties");
                if (resourceName == null) {
                    return null;
                }

                try {
                    InputStream stream = null;
                    if (System.getSecurityManager() != null) {
                        stream = AccessController.doPrivileged((PrivilegedExceptionAction<InputStream>) () -> {
                            InputStream is = null;
                            if (reload) {
                                URL url = loader.getResource(resourceName);
                                if (url != null) {
                                    URLConnection connection = url.openConnection();
                                    if (connection != null) {
                                        connection.setUseCaches(false);
                                        is = connection.getInputStream();
                                    }
                                }
                            }
                            else {
                                is = loader.getResourceAsStream(resourceName);
                            }
                            return is;
                        });
                    }
                    else {
                        if (reload) {
                            URL url = loader.getResource(resourceName);
                            if (url != null) {
                                URLConnection connection = url.openConnection();
                                if (connection != null) {
                                    connection.setUseCaches(false);
                                    stream = connection.getInputStream();
                                }
                            }
                        }
                        else {
                            stream = loader.getResourceAsStream(resourceName);
                        }
                    }

                    if (stream != null) {
                        try (Reader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) {
                            // Only this line is changed to make it to read properties files as UTF-8.
                            bundle = new PropertyResourceBundle(reader);
                        }
                    }
                }
                catch (PrivilegedActionException e) {
                    throw (IOException) e.getException();
                }
            }
            else {
                throw new IllegalArgumentException("unknown format: " + format);
            }
            return bundle;
        }
For Java 8 we need to create bundle using UTF-8. This is standard in JDK9+.
primefaces/src/main/java/org/primefaces/util/MessageFactory.java