public function translate($key, $package = 'default', $locale = '', $default = null)
    {
        // Normalize locale to current if the given is empty
        $defaultLocale = Locale::getDefault();
        $locale = $locale ?: Locale::get();
        $locale = $locale ?: $defaultLocale;

        // Get locale fallback
        $translation = null;
        $fallbackList = LocaleHelper::getLocaleFallbackList($locale, $defaultLocale);
        foreach ($fallbackList as $locale) {
            $translation = ($translation ?: $this->processor->get($key, $locale, $package, null));
            if (!is_null($translation)) {
                break;
            }
        }

        // Check final translation
        if (is_null($default) && $translation === $default) {
            throw new Exception('The translation for [' . $package . ']->[' . $key . '] is not found in any locale [' . implode(', ', $fallbackList) . '].');
        }

        return $translation ?: $default;
    }