items_cache_key)) { $this->refreshItemsCache(); } else $this->items = Cache::get($this->items_cache_key); if (!Cache::has($this->locales_cache_key)) { $this->refreshLocalesCache(); } else $this->locales = Cache::get($this->locales_cache_key); } public function refreshLocalesCache(): void { $this->locales = collect(); $raw_locales_global_base_url = GiteaConfig::RAW_LOCALES_GLOBAL_BASE_URL; // Getting all locales in project/assets/database/locales/global from the Server development branch repository $locales_list = collect(json_decode(file_get_contents(GiteaConfig::LOCALES_GLOBAL_URL), true)); foreach($locales_list as $item) { // Extract the json name for the locale preg_match('/([a-z]{2}(-[a-z]{2})?).json/', $item['name'], $current_locale_name, PREG_OFFSET_CAPTURE); // If the name is not supported for any reason, dont add it to the locales if (empty($current_locale_name) || !$current_locale_name[1][0]) continue; $trimmed_current_locale_name = trim($current_locale_name[1][0]); $test = collect([$trimmed_current_locale_name => json_decode(file_get_contents("${raw_locales_global_base_url}/${trimmed_current_locale_name}.json"), true)['templates']]); $this->locales = $this->locales->merge($test); } Cache::set($this->locales_cache_key, $this->locales); } public function refreshItemsCache(): void { $this->items = collect(json_decode(file_get_contents(GiteaConfig::RAW_ITEMS_URL), true)); Cache::put($this->items_cache_key, $this->items); } public function refreshAllCache(): void { $this->refreshItemsCache(); $this->refreshLocalesCache(); } /** * @param string $query the content of the query eg. 'AK' * @param string $locale the chosen local. Default to 'en' * @return Collection */ public function findItem(string $query, string $locale = 'en'): Collection { return $this->items->filter(function ($val, $key) use ($query, $locale) { $query = Str::lower($query); return Str::contains($val['_id'], $query) || Str::contains($val['_name'], $query) || Str::contains($val['_parent'], $query) || (($this->locales[$locale][$key] ?? false) && $this->locales[$locale][$key]['Name'] && Str::contains(Str::lower($this->locale[$locale][$key]['Name']), $query) && Str::contains(Str::lower($this->locale[$locale][$key]['ShortName']), $query)); })->map(function ($item) use ($locale) { return [ '_id' => $item['_id'], '_name' => $item['_name'], 'locale' => $this->locales[$locale][$item['_id']] ?? '' ]; })->values(); } /** * @param string $id the item ID to look for * @param string $locale the chosen local. Default to 'en' * @return array * @throws ItemNotFoundException */ public function getItemById(string $id, string $locale = 'en'): array { $item = $this->items[$id] ?? throw new ItemNotFoundException('Item not found'); return [ 'item' => $item, 'locale' => $this->locales[$locale][$id] ?? '' ]; } }