diff --git a/build/common.targets b/build/common.targets index 05cfd8b5..8f21cd76 100644 --- a/build/common.targets +++ b/build/common.targets @@ -7,7 +7,7 @@ repo. It imports the other MSBuild files as needed. - 4.5.0 + 4.5.1 SMAPI latest $(AssemblySearchPaths);{GAC} diff --git a/build/scripts/prepare-install-package.ps1 b/build/scripts/prepare-install-package.ps1 index 45e27dec..8cd2c646 100644 --- a/build/scripts/prepare-install-package.ps1 +++ b/build/scripts/prepare-install-package.ps1 @@ -15,12 +15,12 @@ ########## $windowsOnly = $false # Windows-only build $skipBundleDeletion = $false # skip bundle deletion (only applies when using WSL to finalize the build on Windows) - foreach ($arg in $args) { - if ($arg -eq "--windows-only" -and $IsWindows) { - $windowsOnly = $true - } - elseif ($arg -eq "--skip-bundle-deletion") { - $skipBundleDeletion = $true +foreach ($arg in $args) { + if ($arg -eq "--windows-only" -and $IsWindows) { + $windowsOnly = $true + } + elseif ($arg -eq "--skip-bundle-deletion") { + $skipBundleDeletion = $true } } @@ -156,6 +156,7 @@ $installAssets = "src/SMAPI.Installer/assets" $packagePath = "bin/SMAPI installer" # init structure +Write-Host "Setting up structure..." foreach ($folder in $folders) { $folderPath = "$packagePath/internal/$folder/bundle/smapi-internal" @@ -256,22 +257,37 @@ foreach ($folder in $folders) { } # mark scripts executable +Write-Host "Setting file permissions..." if ($IsWindows) { Write-Warning "Can't set Unix file permissions on Windows. This may cause issues for Linux/macOS players." } else { - ForEach ($path in @("install on Linux.sh", "install on macOS.command", "bundle/unix-launcher.sh")) { + ForEach ($path in @("install on Linux.sh", "install on macOS.command", "internal/linux/bundle/unix-launcher.sh", "internal/macOS/bundle/unix-launcher.sh")) { if (Test-Path "$packagePath/$path" -PathType Leaf) { chmod 755 "$packagePath/$path" } + else { + Write-Host "Couldn't set permissions for '$packagePath/$path': file does not exist." + } } } # convert bundle folder into final 'install.dat' files +Write-Host "Tucking SMAPI bundle into install.dat..." foreach ($folder in $folders) { $path = "$packagePath/internal/$folder" - Compress-Archive -Path "$path/bundle/*" -CompressionLevel Optimal -DestinationPath "$path/install.dat" + if ($IsWindows) { + Compress-Archive -Path "$path/bundle/*" -CompressionLevel Optimal -DestinationPath "$path/install.dat" + } + else { + # Compress-Archive doesn't keep Unix permissions, so use zip directly on Linux/macOS + pushd "$path/bundle" > /dev/null + zip "install.dat" * --recurse-paths --quiet + popd > /dev/null + mv "$path/bundle/install.dat" "$path/install.dat" + } + if (!$skipBundleDeletion) { Remove-Item -Recurse -Force "$path/bundle" } @@ -281,9 +297,18 @@ foreach ($folder in $folders) { ########### ### Create release zips ########### +Write-Host "Creating release zip..." Move-Item "$packagePath" "bin/SMAPI $version installer" -Compress-Archive -Path "bin/SMAPI $version installer" -DestinationPath "bin/SMAPI-$version-installer.zip" -CompressionLevel Optimal +if ($IsWindows) { + Compress-Archive -Path "bin/SMAPI $version installer" -DestinationPath "bin/SMAPI-$version-installer.zip" -CompressionLevel Optimal +} +else { + # Compress-Archive doesn't keep Unix permissions, so use zip directly on Linux/macOS + pushd bin > /dev/null + zip -9 "SMAPI-$version-installer.zip" "SMAPI $version installer" --recurse-paths --quiet + popd > /dev/null +} Write-Output "" Write-Output "Done! Package created in ${pwd.Path}/bin." diff --git a/docs/README.md b/docs/README.md index f4245146..17d9dd87 100644 --- a/docs/README.md +++ b/docs/README.md @@ -68,7 +68,7 @@ Italian | ↻ [partly translated](../src/SMAPI/i18n/it.json) Japanese | ↻ [partly translated](../src/SMAPI/i18n/ja.json) Korean | ↻ [partly translated](../src/SMAPI/i18n/ko.json) [Polish] | ↻ [partly translated](../src/SMAPI/i18n/pl.json) -Portuguese | ↻ [partly translated](../src/SMAPI/i18n/pt.json) +Portuguese | ✓ [fully translated](../src/SMAPI/i18n/pt.json) Russian | ↻ [partly translated](../src/SMAPI/i18n/ru.json) Spanish | ↻ [partly translated](../src/SMAPI/i18n/es.json) [Thai] | ↻ [partly translated](../src/SMAPI/i18n/th.json) diff --git a/docs/release-notes.md b/docs/release-notes.md index 7f8bd5bd..d2b881fe 100644 --- a/docs/release-notes.md +++ b/docs/release-notes.md @@ -1,6 +1,13 @@ ← [README](README.md) # Release notes +## 4.5.1 +Released 25 January 2026 for Stardew Valley 1.6.14 or later. + +* For players: + * Fixed error installing SMAPI 4.5.0 on Linux/macOS. + * Improved translations. Thanks to Maatsuki (updated Portuguese)! + ## 4.5.0 Released 25 January 2026 for Stardew Valley 1.6.14 or later. See [release highlights](https://www.patreon.com/posts/149054246) and [build attestation](https://github.com/Pathoschild/SMAPI/attestations/17379361). diff --git a/src/SMAPI.Mods.ConsoleCommands/manifest.json b/src/SMAPI.Mods.ConsoleCommands/manifest.json index 9193514a..e66e2f11 100644 --- a/src/SMAPI.Mods.ConsoleCommands/manifest.json +++ b/src/SMAPI.Mods.ConsoleCommands/manifest.json @@ -1,9 +1,9 @@ { "Name": "Console Commands", "Author": "SMAPI", - "Version": "4.5.0", + "Version": "4.5.1", "Description": "Adds SMAPI console commands that let you manipulate the game.", "UniqueId": "SMAPI.ConsoleCommands", "EntryDll": "ConsoleCommands.dll", - "MinimumApiVersion": "4.5.0" + "MinimumApiVersion": "4.5.1" } diff --git a/src/SMAPI.Mods.SaveBackup/manifest.json b/src/SMAPI.Mods.SaveBackup/manifest.json index aa5d53a9..40436da4 100644 --- a/src/SMAPI.Mods.SaveBackup/manifest.json +++ b/src/SMAPI.Mods.SaveBackup/manifest.json @@ -1,9 +1,9 @@ { "Name": "Save Backup", "Author": "SMAPI", - "Version": "4.5.0", + "Version": "4.5.1", "Description": "Automatically backs up all your saves once per day into its folder.", "UniqueId": "SMAPI.SaveBackup", "EntryDll": "SaveBackup.dll", - "MinimumApiVersion": "4.5.0" + "MinimumApiVersion": "4.5.1" } diff --git a/src/SMAPI/Constants.cs b/src/SMAPI/Constants.cs index 21673fcc..eeb22a88 100644 --- a/src/SMAPI/Constants.cs +++ b/src/SMAPI/Constants.cs @@ -49,7 +49,7 @@ internal static class EarlyConstants internal static int? LogScreenId { get; set; } /// SMAPI's current raw semantic version. - internal static string RawApiVersion = "4.5.0"; + internal static string RawApiVersion = "4.5.1"; } /// Contains SMAPI's constants and assumptions. diff --git a/src/SMAPI/i18n/pt.json b/src/SMAPI/i18n/pt.json index dff8e0c7..e76dbf61 100644 --- a/src/SMAPI/i18n/pt.json +++ b/src/SMAPI/i18n/pt.json @@ -11,45 +11,44 @@ /********* ** Generic Mod Config Menu UI *********/ - // TODO // 'SMAPI features' section - "config.section.features": "SMAPI features", + "config.section.features": "Recursos do SMAPI", - "config.check-for-updates.name": "Check for updates", - "config.check-for-updates.desc": "Whether to automatically check for newer versions of SMAPI and mods when you load the game. If new versions are available, an alert will be shown in the console. This doesn't affect the load time even if your connection is offline or slow, because it happens in the background.", + "config.check-for-updates.name": "Verificar atualizações", + "config.check-for-updates.desc": "Define se o SMAPI deve verificar automaticamente por versões mais novas do SMAPI e dos mods ao iniciar o jogo. Se houver novas versões disponíveis, um alerta será exibido no console. Isso não afeta o tempo de carregamento, mesmo se sua conexão estiver offline ou lenta, pois acontece em segundo plano.", - "config.check-content-integrity.name": "Check content integrity", - "config.check-content-integrity.desc": "Whether SMAPI should check whether the game's content files are present and unmodified. This should nearly always be enabled. If disabled, SMAPI will log a warning for visibility when someone helps you troubleshoot game issues.", + "config.check-content-integrity.name": "Verificar integridade do conteúdo", + "config.check-content-integrity.desc": "Define se o SMAPI deve verificar se os arquivos de conteúdo do jogo estão presentes e sem modificações. Isso quase sempre deve ficar ativado. Se desativado, o SMAPI registrará um aviso para facilitar a identificação de problemas quando alguém estiver ajudando a solucionar erros do jogo.", - "config.read-console-input.name": "Read console input", - "config.read-console-input.desc": "Whether SMAPI should listen for console input. Disabling this will prevent you from using console commands. On some specific Linux systems, disabling this may reduce CPU usage.", + "config.read-console-input.name": "Ler entrada do console", + "config.read-console-input.desc": "Define se o SMAPI deve escutar comandos digitados no console. Desativar isso impedirá o uso de comandos do console. Em alguns sistemas Linux específicos, desativar essa opção pode reduzir o uso de CPU.", // 'Console window' section - "config.section.console-window": "Console window", + "config.section.console-window": "Janela do console", - "config.developer-mode.name": "Developer mode", - "config.developer-mode.desc": "Whether to show much more info in the SMAPI consoler window, intended for mod developers. Not recommended for most players.", + "config.developer-mode.name": "Modo desenvolvedor", + "config.developer-mode.desc": "Define se devem ser exibidas muito mais informações na janela do console do SMAPI, destinado a desenvolvedores de mods. Não recomendado para a maioria dos jogadores.", - "config.color-scheme.name": "Color scheme", - "config.color-scheme.desc": "The color scheme to apply to text in the SMAPI console window. This has no effect on the game, mods, or SMAPI log file.", - "config.color-scheme.options.AutoDetect": "Auto-detect", - "config.color-scheme.options.AutoDetect.on-windows": "Auto-detect (recommended)", - "config.color-scheme.options.DarkBackground": "Lighter text (for dark backgrounds)", - "config.color-scheme.options.LightBackground": "Darker text (for light backgrounds)", - "config.color-scheme.options.None": "No colors", + "config.color-scheme.name": "Esquema de cores", + "config.color-scheme.desc": "O esquema de cores aplicado ao texto na janela do console do SMAPI. Isso não afeta o jogo, os mods ou o arquivo de log do SMAPI.", + "config.color-scheme.options.AutoDetect": "Detecção automática", + "config.color-scheme.options.AutoDetect.on-windows": "Detecção automática (recomendado)", + "config.color-scheme.options.DarkBackground": "Texto mais claro (para fundos escuros)", + "config.color-scheme.options.LightBackground": "Texto mais escuro (para fundos claros)", + "config.color-scheme.options.None": "Sem cores", // 'Verbose logging' section - "config.section.verbose-logs": "Verbose logs", - "config.section.verbose-logs.explanation": "To help troubleshoot, SMAPI and many mods can send extra info to the SMAPI log (called 'verbose logging'). This may cause performance issues, and should usually be disabled.", + "config.section.verbose-logs": "Logs detalhados", + "config.section.verbose-logs.explanation": "Para ajudar na solução de problemas, o SMAPI e muitos mods podem enviar informações extras para o log do SMAPI (chamado de 'log detalhado'). Isso pode causar problemas de desempenho e geralmente deve permanecer desativado.", - "config.enable-for.name": "Enable for", - "config.enable-for.desc": "Choose which mods have verbose logging enabled.", - "config.enable-for.options.all": "All (not recommended)", - "config.enable-for.options.selected": "Mods selected below", + "config.enable-for.name": "Ativar para", + "config.enable-for.desc": "Escolha quais mods terão o log detalhado ativado.", + "config.enable-for.options.all": "Todos (não recomendado)", + "config.enable-for.options.selected": "Mods selecionados abaixo", "config.enable-for-smapi.name": "SMAPI", - "config.enable-for-smapi.desc": "Whether to enable verbose logs for SMAPI itself.", + "config.enable-for-smapi.desc": "Define se os logs detalhados devem ser ativados para o próprio SMAPI.", "config.enable-for-mod.name": "{{modName}}", - "config.enable-for-mod.desc": "Whether to enable verbose logs for the '{{modName}}' mod." + "config.enable-for-mod.desc": "Define se os logs detalhados devem ser ativados para o mod '{{modName}}'." }