2222import ch .njol .skript .SkriptAddon ;
2323import ch .njol .skript .config .Config ;
2424import ch .njol .skript .util .ExceptionUtils ;
25+ import ch .njol .skript .util .FileUtils ;
2526import ch .njol .skript .util .Version ;
2627import org .bukkit .plugin .Plugin ;
2728import org .eclipse .jdt .annotation .Nullable ;
@@ -197,8 +198,8 @@ public static void loadDefault(SkriptAddon addon) {
197198 englishIs = null ;
198199 }
199200 }
200- HashMap <String , String > def = load (defaultIs , "default" );
201- HashMap <String , String > en = load (englishIs , "english" );
201+ HashMap <String , String > def = load (defaultIs , "default" , false );
202+ HashMap <String , String > en = load (englishIs , "english" , addon == Skript . getAddonInstance () );
202203
203204 String v = def .get ("version" );
204205 if (v == null )
@@ -220,9 +221,9 @@ public static boolean load(String name) {
220221 name = "" + name .toLowerCase (Locale .ENGLISH );
221222
222223 localizedLanguage = new HashMap <>();
223- boolean exists = load (Skript .getAddonInstance (), name );
224+ boolean exists = load (Skript .getAddonInstance (), name , true );
224225 for (SkriptAddon addon : Skript .getAddons ()) {
225- exists |= load (addon , name );
226+ exists |= load (addon , name , false );
226227 }
227228 if (!exists ) {
228229 if (name .equals ("english" )) {
@@ -241,18 +242,18 @@ public static boolean load(String name) {
241242 return true ;
242243 }
243244
244- private static boolean load (SkriptAddon addon , String name ) {
245+ private static boolean load (SkriptAddon addon , String name , boolean tryUpdate ) {
245246 if (addon .getLanguageFileDirectory () == null )
246247 return false ;
247248 // Backwards addon compatibility
248249 if (name .equals ("english" ) && addon .plugin .getResource (addon .getLanguageFileDirectory () + "/default.lang" ) == null )
249250 return true ;
250251
251- HashMap <String , String > l = load (addon .plugin .getResource (addon .getLanguageFileDirectory () + "/" + name + ".lang" ), name );
252+ HashMap <String , String > l = load (addon .plugin .getResource (addon .getLanguageFileDirectory () + "/" + name + ".lang" ), name , tryUpdate );
252253 File file = new File (addon .plugin .getDataFolder (), addon .getLanguageFileDirectory () + File .separator + name + ".lang" );
253254 try {
254255 if (file .exists ())
255- l .putAll (load (new FileInputStream (file ), name ));
256+ l .putAll (load (new FileInputStream (file ), name , tryUpdate ));
256257 } catch (FileNotFoundException e ) {
257258 assert false ;
258259 }
@@ -289,11 +290,38 @@ private static boolean load(SkriptAddon addon, String name) {
289290 return true ;
290291 }
291292
292- private static HashMap <String , String > load (@ Nullable InputStream in , String name ) {
293+ private static HashMap <String , String > load (@ Nullable InputStream in , String name , boolean tryUpdate ) {
293294 if (in == null )
294295 return new HashMap <>();
296+
295297 try {
296- return new Config (in , name + ".lang" , false , false , ":" ).toMap ("." );
298+ Config langConfig = new Config (in , name + ".lang" , false , false , ":" );
299+
300+ if (tryUpdate && !Skript .getVersion ().toString ().equals (langConfig .get ("version" ))) {
301+ String langFileName = "lang/" + name + ".lang" ;
302+
303+ InputStream newConfigIn = Skript .getInstance ().getResource (langFileName );
304+ if (newConfigIn == null ) {
305+ Skript .error ("The lang file '" + name + ".lang' is outdated, but Skript couldn't find the newest version of it in its jar." );
306+ return new HashMap <>();
307+ }
308+ Config newLangConfig = new Config (newConfigIn , "Skript.jar/" + langFileName , false , false , ":" );
309+ newConfigIn .close ();
310+
311+ File langFile = new File (Skript .getInstance ().getDataFolder (), langFileName );
312+ if (!newLangConfig .compareValues (langConfig , "version" )) {
313+ File langFileBackup = FileUtils .backup (langFile );
314+ newLangConfig .getMainNode ().set ("version" , Skript .getVersion ().toString ());
315+ langConfig = newLangConfig ;
316+ langConfig .save (langFile );
317+ Skript .info ("The lang file '" + name + ".lang' has been updated to the latest version. A backup of your old lang file has been created as " + langFileBackup .getName ());
318+ } else { // Only the version changed, don't bother creating a backup
319+ langConfig .getMainNode ().set ("version" , Skript .getVersion ().toString ());
320+ langConfig .save (langFile );
321+ }
322+ }
323+
324+ return langConfig .toMap ("." );
297325 } catch (IOException e ) {
298326 //noinspection ThrowableNotThrown
299327 Skript .exception (e , "Could not load the language file '" + name + ".lang': " + ExceptionUtils .toString (e ));
0 commit comments